1 package playwright
2
3 import (
4 "encoding/base64"
5 "encoding/json"
6 )
7
8
9 type RequestFailure struct {
10 ErrorText string
11 }
12
13
14 type ResourceTiming struct {
15 StartTime float64
16 DomainLookupStart float64
17 DomainLookupEnd float64
18 ConnectStart float64
19 SecureConnectionStart float64
20 ConnectEnd float64
21 RequestStart float64
22 ResponseStart float64
23 ResponseEnd float64
24 }
25
26 type requestImpl struct {
27 channelOwner
28 timing *ResourceTiming
29 provisionalHeaders *rawHeaders
30 allHeaders *rawHeaders
31 redirectedFrom Request
32 redirectedTo Request
33 failureText string
34 }
35
36 func (r *requestImpl) URL() string {
37 return r.initializer["url"].(string)
38 }
39
40 func (r *requestImpl) ResourceType() string {
41 return r.initializer["resourceType"].(string)
42 }
43
44 func (r *requestImpl) Method() string {
45 return r.initializer["method"].(string)
46 }
47
48 func (r *requestImpl) PostData() (string, error) {
49 body, err := r.PostDataBuffer()
50 if err != nil {
51 return "", err
52 }
53 return string(body), err
54 }
55
56 func (r *requestImpl) PostDataJSON(v interface{}) error {
57 body, err := r.PostDataBuffer()
58 if err != nil {
59 return err
60 }
61 return json.Unmarshal(body, v)
62 }
63
64 func (r *requestImpl) PostDataBuffer() ([]byte, error) {
65 if _, ok := r.initializer["postData"]; !ok {
66 return nil, nil
67 }
68 return base64.StdEncoding.DecodeString(r.initializer["postData"].(string))
69 }
70
71 func (r *requestImpl) Headers() map[string]string {
72 return r.provisionalHeaders.Headers()
73 }
74
75 func (r *requestImpl) Response() (Response, error) {
76 channel, err := r.channel.Send("response")
77 if err != nil {
78 return nil, err
79 }
80 channelOwner := fromNullableChannel(channel)
81 if channelOwner == nil {
82 return nil, nil
83 }
84 return channelOwner.(*responseImpl), nil
85 }
86
87 func (r *requestImpl) Frame() Frame {
88 return fromChannel(r.initializer["frame"]).(*frameImpl)
89 }
90
91 func (r *requestImpl) IsNavigationRequest() bool {
92 return r.initializer["isNavigationRequest"].(bool)
93 }
94
95 func (r *requestImpl) RedirectedFrom() Request {
96 return r.redirectedFrom
97 }
98
99 func (r *requestImpl) RedirectedTo() Request {
100 return r.redirectedTo
101 }
102
103 func (r *requestImpl) Failure() *RequestFailure {
104 if r.failureText == "" {
105 return nil
106 }
107 return &RequestFailure{
108 ErrorText: r.failureText,
109 }
110 }
111
112 func (r *requestImpl) Timing() *ResourceTiming {
113 return r.timing
114 }
115 func (r *requestImpl) AllHeaders() (map[string]string, error) {
116 headers, err := r.ActualHeaders()
117 if err != nil {
118 return nil, err
119 }
120 return headers.Headers(), nil
121 }
122 func (r *requestImpl) HeadersArray() (HeadersArray, error) {
123 headers, err := r.ActualHeaders()
124 if err != nil {
125 return nil, err
126 }
127 return headers.HeadersArray(), nil
128 }
129 func (r *requestImpl) HeaderValue(name string) (string, error) {
130 headers, err := r.ActualHeaders()
131 if err != nil {
132 return "", err
133 }
134 return headers.Get(name), err
135 }
136 func (r *requestImpl) HeaderValues(name string) ([]string, error) {
137 headers, err := r.ActualHeaders()
138 if err != nil {
139 return []string{}, err
140 }
141 return headers.GetAll(name), err
142 }
143 func (r *requestImpl) ActualHeaders() (*rawHeaders, error) {
144 if r.allHeaders == nil {
145 response, err := r.Response()
146 if err != nil {
147 return nil, err
148 }
149 if response == nil {
150 return r.provisionalHeaders, nil
151 }
152 headers, err := r.channel.Send("rawRequestHeaders")
153 if err != nil {
154 return nil, err
155 }
156 r.allHeaders = newRawHeaders(headers)
157 }
158 return r.allHeaders, nil
159 }
160
161 func (r *requestImpl) Sizes() (*RequestSizesResult, error) {
162 response, err := r.Response()
163 if err != nil {
164 return nil, err
165 }
166 sizes, err := response.(*responseImpl).channel.Send("sizes")
167 if err != nil {
168 return nil, err
169 }
170 result := &RequestSizesResult{}
171 remapMapToStruct(sizes, result)
172 return result, nil
173 }
174
175 func newRequest(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *requestImpl {
176 req := &requestImpl{}
177 req.createChannelOwner(req, parent, objectType, guid, initializer)
178 redirectedFrom := fromNullableChannel(initializer["redirectedFrom"])
179 if redirectedFrom != nil {
180 req.redirectedFrom = redirectedFrom.(*requestImpl)
181 }
182 if req.redirectedFrom != nil {
183 req.redirectedFrom.(*requestImpl).redirectedTo = req
184 }
185 req.timing = &ResourceTiming{
186 StartTime: 0,
187 DomainLookupStart: -1,
188 DomainLookupEnd: -1,
189 ConnectStart: -1,
190 SecureConnectionStart: -1,
191 ConnectEnd: -1,
192 RequestStart: -1,
193 ResponseStart: -1,
194 ResponseEnd: -1,
195 }
196 req.provisionalHeaders = newRawHeaders(req.initializer["headers"])
197 return req
198 }
199
View as plain text