// Flags: --inspect=0 --experimental-network-inspection 'use strict'; const common = require('../common'); common.skipIfInspectorDisabled(); const inspector = require('node:inspector/promises'); const { Network } = require('node:inspector'); const test = require('node:test'); const assert = require('node:assert'); const { waitUntil } = require('../common/inspector-helper'); const { setTimeout } = require('node:timers/promises'); const session = new inspector.Session(); session.connect(); session.post('Network.enable'); async function triggerNetworkEvents(requestId, requestCharset) { const url = 'https://example.com'; Network.requestWillBeSent({ requestId, timestamp: 1, wallTime: 1, request: { url, method: 'PUT', headers: { mKey: 'mValue', }, hasPostData: true, }, charset: requestCharset, }); await setTimeout(1); const chunk1 = Buffer.from('Hello, '); Network.dataSent({ requestId, timestamp: 2, dataLength: chunk1.byteLength, data: chunk1, }); await setTimeout(1); const chunk2 = Buffer.from('world'); Network.dataSent({ requestId, timestamp: 3, dataLength: chunk2.byteLength, data: chunk2, }); await setTimeout(1); Network.dataSent({ requestId, finished: true, }); await setTimeout(1); Network.responseReceived({ requestId, timestamp: 4, type: 'Fetch', response: { url, status: 200, statusText: 'OK', headers: { mKey: 'mValue', }, }, }); await setTimeout(1); Network.loadingFinished({ requestId, timestamp: 5, }); } function assertNetworkEvents(session, requestId) { session.on('Network.requestWillBeSent', common.mustCall(({ params }) => { assert.strictEqual(params.requestId, requestId); })); session.on('Network.responseReceived', common.mustCall(({ params }) => { assert.strictEqual(params.requestId, requestId); })); const loadingFinishedFuture = waitUntil(session, 'Network.loadingFinished') .then(async ([{ params }]) => { assert.strictEqual(params.requestId, requestId); }); return loadingFinishedFuture; } test('Network.getRequestPostData should send all buffered text data', async () => { session.removeAllListeners(); const requestId = 'my-req-id-1'; const loadingFinishedFuture = assertNetworkEvents(session, requestId); await triggerNetworkEvents(requestId, 'utf-8'); await loadingFinishedFuture; const { postData } = await session.post('Network.getRequestPostData', { requestId, }); assert.strictEqual(postData, 'Hello, world'); }); test('Network.getRequestPostData does not support binary data', async () => { session.removeAllListeners(); const requestId = 'my-req-id-2'; const loadingFinishedFuture = assertNetworkEvents(session, requestId); await triggerNetworkEvents(requestId); await loadingFinishedFuture; await assert.rejects(session.post('Network.getRequestPostData', { requestId, }), { code: 'ERR_INSPECTOR_COMMAND', }); }); test('Network.getRequestPostData should reject if request id not found', async () => { session.removeAllListeners(); const requestId = 'unknown-request-id'; await assert.rejects(session.post('Network.getRequestPostData', { requestId, }), { code: 'ERR_INSPECTOR_COMMAND', }); });