playwright_cdp/
request.rs1use crate::error::{Error, Result};
4use crate::network::{NetworkStore, Sizes, Timing};
5use crate::response::Response;
6use crate::types::Headers;
7use serde::de::DeserializeOwned;
8use std::sync::{Arc, Weak};
9
10#[derive(Clone)]
12pub struct Request {
13 inner: Arc<RequestInner>,
14}
15
16struct RequestInner {
17 url: String,
18 method: String,
19 headers: Headers,
20 resource_type: String,
21 request_id: String,
22 is_navigation: bool,
23 store: Weak<NetworkStore>,
24}
25
26impl Request {
27 pub(crate) fn new(
28 url: String,
29 method: String,
30 headers: Headers,
31 resource_type: String,
32 request_id: String,
33 is_navigation: bool,
34 store: Weak<NetworkStore>,
35 ) -> Self {
36 Self {
37 inner: Arc::new(RequestInner {
38 url,
39 method,
40 headers,
41 resource_type,
42 request_id,
43 is_navigation,
44 store,
45 }),
46 }
47 }
48
49 pub fn url(&self) -> &str {
50 &self.inner.url
51 }
52
53 pub fn method(&self) -> &str {
54 &self.inner.method
55 }
56
57 pub fn headers(&self) -> &Headers {
58 &self.inner.headers
59 }
60
61 pub fn resource_type(&self) -> &str {
62 &self.inner.resource_type
63 }
64
65 pub fn is_navigation_request(&self) -> bool {
66 self.inner.is_navigation
67 }
68
69 pub fn request_id(&self) -> &str {
71 &self.inner.request_id
72 }
73
74 fn store(&self) -> Option<Arc<NetworkStore>> {
75 self.inner.store.upgrade()
76 }
77
78 pub(crate) fn store_weak(&self) -> Option<Arc<NetworkStore>> {
80 self.inner.store.upgrade()
81 }
82
83 pub async fn response(&self) -> Result<Option<Response>> {
85 Ok(self
86 .store()
87 .and_then(|s| s.get_response(&self.inner.request_id)))
88 }
89
90 pub fn post_data(&self) -> Option<String> {
92 self.store()
93 .and_then(|s| s.post_data(&self.inner.request_id))
94 }
95
96 pub fn post_data_buffer(&self) -> Option<Vec<u8>> {
98 self.post_data().map(|s| s.into_bytes())
99 }
100
101 pub fn post_data_json<T: DeserializeOwned>(&self) -> Option<Result<T>> {
104 let data = self.post_data()?;
105 Some(serde_json::from_str(&data).map_err(Error::from))
106 }
107
108 pub fn redirected_from(&self) -> Option<Request> {
111 let store = self.store()?;
112 let prev_id = store.redirect_source(&self.inner.request_id)?;
113 store.get_request(&prev_id)
114 }
115
116 pub fn redirected_to(&self) -> Option<Request> {
119 let store = self.store()?;
120 let next_id = store.redirect_target(&self.inner.request_id)?;
121 store.get_request(&next_id)
122 }
123
124 pub fn failure(&self) -> Option<String> {
127 self.store()
128 .and_then(|s| s.failure(&self.inner.request_id))
129 }
130
131 pub fn timing(&self) -> Option<Timing> {
133 self.store()
134 .and_then(|s| s.timing(&self.inner.request_id))
135 }
136
137 pub fn sizes(&self) -> Option<Sizes> {
139 self.store()
140 .and_then(|s| s.sizes(&self.inner.request_id))
141 }
142
143 pub fn all_headers(&self) -> Headers {
146 self.store()
147 .and_then(|s| s.raw_request_headers(&self.inner.request_id))
148 .unwrap_or_else(|| self.inner.headers.clone())
149 }
150
151 pub fn frame(&self) -> Option<crate::frame::Frame> {
156 None
157 }
158}