1 package playwright
2
3 import (
4 "encoding/base64"
5 "encoding/json"
6 )
7
8 type responseImpl struct {
9 channelOwner
10 request *requestImpl
11 provisionalHeaders *rawHeaders
12 rawHeaders *rawHeaders
13 finished chan bool
14 }
15
16 func (r *responseImpl) URL() string {
17 return r.initializer["url"].(string)
18 }
19
20 func (r *responseImpl) Ok() bool {
21 return r.Status() == 0 || (r.Status() >= 200 && r.Status() <= 299)
22 }
23
24 func (r *responseImpl) Status() int {
25 return int(r.initializer["status"].(float64))
26 }
27
28 func (r *responseImpl) StatusText() string {
29 return r.initializer["statusText"].(string)
30 }
31
32 func (r *responseImpl) Headers() map[string]string {
33 return r.provisionalHeaders.Headers()
34 }
35
36 func (r *responseImpl) Finished() {
37 <-r.finished
38 }
39
40 func (r *responseImpl) Body() ([]byte, error) {
41 b64Body, err := r.channel.Send("body")
42 if err != nil {
43 return nil, err
44 }
45 return base64.StdEncoding.DecodeString(b64Body.(string))
46 }
47
48 func (r *responseImpl) Text() (string, error) {
49 body, err := r.Body()
50 if err != nil {
51 return "", err
52 }
53 return string(body), nil
54 }
55
56 func (r *responseImpl) JSON(v interface{}) error {
57 body, err := r.Body()
58 if err != nil {
59 return err
60 }
61 return json.Unmarshal(body, v)
62 }
63
64 func (r *responseImpl) Request() Request {
65 return r.request
66 }
67
68 func (r *responseImpl) Frame() Frame {
69 return r.request.Frame()
70 }
71
72 func (r *responseImpl) AllHeaders() (map[string]string, error) {
73 headers, err := r.ActualHeaders()
74 if err != nil {
75 return nil, err
76 }
77 return headers.Headers(), nil
78 }
79 func (r *responseImpl) HeadersArray() (HeadersArray, error) {
80 headers, err := r.ActualHeaders()
81 if err != nil {
82 return nil, err
83 }
84 return headers.HeadersArray(), nil
85 }
86 func (r *responseImpl) HeaderValue(name string) (string, error) {
87 headers, err := r.ActualHeaders()
88 if err != nil {
89 return "", err
90 }
91 return headers.Get(name), err
92 }
93 func (r *responseImpl) HeaderValues(name string) ([]string, error) {
94 headers, err := r.ActualHeaders()
95 if err != nil {
96 return []string{}, err
97 }
98 return headers.GetAll(name), err
99 }
100 func (r *responseImpl) ActualHeaders() (*rawHeaders, error) {
101 if r.rawHeaders == nil {
102 headers, err := r.channel.Send("rawResponseHeaders")
103 if err != nil {
104 return nil, err
105 }
106 r.rawHeaders = newRawHeaders(headers)
107 }
108 return r.rawHeaders, nil
109 }
110
111 func (r *responseImpl) SecurityDetails() (*ResponseSecurityDetailsResult, error) {
112 details, err := r.channel.Send("securityDetails")
113 if err != nil {
114 return nil, err
115 }
116 result := &ResponseSecurityDetailsResult{}
117 remapMapToStruct(details.(map[string]interface{}), result)
118 return result, nil
119 }
120
121 func (r *responseImpl) ServerAddr() (*ResponseServerAddrResult, error) {
122 addr, err := r.channel.Send("serverAddr")
123 if err != nil {
124 return nil, err
125 }
126 result := &ResponseServerAddrResult{}
127 remapMapToStruct(addr, result)
128 return result, nil
129 }
130
131 func newResponse(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *responseImpl {
132 resp := &responseImpl{}
133 resp.createChannelOwner(resp, parent, objectType, guid, initializer)
134 timing := resp.initializer["timing"].(map[string]interface{})
135 resp.request = fromChannel(resp.initializer["request"]).(*requestImpl)
136 resp.request.timing = &ResourceTiming{
137 StartTime: timing["startTime"].(float64),
138 DomainLookupStart: timing["domainLookupStart"].(float64),
139 DomainLookupEnd: timing["domainLookupEnd"].(float64),
140 ConnectStart: timing["connectStart"].(float64),
141 SecureConnectionStart: timing["secureConnectionStart"].(float64),
142 ConnectEnd: timing["connectEnd"].(float64),
143 RequestStart: timing["requestStart"].(float64),
144 ResponseStart: timing["responseStart"].(float64),
145 }
146 resp.provisionalHeaders = newRawHeaders(resp.initializer["headers"])
147 resp.finished = make(chan bool, 1)
148 return resp
149 }
150
View as plain text