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());