5
5
NotSupportedError
6
6
} = require ( './errors' )
7
7
const assert = require ( 'node:assert' )
8
- const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require ( './symbols' )
9
8
const util = require ( './util' )
10
9
const { channels } = require ( './diagnostics.js' )
11
10
const { headerNameLowerCasedRecord } = require ( './constants' )
@@ -149,7 +148,7 @@ class Request {
149
148
150
149
this . contentType = null
151
150
152
- this . headers = ''
151
+ this . headers = [ ]
153
152
154
153
// Only for H2
155
154
this . expectContinue = expectContinue != null ? expectContinue : false
@@ -310,78 +309,10 @@ class Request {
310
309
}
311
310
}
312
311
313
- // TODO: adjust to support H2
314
312
addHeader ( key , value ) {
315
313
processHeader ( this , key , value )
316
314
return this
317
315
}
318
-
319
- static [ kHTTP1BuildRequest ] ( origin , opts , handler ) {
320
- // TODO: Migrate header parsing here, to make Requests
321
- // HTTP agnostic
322
- return new Request ( origin , opts , handler )
323
- }
324
-
325
- static [ kHTTP2BuildRequest ] ( origin , opts , handler ) {
326
- const headers = opts . headers
327
- opts = { ...opts , headers : null }
328
-
329
- const request = new Request ( origin , opts , handler )
330
-
331
- request . headers = { }
332
-
333
- if ( Array . isArray ( headers ) ) {
334
- if ( headers . length % 2 !== 0 ) {
335
- throw new InvalidArgumentError ( 'headers array must be even' )
336
- }
337
- for ( let i = 0 ; i < headers . length ; i += 2 ) {
338
- processHeader ( request , headers [ i ] , headers [ i + 1 ] , true )
339
- }
340
- } else if ( headers && typeof headers === 'object' ) {
341
- const keys = Object . keys ( headers )
342
- for ( let i = 0 ; i < keys . length ; i ++ ) {
343
- const key = keys [ i ]
344
- processHeader ( request , key , headers [ key ] , true )
345
- }
346
- } else if ( headers != null ) {
347
- throw new InvalidArgumentError ( 'headers must be an object or an array' )
348
- }
349
-
350
- return request
351
- }
352
-
353
- static [ kHTTP2CopyHeaders ] ( raw ) {
354
- const rawHeaders = raw . split ( '\r\n' )
355
- const headers = { }
356
-
357
- for ( const header of rawHeaders ) {
358
- const [ key , value ] = header . split ( ': ' )
359
-
360
- if ( value == null || value . length === 0 ) continue
361
-
362
- if ( headers [ key ] ) {
363
- headers [ key ] += `,${ value } `
364
- } else {
365
- headers [ key ] = value
366
- }
367
- }
368
-
369
- return headers
370
- }
371
- }
372
-
373
- function processHeaderValue ( key , val , skipAppend ) {
374
- if ( val && typeof val === 'object' ) {
375
- throw new InvalidArgumentError ( `invalid ${ key } header` )
376
- }
377
-
378
- val = val != null ? `${ val } ` : ''
379
-
380
- if ( headerCharRegex . exec ( val ) !== null ) {
381
- throw new InvalidArgumentError ( `invalid ${ key } header` )
382
- }
383
-
384
- return skipAppend ? val : `${ key } : ${ val } \r\n`
385
316
}
386
317
387
318
function processHeader ( request , key , val , skipAppend = false ) {
@@ -400,10 +331,39 @@ function processHeader (request, key, val, skipAppend = false) {
400
331
}
401
332
}
402
333
403
- if ( request . host === null && headerName === 'host' ) {
334
+ if ( Array . isArray ( val ) ) {
335
+ const arr = [ ]
336
+ for ( let i = 0 ; i < val . length ; i ++ ) {
337
+ if ( typeof val [ i ] === 'string' ) {
338
+ if ( headerCharRegex . exec ( val [ i ] ) !== null ) {
339
+ throw new InvalidArgumentError ( `invalid ${ key } header` )
340
+ }
341
+ arr . push ( val [ i ] )
342
+ } else if ( val [ i ] === null ) {
343
+ arr . push ( '' )
344
+ } else if ( typeof val [ i ] === 'object' ) {
345
+ throw new InvalidArgumentError ( `invalid ${ key } header` )
346
+ } else {
347
+ arr . push ( `${ val [ i ] } ` )
348
+ }
349
+ }
350
+ val = arr
351
+ } else if ( typeof val === 'string' ) {
404
352
if ( headerCharRegex . exec ( val ) !== null ) {
405
353
throw new InvalidArgumentError ( `invalid ${ key } header` )
406
354
}
355
+ } else if ( val === null ) {
356
+ val = ''
357
+ } else if ( typeof val === 'object' ) {
358
+ throw new InvalidArgumentError ( `invalid ${ key } header` )
359
+ } else {
360
+ val = `${ val } `
361
+ }
362
+
363
+ if ( request . host === null && headerName === 'host' ) {
364
+ if ( typeof val !== 'string' ) {
365
+ throw new InvalidArgumentError ( 'invalid host header' )
366
+ }
407
367
// Consumed by Client
408
368
request . host = val
409
369
} else if ( request . contentLength === null && headerName === 'content-length' ) {
@@ -413,35 +373,22 @@ function processHeader (request, key, val, skipAppend = false) {
413
373
}
414
374
} else if ( request . contentType === null && headerName === 'content-type' ) {
415
375
request . contentType = val
416
- if ( skipAppend ) request . headers [ key ] = processHeaderValue ( key , val , skipAppend )
417
- else request . headers += processHeaderValue ( key , val )
376
+ request . headers . push ( key , val )
418
377
} else if ( headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade' ) {
419
378
throw new InvalidArgumentError ( `invalid ${ headerName } header` )
420
379
} else if ( headerName === 'connection' ) {
421
380
const value = typeof val === 'string' ? val . toLowerCase ( ) : null
422
381
if ( value !== 'close' && value !== 'keep-alive' ) {
423
382
throw new InvalidArgumentError ( 'invalid connection header' )
424
- } else if ( value === 'close' ) {
383
+ }
384
+
385
+ if ( value === 'close' ) {
425
386
request . reset = true
426
387
}
427
388
} else if ( headerName === 'expect' ) {
428
389
throw new NotSupportedError ( 'expect header not supported' )
429
- } else if ( Array . isArray ( val ) ) {
430
- for ( let i = 0 ; i < val . length ; i ++ ) {
431
- if ( skipAppend ) {
432
- if ( request . headers [ key ] ) {
433
- request . headers [ key ] += `,${ processHeaderValue ( key , val [ i ] , skipAppend ) } `
434
- } else {
435
- request . headers [ key ] = processHeaderValue ( key , val [ i ] , skipAppend )
436
- }
437
- } else {
438
- request . headers += processHeaderValue ( key , val [ i ] )
439
- }
440
- }
441
- } else if ( skipAppend ) {
442
- request . headers [ key ] = processHeaderValue ( key , val , skipAppend )
443
390
} else {
444
- request . headers += processHeaderValue ( key , val )
391
+ request . headers . push ( key , val )
445
392
}
446
393
}
447
394
0 commit comments