From b75a9d98875c95d156811b3b85e796aa4024a82c Mon Sep 17 00:00:00 2001 From: Connor Clark Date: Fri, 1 Dec 2023 15:04:40 -0800 Subject: [PATCH] core: set network responseHeadersText from extra info event (#15639) --- core/lib/network-recorder.js | 13 ++++++++++ core/lib/network-request.js | 8 ++++++- .../network-records-to-devtools-log-test.js | 7 +++++- core/test/network-records-to-devtools-log.js | 24 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/core/lib/network-recorder.js b/core/lib/network-recorder.js index 9aad2c66de8d..5a3c814a4232 100644 --- a/core/lib/network-recorder.js +++ b/core/lib/network-recorder.js @@ -138,6 +138,18 @@ class NetworkRecorder extends RequestEventEmitter { request.onResponseReceived(data); } + /** + * @param {{params: LH.Crdp.Network.ResponseReceivedExtraInfoEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event + */ + onResponseReceivedExtraInfo(event) { + const data = event.params; + const request = this._findRealRequestAndSetSession( + data.requestId, event.targetType, event.sessionId); + if (!request) return; + log.verbose('network', `${request.url} response received extra info`); + request.onResponseReceivedExtraInfo(data); + } + /** * @param {{params: LH.Crdp.Network.DataReceivedEvent, targetType: LH.Protocol.TargetType, sessionId?: string}} event */ @@ -196,6 +208,7 @@ class NetworkRecorder extends RequestEventEmitter { case 'Network.requestWillBeSent': return this.onRequestWillBeSent(event); case 'Network.requestServedFromCache': return this.onRequestServedFromCache(event); case 'Network.responseReceived': return this.onResponseReceived(event); + case 'Network.responseReceivedExtraInfo': return this.onResponseReceivedExtraInfo(event); case 'Network.dataReceived': return this.onDataReceived(event); case 'Network.loadingFinished': return this.onLoadingFinished(event); case 'Network.loadingFailed': return this.onLoadingFailed(event); diff --git a/core/lib/network-request.js b/core/lib/network-request.js index 133e3e482e35..4afc71796f45 100644 --- a/core/lib/network-request.js +++ b/core/lib/network-request.js @@ -246,6 +246,13 @@ class NetworkRequest { this.frameId = data.frameId; } + /** + * @param {LH.Crdp.Network.ResponseReceivedExtraInfoEvent} data + */ + onResponseReceivedExtraInfo(data) { + this.responseHeadersText = data.headersText || ''; + } + /** * @param {LH.Crdp.Network.DataReceivedEvent} data */ @@ -354,7 +361,6 @@ class NetworkRequest { this.timing = response.timing; if (resourceType) this.resourceType = RESOURCE_TYPES[resourceType]; this.mimeType = response.mimeType; - this.responseHeadersText = response.headersText || ''; this.responseHeaders = NetworkRequest._headersDictToHeadersArray(response.headers); this.fetchedViaServiceWorker = !!response.fromServiceWorker; diff --git a/core/test/network-records-to-devtools-log-test.js b/core/test/network-records-to-devtools-log-test.js index 167b0e22bd68..61d2f4e88b10 100644 --- a/core/test/network-records-to-devtools-log-test.js +++ b/core/test/network-records-to-devtools-log-test.js @@ -57,7 +57,12 @@ describe('networkRecordsToDevtoolsLog', () => { const roundTripLogs = networkRecordsToDevtoolsLog(records, {skipVerification: true}); const roundTripRecords = NetworkRecorder.recordsFromLogs(roundTripLogs); - expect(roundTripRecords).toEqual(records); + // First compare element-wise, as doing all at once results in too verbose an error message. + const len = Math.min(roundTripRecords.length, records.length); + for (let i = 0; i < len; i++) { + expect(roundTripRecords[i]).toEqual(records[i]); + } + expect(roundTripRecords.length).toEqual(records.length); }); it('should roundtrip fake network records multiple times', () => { diff --git a/core/test/network-records-to-devtools-log.js b/core/test/network-records-to-devtools-log.js index 77c0e1c83376..f103ff9a339b 100644 --- a/core/test/network-records-to-devtools-log.js +++ b/core/test/network-records-to-devtools-log.js @@ -300,6 +300,27 @@ function getResponseReceivedEvent(networkRecord, index, normalizedTiming) { }; } +/** + * @param {Partial} networkRecord + * @param {number} index + * @return {LH.Protocol.RawEventMessage} + */ +function getResponseReceivedExtraInfoEvent(networkRecord, index) { + const headers = headersArrayToHeadersDict(networkRecord.responseHeaders); + + return { + method: 'Network.responseReceivedExtraInfo', + params: { + requestId: getBaseRequestId(networkRecord) || `${idBase}.${index}`, + statusCode: networkRecord.statusCode || 200, + headers, + headersText: networkRecord.responseHeadersText, + }, + targetType: 'sessionTargetType' in networkRecord ? networkRecord.sessionTargetType : 'page', + sessionId: networkRecord.sessionId, + }; +} + /** * @param {Partial} networkRecord * @return {LH.Protocol.RawEventMessage} @@ -440,6 +461,9 @@ function networkRecordsToDevtoolsLog(networkRecords, options = {}) { } devtoolsLog.push(getResponseReceivedEvent(networkRecord, index, normalizedTiming)); + if (networkRecord.responseHeadersText) { + devtoolsLog.push(getResponseReceivedExtraInfoEvent(networkRecord, index)); + } devtoolsLog.push(getDataReceivedEvent(networkRecord, index)); if (networkRecord.finished !== false) {