inspector: add mimeType and charset support to Network.Response · nodejs/node@79b852a
1+// Flags: --inspect=0 --experimental-network-inspection
2+'use strict';
3+const common = require('../common');
4+5+common.skipIfInspectorDisabled();
6+7+const assert = require('node:assert');
8+const http = require('node:http');
9+const inspector = require('node:inspector/promises');
10+11+const testNetworkInspection = async (session, port, assert) => {
12+let assertPromise = assert(session);
13+fetch(`http://127.0.0.1:${port}/hello-world`).then(common.mustCall());
14+await assertPromise;
15+session.removeAllListeners();
16+assertPromise = assert(session);
17+new Promise((resolve, reject) => {
18+const req = http.get(
19+{
20+host: '127.0.0.1',
21+ port,
22+path: '/hello-world',
23+},
24+common.mustCall((res) => {
25+res.on('data', () => {});
26+res.on('end', () => {});
27+resolve(res);
28+})
29+);
30+req.on('error', reject);
31+});
32+await assertPromise;
33+session.removeAllListeners();
34+};
35+36+const test = (handleRequest, testSessionFunc) => new Promise((resolve) => {
37+const session = new inspector.Session();
38+session.connect();
39+const httpServer = http.createServer(handleRequest);
40+httpServer.listen(0, async () => {
41+try {
42+await session.post('Network.enable');
43+await testNetworkInspection(
44+session,
45+httpServer.address().port,
46+testSessionFunc
47+);
48+await session.post('Network.disable');
49+} catch (err) {
50+assert.fail(err);
51+} finally {
52+await session.disconnect();
53+await httpServer.close();
54+await inspector.close();
55+resolve();
56+}
57+});
58+});
59+60+(async () => {
61+await test(
62+(req, res) => {
63+res.setHeader('Content-Type', 'text/plain; charset=utf-8');
64+res.writeHead(200);
65+res.end('hello world\n');
66+},
67+common.mustCall(
68+(session) =>
69+new Promise((resolve) => {
70+session.on(
71+'Network.responseReceived',
72+common.mustCall(({ params }) => {
73+assert.strictEqual(params.response.mimeType, 'text/plain');
74+assert.strictEqual(params.response.charset, 'utf-8');
75+})
76+);
77+session.on(
78+'Network.loadingFinished',
79+common.mustCall(({ params }) => {
80+assert.ok(params.requestId.startsWith('node-network-event-'));
81+assert.strictEqual(typeof params.timestamp, 'number');
82+resolve();
83+})
84+);
85+}),
86+2
87+)
88+);
89+90+await test(
91+(req, res) => {
92+res.writeHead(200, {});
93+res.end('hello world\n');
94+},
95+common.mustCall((session) =>
96+new Promise((resolve) => {
97+session.on(
98+'Network.responseReceived',
99+common.mustCall(({ params }) => {
100+assert.strictEqual(params.response.mimeType, '');
101+assert.strictEqual(params.response.charset, '');
102+})
103+);
104+session.on(
105+'Network.loadingFinished',
106+common.mustCall(({ params }) => {
107+assert.ok(params.requestId.startsWith('node-network-event-'));
108+assert.strictEqual(typeof params.timestamp, 'number');
109+resolve();
110+})
111+);
112+}), 2
113+)
114+);
115+116+await test(
117+(req, res) => {
118+res.setHeader('Content-Type', 'invalid content-type');
119+res.writeHead(200);
120+res.end('hello world\n');
121+},
122+common.mustCall((session) =>
123+new Promise((resolve) => {
124+session.on(
125+'Network.responseReceived',
126+common.mustCall(({ params }) => {
127+assert.strictEqual(params.response.mimeType, '');
128+assert.strictEqual(params.response.charset, '');
129+})
130+);
131+session.on(
132+'Network.loadingFinished',
133+common.mustCall(({ params }) => {
134+assert.ok(params.requestId.startsWith('node-network-event-'));
135+assert.strictEqual(typeof params.timestamp, 'number');
136+resolve();
137+})
138+);
139+}), 2
140+)
141+);
142+143+await test(
144+(req, res) => {
145+res.setHeader('Content-Type', 'text/plain');
146+res.writeHead(200);
147+res.end('hello world\n');
148+},
149+common.mustCall((session) =>
150+new Promise((resolve) => {
151+session.on(
152+'Network.responseReceived',
153+common.mustCall(({ params }) => {
154+assert.strictEqual(params.response.mimeType, 'text/plain');
155+assert.strictEqual(params.response.charset, '');
156+})
157+);
158+session.on(
159+'Network.loadingFinished',
160+common.mustCall(({ params }) => {
161+assert.ok(params.requestId.startsWith('node-network-event-'));
162+assert.strictEqual(typeof params.timestamp, 'number');
163+resolve();
164+})
165+);
166+}), 2
167+)
168+);
169+170+})().then(common.mustCall());