Skip to content

Commit feae6d6

Browse files
committed
Ignore illegal HTTP headers
Fixes: node-fetch#411
1 parent 1592ca1 commit feae6d6

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

src/headers.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,34 @@ Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
322322
enumerable: false,
323323
configurable: true
324324
});
325+
326+
/**
327+
* Create a Headers object from an object of headers, ignoring those that do
328+
* not conform to HTTP grammar productions.
329+
*
330+
* @param Object obj Object of headers
331+
* @return Headers
332+
*/
333+
export function createHeadersLenient(obj) {
334+
const headers = new Headers();
335+
for (const name of Object.keys(obj)) {
336+
if (invalidTokenRegex.test(name)) {
337+
continue;
338+
}
339+
if (Array.isArray(obj[name])) {
340+
for (const val of obj[name]) {
341+
if (invalidHeaderCharRegex.test(val)) {
342+
continue;
343+
}
344+
if (headers[MAP][name] === undefined) {
345+
headers[MAP][name] = [val];
346+
} else {
347+
headers[MAP][name].push(val);
348+
}
349+
}
350+
} else if (!invalidHeaderCharRegex.test(obj[name])) {
351+
headers[MAP][name] = [obj[name]];
352+
}
353+
}
354+
return headers;
355+
}

src/index.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import Body, { writeToStream } from './body';
99
import Response from './response';
10-
import Headers from './headers';
10+
import Headers, { createHeadersLenient } from './headers';
1111
import Request, { getNodeRequestOptions } from './request';
1212
import FetchError from './fetch-error';
1313

@@ -106,19 +106,10 @@ export default function fetch(url, opts) {
106106
return;
107107
}
108108

109+
const headers = createHeadersLenient(res.headers);
109110
// normalize location header for manual redirect mode
110-
const headers = new Headers();
111-
for (const name of Object.keys(res.headers)) {
112-
if (Array.isArray(res.headers[name])) {
113-
for (const val of res.headers[name]) {
114-
headers.append(name, val);
115-
}
116-
} else {
117-
headers.append(name, res.headers[name]);
118-
}
119-
}
120-
if (request.redirect === 'manual' && headers.has('location')) {
121-
headers.set('location', resolve_url(request.url, headers.get('location')));
111+
if (request.redirect === 'manual' && headers.has('Location')) {
112+
headers.set('Location', resolve_url(request.url, headers.get('Location')));
122113
}
123114

124115
// prepare response

0 commit comments

Comments
 (0)