playwright/imp/
response.rs

1use crate::imp::{
2    core::*,
3    prelude::*,
4    request::Request,
5    utils::{Header, ResponseTiming}
6};
7
8#[derive(Debug)]
9pub(crate) struct Response {
10    channel: ChannelOwner,
11    url: String,
12    status: i32,
13    status_text: String,
14    request: Weak<Request>
15}
16
17impl Response {
18    pub(crate) fn try_new(ctx: &Context, channel: ChannelOwner) -> Result<Self, Error> {
19        let Initializer {
20            url,
21            status,
22            status_text,
23            request,
24            timing
25        } = serde_json::from_value(channel.initializer.clone())?;
26        let request = get_object!(ctx, &request.guid, Request)?;
27        upgrade(&request)?.set_response_timing(timing);
28        Ok(Self {
29            channel,
30            url,
31            status,
32            status_text,
33            request
34        })
35    }
36
37    pub(crate) fn url(&self) -> &str { &self.url }
38    pub(crate) fn status(&self) -> i32 { self.status }
39    pub(crate) fn status_text(&self) -> &str { &self.status_text }
40
41    pub(crate) fn ok(&self) -> bool { self.status == 0 || (200..300).contains(&self.status) }
42
43    pub(crate) async fn finished(&self) -> ArcResult<Option<String>> {
44        let v = send_message!(self, "finished", Map::new());
45        let s = maybe_only_str(&v)?;
46        Ok(s.map(ToOwned::to_owned))
47    }
48
49    pub(crate) async fn body(&self) -> ArcResult<Vec<u8>> {
50        let v = send_message!(self, "body", Map::new());
51        let s = only_str(&v)?;
52        let bytes = base64::decode(s).map_err(Error::InvalidBase64)?;
53        Ok(bytes)
54    }
55
56    pub(crate) async fn text(&self) -> ArcResult<String> {
57        Ok(String::from_utf8(self.body().await?).map_err(Error::InvalidUtf8)?)
58    }
59
60    pub(crate) fn request(&self) -> Weak<Request> { self.request.clone() }
61
62    pub(crate) async fn headers(&self) -> ArcResult<Vec<Header>> {
63        let v = send_message!(self, "body", Map::new());
64        let first = first(&v).ok_or(Error::InvalidParams)?;
65        let mut headers: Vec<Header> =
66            serde_json::from_value((*first).clone()).map_err(Error::Serde)?;
67        for h in headers.iter_mut() {
68            h.name.make_ascii_lowercase();
69        }
70        Ok(headers)
71    }
72}
73
74impl RemoteObject for Response {
75    fn channel(&self) -> &ChannelOwner { &self.channel }
76    fn channel_mut(&mut self) -> &mut ChannelOwner { &mut self.channel }
77}
78
79#[derive(Debug, Deserialize)]
80#[serde(rename_all = "camelCase")]
81struct Initializer {
82    url: String,
83    status: i32,
84    status_text: String,
85    request: OnlyGuid,
86    timing: ResponseTiming
87}