| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent b5ff3f4 commit be93091
11 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -524,6 +524,20 @@ This feature is only available with the `--experimental-network-inspection` flag | |||
| 524 | 524 | Broadcasts the `Network.dataReceived` event to connected frontends, or buffers the data if | |
| 525 | 525 | `Network.streamResourceContent` command was not invoked for the given request yet. | |
| 526 | 526 | ||
| 527 | + Also enables `Network.getResponseBody` command to retrieve the response data. | ||
| 528 | + | ||
| 529 | + ### `inspector.Network.dataSent([params])` | ||
| 530 | + | ||
| 531 | + <!-- YAML | ||
| 532 | + added: REPLACEME | ||
| 533 | + --> | ||
| 534 | + | ||
| 535 | + * `params` {Object} | ||
| 536 | + | ||
| 537 | + This feature is only available with the `--experimental-network-inspection` flag enabled. | ||
| 538 | + | ||
| 539 | + Enables `Network.getRequestPostData` command to retrieve the request data. | ||
| 540 | + | ||
| 527 | 541 | ### `inspector.Network.requestWillBeSent([params])` | |
| 528 | 542 | ||
| 529 | 543 | <!-- YAML | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -214,6 +214,7 @@ const Network = { | |||
| 214 | 214 | responseReceived: (params) => broadcastToFrontend('Network.responseReceived', params), | |
| 215 | 215 | loadingFinished: (params) => broadcastToFrontend('Network.loadingFinished', params), | |
| 216 | 216 | loadingFailed: (params) => broadcastToFrontend('Network.loadingFailed', params), | |
| 217 | + dataSent: (params) => broadcastToFrontend('Network.dataSent', params), | ||
| 217 | 218 | dataReceived: (params) => broadcastToFrontend('Network.dataReceived', params), | |
| 218 | 219 | }; | |
| 219 | 220 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,6 +6,7 @@ const { | |||
| 6 | 6 | } = primordials; | |
| 7 | 7 | ||
| 8 | 8 | const { now } = require('internal/perf/utils'); | |
| 9 | + const { MIMEType } = require('internal/mime'); | ||
| 9 | 10 | const kInspectorRequestId = Symbol('kInspectorRequestId'); | |
| 10 | 11 | ||
| 11 | 12 | // https://chromedevtools.github.io/devtools-protocol/1-3/Network/#type-ResourceType | |
@@ -46,9 +47,29 @@ function getNextRequestId() { | |||
| 46 | 47 | return `node-network-event-${++requestId}`; | |
| 47 | 48 | }; | |
| 48 | 49 | ||
| 50 | + function sniffMimeType(contentType) { | ||
| 51 | + let mimeType; | ||
| 52 | + let charset; | ||
| 53 | + try { | ||
| 54 | + const mimeTypeObj = new MIMEType(contentType); | ||
| 55 | + mimeType = mimeTypeObj.essence || ''; | ||
| 56 | + charset = mimeTypeObj.params.get('charset') || ''; | ||
| 57 | + } catch { | ||
| 58 | + mimeType = ''; | ||
| 59 | + charset = ''; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + return { | ||
| 63 | + __proto__: null, | ||
| 64 | + mimeType, | ||
| 65 | + charset, | ||
| 66 | + }; | ||
| 67 | + } | ||
| 68 | + | ||
| 49 | 69 | module.exports = { | |
| 50 | 70 | kInspectorRequestId, | |
| 51 | 71 | kResourceType, | |
| 52 | 72 | getMonotonicTime, | |
| 53 | 73 | getNextRequestId, | |
| 74 | + sniffMimeType, | ||
| 54 | 75 | }; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -13,35 +13,43 @@ const { | |||
| 13 | 13 | kResourceType, | |
| 14 | 14 | getMonotonicTime, | |
| 15 | 15 | getNextRequestId, | |
| 16 | + sniffMimeType, | ||
| 16 | 17 | } = require('internal/inspector/network'); | |
| 17 | 18 | const dc = require('diagnostics_channel'); | |
| 18 | 19 | const { Network } = require('inspector'); | |
| 19 | - const { MIMEType } = require('internal/mime'); | ||
| 20 | 20 | ||
| 21 | 21 | const kRequestUrl = Symbol('kRequestUrl'); | |
| 22 | 22 | ||
| 23 | 23 | // Convert a Headers object (Map<string, number | string | string[]>) to a plain object (Map<string, string>) | |
| 24 | 24 | const convertHeaderObject = (headers = {}) => { | |
| 25 | 25 | // The 'host' header that contains the host and port of the URL. | |
| 26 | 26 | let host; | |
| 27 | + let charset; | ||
| 28 | + let mimeType; | ||
| 27 | 29 | const dict = {}; | |
| 28 | 30 | for (const { 0: key, 1: value } of ObjectEntries(headers)) { | |
| 29 | - if (key.toLowerCase() === 'host') { | ||
| 31 | + const lowerCasedKey = key.toLowerCase(); | ||
| 32 | + if (lowerCasedKey === 'host') { | ||
| 30 | 33 | host = value; | |
| 31 | 34 | } | |
| 35 | + if (lowerCasedKey === 'content-type') { | ||
| 36 | + const result = sniffMimeType(value); | ||
| 37 | + charset = result.charset; | ||
| 38 | + mimeType = result.mimeType; | ||
| 39 | + } | ||
| 32 | 40 | if (typeof value === 'string') { | |
| 33 | 41 | dict[key] = value; | |
| 34 | 42 | } else if (ArrayIsArray(value)) { | |
| 35 | - if (key.toLowerCase() === 'cookie') dict[key] = value.join('; '); | ||
| 43 | + if (lowerCasedKey === 'cookie') dict[key] = value.join('; '); | ||
| 36 | 44 | // ChromeDevTools frontend treats 'set-cookie' as a special case | |
| 37 | 45 | // https://github.com/ChromeDevTools/devtools-frontend/blob/4275917f84266ef40613db3c1784a25f902ea74e/front_end/core/sdk/NetworkRequest.ts#L1368 | |
| 38 | - else if (key.toLowerCase() === 'set-cookie') dict[key] = value.join('\n'); | ||
| 46 | + else if (lowerCasedKey === 'set-cookie') dict[key] = value.join('\n'); | ||
| 39 | 47 | else dict[key] = value.join(', '); | |
| 40 | 48 | } else { | |
| 41 | 49 | dict[key] = String(value); | |
| 42 | 50 | } | |
| 43 | 51 | } | |
| 44 | - return [host, dict]; | ||
| 52 | + return [dict, host, charset, mimeType]; | ||
| 45 | 53 | }; | |
| 46 | 54 | ||
| 47 | 55 | /** | |
@@ -52,14 +60,15 @@ const convertHeaderObject = (headers = {}) => { | |||
| 52 | 60 | function onClientRequestCreated({ request }) { | |
| 53 | 61 | request[kInspectorRequestId] = getNextRequestId(); | |
| 54 | 62 | ||
| 55 | - const { 0: host, 1: headers } = convertHeaderObject(request.getHeaders()); | ||
| 63 | + const { 0: headers, 1: host, 2: charset } = convertHeaderObject(request.getHeaders()); | ||
| 56 | 64 | const url = `${request.protocol}//${host}${request.path}`; | |
| 57 | 65 | request[kRequestUrl] = url; | |
| 58 | 66 | ||
| 59 | 67 | Network.requestWillBeSent({ | |
| 60 | 68 | requestId: request[kInspectorRequestId], | |
| 61 | 69 | timestamp: getMonotonicTime(), | |
| 62 | 70 | wallTime: DateNow(), | |
| 71 | + charset, | ||
| 63 | 72 | request: { | |
| 64 | 73 | url, | |
| 65 | 74 | method: request.method, | |
@@ -95,16 +104,7 @@ function onClientResponseFinish({ request, response }) { | |||
| 95 | 104 | return; | |
| 96 | 105 | } | |
| 97 | 106 | ||
| 98 | - let mimeType; | ||
| 99 | - let charset; | ||
| 100 | - try { | ||
| 101 | - const mimeTypeObj = new MIMEType(response.headers['content-type']); | ||
| 102 | - mimeType = mimeTypeObj.essence || ''; | ||
| 103 | - charset = mimeTypeObj.params.get('charset') || ''; | ||
| 104 | - } catch { | ||
| 105 | - mimeType = ''; | ||
| 106 | - charset = ''; | ||
| 107 | - } | ||
| 107 | + const { 0: headers, 2: charset, 3: mimeType } = convertHeaderObject(response.headers); | ||
| 108 | 108 | ||
| 109 | 109 | Network.responseReceived({ | |
| 110 | 110 | requestId: request[kInspectorRequestId], | |
@@ -114,7 +114,7 @@ function onClientResponseFinish({ request, response }) { | |||
| 114 | 114 | url: request[kRequestUrl], | |
| 115 | 115 | status: response.statusCode, | |
| 116 | 116 | statusText: response.statusMessage ?? '', | |
| 117 | - headers: convertHeaderObject(response.headers)[1], | ||
| 117 | + headers, | ||
| 118 | 118 | mimeType, | |
| 119 | 119 | charset, | |
| 120 | 120 | }, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,7 +1,6 @@ | |||
| 1 | 1 | 'use strict'; | |
| 2 | 2 | ||
| 3 | 3 | const { | |
| 4 | - ArrayPrototypeFindIndex, | ||
| 5 | 4 | DateNow, | |
| 6 | 5 | } = primordials; | |
| 7 | 6 | ||
@@ -10,10 +9,10 @@ const { | |||
| 10 | 9 | kResourceType, | |
| 11 | 10 | getMonotonicTime, | |
| 12 | 11 | getNextRequestId, | |
| 12 | + sniffMimeType, | ||
| 13 | 13 | } = require('internal/inspector/network'); | |
| 14 | 14 | const dc = require('diagnostics_channel'); | |
| 15 | 15 | const { Network } = require('inspector'); | |
| 16 | - const { MIMEType } = require('internal/mime'); | ||
| 17 | 16 | ||
| 18 | 17 | // Convert an undici request headers array to a plain object (Map<string, string>) | |
| 19 | 18 | function requestHeadersArrayToDictionary(headers) { | |
@@ -29,21 +28,30 @@ function requestHeadersArrayToDictionary(headers) { | |||
| 29 | 28 | // Convert an undici response headers array to a plain object (Map<string, string>) | |
| 30 | 29 | function responseHeadersArrayToDictionary(headers) { | |
| 31 | 30 | const dict = {}; | |
| 31 | + let charset; | ||
| 32 | + let mimeType; | ||
| 32 | 33 | for (let idx = 0; idx < headers.length; idx += 2) { | |
| 33 | 34 | const key = `${headers[idx]}`; | |
| 35 | + const lowerCasedKey = key.toLowerCase(); | ||
| 34 | 36 | const value = `${headers[idx + 1]}`; | |
| 35 | 37 | const prevValue = dict[key]; | |
| 36 | 38 | ||
| 39 | + if (lowerCasedKey === 'content-type') { | ||
| 40 | + const result = sniffMimeType(value); | ||
| 41 | + charset = result.charset; | ||
| 42 | + mimeType = result.mimeType; | ||
| 43 | + } | ||
| 44 | + | ||
| 37 | 45 | if (typeof prevValue === 'string') { | |
| 38 | 46 | // ChromeDevTools frontend treats 'set-cookie' as a special case | |
| 39 | 47 | // https://github.com/ChromeDevTools/devtools-frontend/blob/4275917f84266ef40613db3c1784a25f902ea74e/front_end/core/sdk/NetworkRequest.ts#L1368 | |
| 40 | - if (key.toLowerCase() === 'set-cookie') dict[key] = `${prevValue}\n${value}`; | ||
| 48 | + if (lowerCasedKey === 'set-cookie') dict[key] = `${prevValue}\n${value}`; | ||
| 41 | 49 | else dict[key] = `${prevValue}, ${value}`; | |
| 42 | 50 | } else { | |
| 43 | 51 | dict[key] = value; | |
| 44 | 52 | } | |
| 45 | 53 | } | |
| 46 | - return dict; | ||
| 54 | + return [dict, charset, mimeType]; | ||
| 47 | 55 | }; | |
| 48 | 56 | ||
| 49 | 57 | /** | |
@@ -54,10 +62,15 @@ function responseHeadersArrayToDictionary(headers) { | |||
| 54 | 62 | function onClientRequestStart({ request }) { | |
| 55 | 63 | const url = `${request.origin}${request.path}`; | |
| 56 | 64 | request[kInspectorRequestId] = getNextRequestId(); | |
| 65 | + | ||
| 66 | + const headers = requestHeadersArrayToDictionary(request.headers); | ||
| 67 | + const { charset } = sniffMimeType(headers); | ||
| 68 | + | ||
| 57 | 69 | Network.requestWillBeSent({ | |
| 58 | 70 | requestId: request[kInspectorRequestId], | |
| 59 | 71 | timestamp: getMonotonicTime(), | |
| 60 | 72 | wallTime: DateNow(), | |
| 73 | + charset, | ||
| 61 | 74 | request: { | |
| 62 | 75 | url, | |
| 63 | 76 | method: request.method, | |
@@ -94,19 +107,7 @@ function onClientResponseHeaders({ request, response }) { | |||
| 94 | 107 | return; | |
| 95 | 108 | } | |
| 96 | 109 | ||
| 97 | - let mimeType; | ||
| 98 | - let charset; | ||
| 99 | - try { | ||
| 100 | - const contentTypeKeyIndex = | ||
| 101 | - ArrayPrototypeFindIndex(response.headers, (header) => header.toString().toLowerCase() === 'content-type'); | ||
| 102 | - const contentType = contentTypeKeyIndex !== -1 ? response.headers[contentTypeKeyIndex + 1].toString() : ''; | ||
| 103 | - const mimeTypeObj = new MIMEType(contentType); | ||
| 104 | - mimeType = mimeTypeObj.essence || ''; | ||
| 105 | - charset = mimeTypeObj.params.get('charset') || ''; | ||
| 106 | - } catch { | ||
| 107 | - mimeType = ''; | ||
| 108 | - charset = ''; | ||
| 109 | - } | ||
| 110 | + const { 0: headers, 1: charset, 2: mimeType } = responseHeadersArrayToDictionary(response.headers); | ||
| 110 | 111 | ||
| 111 | 112 | const url = `${request.origin}${request.path}`; | |
| 112 | 113 | Network.responseReceived({ | |
@@ -118,7 +119,7 @@ function onClientResponseHeaders({ request, response }) { | |||
| 118 | 119 | url, | |
| 119 | 120 | status: response.statusCode, | |
| 120 | 121 | statusText: response.statusText, | |
| 121 | - headers: responseHeadersArrayToDictionary(response.headers), | ||
| 122 | + headers, | ||
| 122 | 123 | mimeType, | |
| 123 | 124 | charset, | |
| 124 | 125 | }, | |
| Back | FazBrowse Home | New Git URL |
0 commit comments