2
2
3
3
const {
4
4
DateNow,
5
+ StringPrototypeToLowerCase,
5
6
} = primordials ;
6
7
7
8
const {
@@ -13,16 +14,25 @@ const {
13
14
} = require ( 'internal/inspector/network' ) ;
14
15
const dc = require ( 'diagnostics_channel' ) ;
15
16
const { Network } = require ( 'inspector' ) ;
17
+ const { Buffer } = require ( 'buffer' ) ;
16
18
17
19
// Convert an undici request headers array to a plain object (Map<string, string>)
18
20
function requestHeadersArrayToDictionary ( headers ) {
19
21
const dict = { } ;
22
+ let charset ;
23
+ let mimeType ;
20
24
for ( let idx = 0 ; idx < headers . length ; idx += 2 ) {
21
25
const key = `${ headers [ idx ] } ` ;
22
26
const value = `${ headers [ idx + 1 ] } ` ;
23
27
dict [ key ] = value ;
28
+
29
+ if ( StringPrototypeToLowerCase ( key ) === 'content-type' ) {
30
+ const result = sniffMimeType ( value ) ;
31
+ charset = result . charset ;
32
+ mimeType = result . mimeType ;
33
+ }
24
34
}
25
- return dict ;
35
+ return [ dict , charset , mimeType ] ;
26
36
} ;
27
37
28
38
// Convert an undici response headers array to a plain object (Map<string, string>)
@@ -32,7 +42,7 @@ function responseHeadersArrayToDictionary(headers) {
32
42
let mimeType ;
33
43
for ( let idx = 0 ; idx < headers . length ; idx += 2 ) {
34
44
const key = `${ headers [ idx ] } ` ;
35
- const lowerCasedKey = key . toLowerCase ( ) ;
45
+ const lowerCasedKey = StringPrototypeToLowerCase ( key ) ;
36
46
const value = `${ headers [ idx + 1 ] } ` ;
37
47
const prevValue = dict [ key ] ;
38
48
@@ -63,8 +73,7 @@ function onClientRequestStart({ request }) {
63
73
const url = `${ request . origin } ${ request . path } ` ;
64
74
request [ kInspectorRequestId ] = getNextRequestId ( ) ;
65
75
66
- const headers = requestHeadersArrayToDictionary ( request . headers ) ;
67
- const { charset } = sniffMimeType ( headers ) ;
76
+ const { 0 : headers , 1 : charset } = requestHeadersArrayToDictionary ( request . headers ) ;
68
77
69
78
Network . requestWillBeSent ( {
70
79
requestId : request [ kInspectorRequestId ] ,
@@ -74,7 +83,8 @@ function onClientRequestStart({ request }) {
74
83
request : {
75
84
url,
76
85
method : request . method ,
77
- headers : requestHeadersArrayToDictionary ( request . headers ) ,
86
+ headers : headers ,
87
+ hasPostData : request . body != null ,
78
88
} ,
79
89
} ) ;
80
90
}
@@ -97,6 +107,40 @@ function onClientRequestError({ request, error }) {
97
107
} ) ;
98
108
}
99
109
110
+ /**
111
+ * When a chunk of the request body is being sent, cache it until `getRequestPostData` request.
112
+ * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#method-getRequestPostData
113
+ * @param {{ request: undici.Request, chunk: Uint8Array | string } } event
114
+ */
115
+ function onClientRequestBodyChunkSent ( { request, chunk } ) {
116
+ if ( typeof request [ kInspectorRequestId ] !== 'string' ) {
117
+ return ;
118
+ }
119
+
120
+ const buffer = Buffer . from ( chunk ) ;
121
+ Network . dataSent ( {
122
+ requestId : request [ kInspectorRequestId ] ,
123
+ timestamp : getMonotonicTime ( ) ,
124
+ dataLength : buffer . byteLength ,
125
+ data : buffer ,
126
+ } ) ;
127
+ }
128
+
129
+ /**
130
+ * Mark a request body as fully sent.
131
+ * @param {{request: undici.Request} } event
132
+ */
133
+ function onClientRequestBodySent ( { request } ) {
134
+ if ( typeof request [ kInspectorRequestId ] !== 'string' ) {
135
+ return ;
136
+ }
137
+
138
+ Network . dataSent ( {
139
+ requestId : request [ kInspectorRequestId ] ,
140
+ finished : true ,
141
+ } ) ;
142
+ }
143
+
100
144
/**
101
145
* When response headers are received, emit Network.responseReceived event.
102
146
* https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-responseReceived
@@ -126,6 +170,27 @@ function onClientResponseHeaders({ request, response }) {
126
170
} ) ;
127
171
}
128
172
173
+ /**
174
+ * When a chunk of the response body has been received, cache it until `getResponseBody` request
175
+ * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#method-getResponseBody or
176
+ * stream it with `streamResourceContent` request.
177
+ * https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-streamResourceContent
178
+ * @param {{ request: undici.Request, chunk: Uint8Array | string } } event
179
+ */
180
+ function onClientRequestBodyChunkReceived ( { request, chunk } ) {
181
+ if ( typeof request [ kInspectorRequestId ] !== 'string' ) {
182
+ return ;
183
+ }
184
+
185
+ Network . dataReceived ( {
186
+ requestId : request [ kInspectorRequestId ] ,
187
+ timestamp : getMonotonicTime ( ) ,
188
+ dataLength : chunk . byteLength ,
189
+ encodedDataLength : chunk . byteLength ,
190
+ data : chunk ,
191
+ } ) ;
192
+ }
193
+
129
194
/**
130
195
* When a response is completed, emit Network.loadingFinished event.
131
196
* https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-loadingFinished
@@ -146,13 +211,19 @@ function enable() {
146
211
dc . subscribe ( 'undici:request:error' , onClientRequestError ) ;
147
212
dc . subscribe ( 'undici:request:headers' , onClientResponseHeaders ) ;
148
213
dc . subscribe ( 'undici:request:trailers' , onClientResponseFinish ) ;
214
+ dc . subscribe ( 'undici:request:bodyChunkSent' , onClientRequestBodyChunkSent ) ;
215
+ dc . subscribe ( 'undici:request:bodySent' , onClientRequestBodySent ) ;
216
+ dc . subscribe ( 'undici:request:bodyChunkReceived' , onClientRequestBodyChunkReceived ) ;
149
217
}
150
218
151
219
function disable ( ) {
152
220
dc . unsubscribe ( 'undici:request:create' , onClientRequestStart ) ;
153
221
dc . unsubscribe ( 'undici:request:error' , onClientRequestError ) ;
154
222
dc . unsubscribe ( 'undici:request:headers' , onClientResponseHeaders ) ;
155
223
dc . unsubscribe ( 'undici:request:trailers' , onClientResponseFinish ) ;
224
+ dc . unsubscribe ( 'undici:request:bodyChunkSent' , onClientRequestBodyChunkSent ) ;
225
+ dc . unsubscribe ( 'undici:request:bodySent' , onClientRequestBodySent ) ;
226
+ dc . unsubscribe ( 'undici:request:bodyChunkReceived' , onClientRequestBodyChunkReceived ) ;
156
227
}
157
228
158
229
module . exports = {
0 commit comments