playwright/imp/
response.rs1use 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}