fix: use chrome headers in net.request for everything except cookie (#36666)
This commit is contained in:
parent
8c837fda4f
commit
8f23b1527b
4 changed files with 23 additions and 28 deletions
|
@ -56,31 +56,14 @@ class IncomingMessage extends Readable {
|
||||||
|
|
||||||
get headers () {
|
get headers () {
|
||||||
const filteredHeaders: Record<string, string | string[]> = {};
|
const filteredHeaders: Record<string, string | string[]> = {};
|
||||||
const { rawHeaders } = this._responseHead;
|
const { headers, rawHeaders } = this._responseHead;
|
||||||
rawHeaders.forEach(header => {
|
for (const [name, values] of Object.entries(headers)) {
|
||||||
const keyLowerCase = header.key.toLowerCase();
|
filteredHeaders[name] = discardableDuplicateHeaders.has(name) ? values[0] : values.join(', ');
|
||||||
if (Object.prototype.hasOwnProperty.call(filteredHeaders, keyLowerCase) &&
|
}
|
||||||
discardableDuplicateHeaders.has(keyLowerCase)) {
|
const cookies = rawHeaders.filter(({ key }) => key.toLowerCase() === 'set-cookie').map(({ value }) => value);
|
||||||
// do nothing with discardable duplicate headers
|
|
||||||
} else {
|
|
||||||
if (keyLowerCase === 'set-cookie') {
|
|
||||||
// keep set-cookie as an array per Node.js rules
|
// keep set-cookie as an array per Node.js rules
|
||||||
// see https://nodejs.org/api/http.html#http_message_headers
|
// see https://nodejs.org/api/http.html#http_message_headers
|
||||||
if (Object.prototype.hasOwnProperty.call(filteredHeaders, keyLowerCase)) {
|
if (cookies.length) { filteredHeaders['set-cookie'] = cookies; }
|
||||||
(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return filteredHeaders;
|
return filteredHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -577,9 +577,7 @@ void SimpleURLLoaderWrapper::OnResponseStarted(
|
||||||
dict.Set("statusCode", response_head.headers->response_code());
|
dict.Set("statusCode", response_head.headers->response_code());
|
||||||
dict.Set("statusMessage", response_head.headers->GetStatusText());
|
dict.Set("statusMessage", response_head.headers->GetStatusText());
|
||||||
dict.Set("httpVersion", response_head.headers->GetHttpVersion());
|
dict.Set("httpVersion", response_head.headers->GetHttpVersion());
|
||||||
// Note that |response_head.headers| are filtered by Chromium and should not
|
dict.Set("headers", response_head.headers.get());
|
||||||
// be used here.
|
|
||||||
DCHECK(!response_head.raw_response_headers.empty());
|
|
||||||
dict.Set("rawHeaders", response_head.raw_response_headers);
|
dict.Set("rawHeaders", response_head.raw_response_headers);
|
||||||
Emit("response-started", final_url, dict);
|
Emit("response-started", final_url, dict);
|
||||||
}
|
}
|
||||||
|
|
|
@ -623,6 +623,19 @@ describe('net module', () => {
|
||||||
expect(response.headers['set-cookie']).to.have.same.members(cookie);
|
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 () => {
|
it('should not use the sessions cookie store by default', async () => {
|
||||||
const serverUrl = await respondOnce.toSingleURL((request, response) => {
|
const serverUrl = await respondOnce.toSingleURL((request, response) => {
|
||||||
response.statusCode = 200;
|
response.statusCode = 200;
|
||||||
|
|
1
typings/internal-ambient.d.ts
vendored
1
typings/internal-ambient.d.ts
vendored
|
@ -145,6 +145,7 @@ declare namespace NodeJS {
|
||||||
statusMessage: string;
|
statusMessage: string;
|
||||||
httpVersion: { major: number, minor: number };
|
httpVersion: { major: number, minor: number };
|
||||||
rawHeaders: { key: string, value: string }[];
|
rawHeaders: { key: string, value: string }[];
|
||||||
|
headers: Record<string, string[]>;
|
||||||
};
|
};
|
||||||
|
|
||||||
type RedirectInfo = {
|
type RedirectInfo = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue