From 8f23b1527b1d1055d675d04e7b3ee669947ccbd4 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Wed, 21 Dec 2022 14:53:29 -0800 Subject: [PATCH] fix: use chrome headers in net.request for everything except cookie (#36666) --- lib/browser/api/net.ts | 33 +++++--------------- shell/browser/api/electron_api_url_loader.cc | 4 +-- spec/api-net-spec.ts | 13 ++++++++ typings/internal-ambient.d.ts | 1 + 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/lib/browser/api/net.ts b/lib/browser/api/net.ts index 6438eb0230..31845c7daf 100644 --- a/lib/browser/api/net.ts +++ b/lib/browser/api/net.ts @@ -56,31 +56,14 @@ class IncomingMessage extends Readable { get headers () { const filteredHeaders: Record = {}; - const { rawHeaders } = this._responseHead; - rawHeaders.forEach(header => { - const keyLowerCase = header.key.toLowerCase(); - if (Object.prototype.hasOwnProperty.call(filteredHeaders, keyLowerCase) && - discardableDuplicateHeaders.has(keyLowerCase)) { - // do nothing with discardable duplicate headers - } else { - if (keyLowerCase === 'set-cookie') { - // keep set-cookie as an array per Node.js rules - // see https://nodejs.org/api/http.html#http_message_headers - if (Object.prototype.hasOwnProperty.call(filteredHeaders, keyLowerCase)) { - (filteredHeaders[keyLowerCase] as string[]).push(header.value); - } else { - filteredHeaders[keyLowerCase] = [header.value]; - } - } else { - // for non-cookie headers, the values are joined together with ', ' - if (Object.prototype.hasOwnProperty.call(filteredHeaders, keyLowerCase)) { - filteredHeaders[keyLowerCase] += `, ${header.value}`; - } else { - filteredHeaders[keyLowerCase] = header.value; - } - } - } - }); + const { headers, rawHeaders } = this._responseHead; + for (const [name, values] of Object.entries(headers)) { + filteredHeaders[name] = discardableDuplicateHeaders.has(name) ? values[0] : values.join(', '); + } + const cookies = rawHeaders.filter(({ key }) => key.toLowerCase() === 'set-cookie').map(({ value }) => value); + // keep set-cookie as an array per Node.js rules + // see https://nodejs.org/api/http.html#http_message_headers + if (cookies.length) { filteredHeaders['set-cookie'] = cookies; } return filteredHeaders; } diff --git a/shell/browser/api/electron_api_url_loader.cc b/shell/browser/api/electron_api_url_loader.cc index 3a2d329738..6fed3bf105 100644 --- a/shell/browser/api/electron_api_url_loader.cc +++ b/shell/browser/api/electron_api_url_loader.cc @@ -577,9 +577,7 @@ void SimpleURLLoaderWrapper::OnResponseStarted( dict.Set("statusCode", response_head.headers->response_code()); dict.Set("statusMessage", response_head.headers->GetStatusText()); dict.Set("httpVersion", response_head.headers->GetHttpVersion()); - // Note that |response_head.headers| are filtered by Chromium and should not - // be used here. - DCHECK(!response_head.raw_response_headers.empty()); + dict.Set("headers", response_head.headers.get()); dict.Set("rawHeaders", response_head.raw_response_headers); Emit("response-started", final_url, dict); } diff --git a/spec/api-net-spec.ts b/spec/api-net-spec.ts index 97f7e5ca90..7e23afe2e8 100644 --- a/spec/api-net-spec.ts +++ b/spec/api-net-spec.ts @@ -623,6 +623,19 @@ describe('net module', () => { expect(response.headers['set-cookie']).to.have.same.members(cookie); }); + it('should be able to receive content-type', async () => { + const contentType = 'mime/test; charset=test'; + const serverUrl = await respondOnce.toSingleURL((request, response) => { + response.statusCode = 200; + response.statusMessage = 'OK'; + response.setHeader('content-type', contentType); + response.end(); + }); + const urlRequest = net.request(serverUrl); + const response = await getResponse(urlRequest); + expect(response.headers['content-type']).to.equal(contentType); + }); + it('should not use the sessions cookie store by default', async () => { const serverUrl = await respondOnce.toSingleURL((request, response) => { response.statusCode = 200; diff --git a/typings/internal-ambient.d.ts b/typings/internal-ambient.d.ts index d972d03eda..580fec7688 100644 --- a/typings/internal-ambient.d.ts +++ b/typings/internal-ambient.d.ts @@ -145,6 +145,7 @@ declare namespace NodeJS { statusMessage: string; httpVersion: { major: number, minor: number }; rawHeaders: { key: string, value: string }[]; + headers: Record; }; type RedirectInfo = {