@@ -7,17 +7,11 @@ const {
7
7
const assert = require ( 'assert' )
8
8
const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require ( './symbols' )
9
9
const util = require ( './util' )
10
+ const { headerNameLowerCasedRecord } = require ( './constants' )
10
11
11
- // tokenRegExp and headerCharRegex have been lifted from
12
+ // headerCharRegex have been lifted from
12
13
// https://github.com/nodejs/node/blob/main/lib/_http_common.js
13
14
14
- /**
15
- * Verifies that the given val is a valid HTTP token
16
- * per the rules defined in RFC 7230
17
- * See https://tools.ietf.org/html/rfc7230#section-3.2.6
18
- */
19
- const tokenRegExp = / ^ [ \^ _ ` a - z A - Z \- 0 - 9 ! # $ % & ' * + . | ~ ] + $ /
20
-
21
15
/**
22
16
* Matches if val contains an invalid field-vchar
23
17
* field-value = *( field-content / obs-fold )
@@ -416,65 +410,41 @@ function processHeader (request, key, val, skipAppend = false) {
416
410
return
417
411
}
418
412
419
- if (
420
- request . host === null &&
421
- key . length === 4 &&
422
- key . toLowerCase ( ) === 'host'
423
- ) {
413
+ let headerName = headerNameLowerCasedRecord [ key ]
414
+
415
+ if ( headerName === undefined ) {
416
+ headerName = key . toLowerCase ( )
417
+ if ( headerNameLowerCasedRecord [ headerName ] === undefined && ! util . isValidHTTPToken ( headerName ) ) {
418
+ throw new InvalidArgumentError ( 'invalid header key' )
419
+ }
420
+ }
421
+
422
+ if ( request . host === null && headerName === 'host' ) {
424
423
if ( headerCharRegex . exec ( val ) !== null ) {
425
424
throw new InvalidArgumentError ( `invalid ${ key } header` )
426
425
}
427
426
// Consumed by Client
428
427
request . host = val
429
- } else if (
430
- request . contentLength === null &&
431
- key . length === 14 &&
432
- key . toLowerCase ( ) === 'content-length'
433
- ) {
428
+ } else if ( request . contentLength === null && headerName === 'content-length' ) {
434
429
request . contentLength = parseInt ( val , 10 )
435
430
if ( ! Number . isFinite ( request . contentLength ) ) {
436
431
throw new InvalidArgumentError ( 'invalid content-length header' )
437
432
}
438
- } else if (
439
- request . contentType === null &&
440
- key . length === 12 &&
441
- key . toLowerCase ( ) === 'content-type'
442
- ) {
433
+ } else if ( request . contentType === null && headerName === 'content-type' ) {
443
434
request . contentType = val
444
435
if ( skipAppend ) request . headers [ key ] = processHeaderValue ( key , val , skipAppend )
445
436
else request . headers += processHeaderValue ( key , val )
446
- } else if (
447
- key . length === 17 &&
448
- key . toLowerCase ( ) === 'transfer-encoding'
449
- ) {
450
- throw new InvalidArgumentError ( 'invalid transfer-encoding header' )
451
- } else if (
452
- key . length === 10 &&
453
- key . toLowerCase ( ) === 'connection'
454
- ) {
437
+ } else if ( headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade' ) {
438
+ throw new InvalidArgumentError ( `invalid ${ headerName } header` )
439
+ } else if ( headerName === 'connection' ) {
455
440
const value = typeof val === 'string' ? val . toLowerCase ( ) : null
456
441
if ( value !== 'close' && value !== 'keep-alive' ) {
457
442
throw new InvalidArgumentError ( 'invalid connection header' )
458
443
} else if ( value === 'close' ) {
459
444
request . reset = true
460
445
}
461
- } else if (
462
- key . length === 10 &&
463
- key . toLowerCase ( ) === 'keep-alive'
464
- ) {
465
- throw new InvalidArgumentError ( 'invalid keep-alive header' )
466
- } else if (
467
- key . length === 7 &&
468
- key . toLowerCase ( ) === 'upgrade'
469
- ) {
470
- throw new InvalidArgumentError ( 'invalid upgrade header' )
471
- } else if (
472
- key . length === 6 &&
473
- key . toLowerCase ( ) === 'expect'
474
- ) {
446
+ } else if ( headerName === 'expect' ) {
475
447
throw new NotSupportedError ( 'expect header not supported' )
476
- } else if ( tokenRegExp . exec ( key ) === null ) {
477
- throw new InvalidArgumentError ( 'invalid header key' )
478
448
} else {
479
449
if ( Array . isArray ( val ) ) {
480
450
for ( let i = 0 ; i < val . length ; i ++ ) {
0 commit comments