Skip to main content

playwright_cdp/
request.rs

1//! `Request` — an HTTP request observed via the CDP `Network` domain.
2
3use crate::error::Result;
4use crate::network::NetworkStore;
5use crate::response::Response;
6use crate::types::Headers;
7use std::sync::{Arc, Weak};
8
9/// An HTTP request captured for a page.
10#[derive(Clone)]
11pub struct Request {
12    inner: Arc<RequestInner>,
13}
14
15struct RequestInner {
16    url: String,
17    method: String,
18    headers: Headers,
19    resource_type: String,
20    request_id: String,
21    is_navigation: bool,
22    store: Weak<NetworkStore>,
23}
24
25impl Request {
26    pub(crate) fn new(
27        url: String,
28        method: String,
29        headers: Headers,
30        resource_type: String,
31        request_id: String,
32        is_navigation: bool,
33        store: Weak<NetworkStore>,
34    ) -> Self {
35        Self {
36            inner: Arc::new(RequestInner {
37                url,
38                method,
39                headers,
40                resource_type,
41                request_id,
42                is_navigation,
43                store,
44            }),
45        }
46    }
47
48    pub fn url(&self) -> &str {
49        &self.inner.url
50    }
51
52    pub fn method(&self) -> &str {
53        &self.inner.method
54    }
55
56    pub fn headers(&self) -> &Headers {
57        &self.inner.headers
58    }
59
60    pub fn resource_type(&self) -> &str {
61        &self.inner.resource_type
62    }
63
64    pub fn is_navigation_request(&self) -> bool {
65        self.inner.is_navigation
66    }
67
68    /// The response to this request, if it has arrived yet.
69    pub async fn response(&self) -> Result<Option<Response>> {
70        Ok(self
71            .inner
72            .store
73            .upgrade()
74            .and_then(|s| s.get_response(&self.inner.request_id)))
75    }
76}