Skip to content

Commit d823d8a

Browse files
committed
inspector: provide detailed info to fix DevTools frontend errors
1 parent e7edcf3 commit d823d8a

File tree

6 files changed

+127
-11
lines changed

6 files changed

+127
-11
lines changed

lib/internal/inspector_network_tracking.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,26 @@ function onClientRequestStart({ request }) {
2222
request: {
2323
url,
2424
method: request.method,
25+
headers: request.getHeaders(),
2526
},
2627
});
2728
}
2829

29-
function onClientResponseFinish({ request }) {
30+
function onClientResponseFinish({ request, response }) {
3031
if (typeof request._inspectorRequestId !== 'string') {
3132
return;
3233
}
34+
const url = `${request.protocol}//${request.host}${request.path}`;
3335
const timestamp = DateNow() / 1000;
3436
Network.responseReceived({
3537
requestId: request._inspectorRequestId,
3638
timestamp,
39+
type: 'Other',
40+
response: {
41+
url,
42+
status: response.statusCode,
43+
headers: response.headers,
44+
},
3745
});
3846
Network.loadingFinished({
3947
requestId: request._inspectorRequestId,

src/inspector/network_agent.cc

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,24 @@ namespace node {
55
namespace inspector {
66
namespace protocol {
77

8-
std::unique_ptr<Network::Request> Request(const String& url,
9-
const String& method) {
10-
return Network::Request::create().setUrl(url).setMethod(method).build();
8+
std::unique_ptr<Network::Request> createRequest(
9+
const String& url,
10+
const String& method,
11+
std::unique_ptr<Network::Headers> headers) {
12+
return Network::Request::create()
13+
.setUrl(url)
14+
.setMethod(method)
15+
.setHeaders(std::move(headers))
16+
.build();
17+
}
18+
19+
std::unique_ptr<Network::Response> createResponse(
20+
const String& url, int status, std::unique_ptr<Network::Headers> headers) {
21+
return Network::Response::create()
22+
.setUrl(url)
23+
.setStatus(status)
24+
.setHeaders(std::move(headers))
25+
.build();
1126
}
1227

1328
NetworkAgent::NetworkAgent(NetworkInspector* inspector)
@@ -55,8 +70,17 @@ void NetworkAgent::requestWillBeSent(
5570
String method;
5671
request->getString("method", &method);
5772

58-
frontend_->requestWillBeSent(
59-
request_id, Request(url, method), timestamp, wall_time);
73+
ErrorSupport errors;
74+
auto headers =
75+
Network::Headers::fromValue(request->getObject("headers"), &errors);
76+
if (errors.hasErrors()) {
77+
headers = std::make_unique<Network::Headers>(DictionaryValue::create());
78+
}
79+
80+
frontend_->requestWillBeSent(request_id,
81+
createRequest(url, method, std::move(headers)),
82+
timestamp,
83+
wall_time);
6084
}
6185

6286
void NetworkAgent::responseReceived(
@@ -65,8 +89,25 @@ void NetworkAgent::responseReceived(
6589
params->getString("requestId", &request_id);
6690
double timestamp;
6791
params->getDouble("timestamp", &timestamp);
92+
String type;
93+
params->getString("type", &type);
94+
auto response = params->getObject("response");
95+
String url;
96+
response->getString("url", &url);
97+
int status;
98+
response->getInteger("status", &status);
99+
100+
ErrorSupport errors;
101+
auto headers =
102+
Network::Headers::fromValue(response->getObject("headers"), &errors);
103+
if (errors.hasErrors()) {
104+
headers = std::make_unique<Network::Headers>(DictionaryValue::create());
105+
}
68106

69-
frontend_->responseReceived(request_id, timestamp);
107+
frontend_->responseReceived(request_id,
108+
timestamp,
109+
type,
110+
createResponse(url, status, std::move(headers)));
70111
}
71112

72113
void NetworkAgent::loadingFinished(

src/inspector/network_agent.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ class NetworkInspector;
1212

1313
namespace protocol {
1414

15-
std::unique_ptr<Network::Request> Request(const String& url,
16-
const String& method);
15+
std::unique_ptr<Network::Request> createRequest(
16+
const String& url,
17+
const String& method,
18+
std::unique_ptr<Network::Headers> headers);
19+
std::unique_ptr<Network::Response> createResponse(
20+
const String& url, int status, std::unique_ptr<Network::Headers> headers);
1721

1822
class NetworkAgent : public Network::Backend {
1923
public:

src/inspector/node_protocol.pdl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,28 @@ experimental domain NodeWorker
101101
# Partial support for Network domain of ChromeDevTools Protocol.
102102
# https://chromedevtools.github.io/devtools-protocol/tot/Network
103103
experimental domain Network
104+
# Resource type as it was perceived by the rendering engine.
105+
type ResourceType extends string
106+
enum
107+
Document
108+
Stylesheet
109+
Image
110+
Media
111+
Font
112+
Script
113+
TextTrack
114+
XHR
115+
Fetch
116+
Prefetch
117+
EventSource
118+
WebSocket
119+
Manifest
120+
SignedExchange
121+
Ping
122+
CSPViolationReport
123+
Preflight
124+
Other
125+
104126
# Unique request identifier.
105127
type RequestId extends string
106128

@@ -115,6 +137,17 @@ experimental domain Network
115137
properties
116138
string url
117139
string method
140+
Headers headers
141+
142+
# HTTP response data.
143+
type Response extends object
144+
properties
145+
string url
146+
integer status
147+
Headers headers
148+
149+
# Request / response headers as keys / values of JSON object.
150+
type Headers extends object
118151

119152
# Disables network tracking, prevents network events from being sent to the client.
120153
command disable
@@ -141,6 +174,10 @@ experimental domain Network
141174
RequestId requestId
142175
# Timestamp.
143176
MonotonicTime timestamp
177+
# Resource type.
178+
ResourceType type
179+
# Response data.
180+
Response response
144181

145182
event loadingFinished
146183
parameters

test/parallel/test-inspector-emit-protocol-event.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ const EXPECTED_EVENTS = {
1515
requestId: 'request-id-1',
1616
request: {
1717
url: 'https://nodejs.org/en',
18-
method: 'GET'
18+
method: 'GET',
19+
},
20+
timestamp: 1000,
21+
wallTime: 1000,
22+
},
23+
expected: {
24+
requestId: 'request-id-1',
25+
request: {
26+
url: 'https://nodejs.org/en',
27+
method: 'GET',
28+
headers: {} // Headers should be an empty object if not provided.
1929
},
2030
timestamp: 1000,
2131
wallTime: 1000,
@@ -26,6 +36,12 @@ const EXPECTED_EVENTS = {
2636
params: {
2737
requestId: 'request-id-1',
2838
timestamp: 1000,
39+
type: 'Other',
40+
response: {
41+
url: 'https://nodejs.org/en',
42+
status: 200,
43+
headers: { host: 'nodejs.org' }
44+
}
2945
}
3046
},
3147
{
@@ -68,7 +84,7 @@ const runAsyncTest = async () => {
6884
for (const [domain, events] of Object.entries(EXPECTED_EVENTS)) {
6985
for (const event of events) {
7086
session.on(`${domain}.${event.name}`, common.mustCall(({ params }) => {
71-
assert.deepStrictEqual(params, event.params);
87+
assert.deepStrictEqual(params, event.expected ?? event.params);
7288
}));
7389
inspector[domain][event.name](event.params);
7490
}

test/parallel/test-inspector-network-domain.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@ const testHttpGet = () => new Promise((resolve, reject) => {
5252
assert.ok(params.requestId.startsWith('node-network-event-'));
5353
assert.strictEqual(params.request.url, 'http://127.0.0.1/hello-world');
5454
assert.strictEqual(params.request.method, 'GET');
55+
assert.strictEqual(typeof params.request.headers, 'object');
5556
assert.strictEqual(typeof params.timestamp, 'number');
5657
assert.strictEqual(typeof params.wallTime, 'number');
5758
}));
5859
session.on('Network.responseReceived', common.mustCall(({ params }) => {
5960
assert.ok(params.requestId.startsWith('node-network-event-'));
6061
assert.strictEqual(typeof params.timestamp, 'number');
62+
assert.strictEqual(params.type, 'Other');
63+
assert.strictEqual(params.response.status, 200);
64+
assert.strictEqual(params.response.url, 'http://127.0.0.1/hello-world');
65+
assert.strictEqual(typeof params.response.headers, 'object');
6166
}));
6267
session.on('Network.loadingFinished', common.mustCall(({ params }) => {
6368
assert.ok(params.requestId.startsWith('node-network-event-'));
@@ -77,12 +82,17 @@ const testHttpsGet = () => new Promise((resolve, reject) => {
7782
assert.ok(params.requestId.startsWith('node-network-event-'));
7883
assert.strictEqual(params.request.url, 'https://127.0.0.1/hello-world');
7984
assert.strictEqual(params.request.method, 'GET');
85+
assert.strictEqual(typeof params.request.headers, 'object');
8086
assert.strictEqual(typeof params.timestamp, 'number');
8187
assert.strictEqual(typeof params.wallTime, 'number');
8288
}));
8389
session.on('Network.responseReceived', common.mustCall(({ params }) => {
8490
assert.ok(params.requestId.startsWith('node-network-event-'));
8591
assert.strictEqual(typeof params.timestamp, 'number');
92+
assert.strictEqual(params.type, 'Other');
93+
assert.strictEqual(params.response.status, 200);
94+
assert.strictEqual(params.response.url, 'https://127.0.0.1/hello-world');
95+
assert.strictEqual(typeof params.response.headers, 'object');
8696
}));
8797
session.on('Network.loadingFinished', common.mustCall(({ params }) => {
8898
assert.ok(params.requestId.startsWith('node-network-event-'));

0 commit comments

Comments
 (0)