2
2
3
3
'use strict'
4
4
5
- const { kHeadersList, kConstruct } = require ( '../../core/symbols' )
6
- const { kGuard } = require ( './symbols' )
5
+ const { kConstruct } = require ( '../../core/symbols' )
7
6
const { kEnumerableProperty } = require ( '../../core/util' )
8
7
const {
9
8
iteratorMixin,
@@ -103,19 +102,18 @@ function appendHeader (headers, name, value) {
103
102
// 3. If headers’s guard is "immutable", then throw a TypeError.
104
103
// 4. Otherwise, if headers’s guard is "request" and name is a
105
104
// forbidden header name, return.
105
+ // 5. Otherwise, if headers’s guard is "request-no-cors":
106
+ // TODO
106
107
// Note: undici does not implement forbidden header names
107
- if ( headers [ kGuard ] === 'immutable' ) {
108
+ if ( getHeadersGuard ( headers ) === 'immutable' ) {
108
109
throw new TypeError ( 'immutable' )
109
- } else if ( headers [ kGuard ] === 'request-no-cors' ) {
110
- // 5. Otherwise, if headers’s guard is "request-no-cors":
111
- // TODO
112
110
}
113
111
114
112
// 6. Otherwise, if headers’s guard is "response" and name is a
115
113
// forbidden response-header name, return.
116
114
117
115
// 7. Append (name, value) to headers’s header list.
118
- return headers [ kHeadersList ] . append ( name , value , false )
116
+ return getHeadersList ( headers ) . append ( name , value , false )
119
117
120
118
// 8. If headers’s guard is "request-no-cors", then remove
121
119
// privileged no-CORS request headers from headers
@@ -357,16 +355,20 @@ class HeadersList {
357
355
358
356
// https://fetch.spec.whatwg.org/#headers-class
359
357
class Headers {
358
+ #guard
359
+ #headersList
360
+
360
361
constructor ( init = undefined ) {
361
362
if ( init === kConstruct ) {
362
363
return
363
364
}
364
- this [ kHeadersList ] = new HeadersList ( )
365
+
366
+ this . #headersList = new HeadersList ( )
365
367
366
368
// The new Headers(init) constructor steps are:
367
369
368
370
// 1. Set this’s guard to "none".
369
- this [ kGuard ] = 'none'
371
+ this . #guard = 'none'
370
372
371
373
// 2. If init is given, then fill this with init.
372
374
if ( init !== undefined ) {
@@ -416,22 +418,20 @@ class Headers {
416
418
// 5. Otherwise, if this’s guard is "response" and name is
417
419
// a forbidden response-header name, return.
418
420
// Note: undici does not implement forbidden header names
419
- if ( this [ kGuard ] === 'immutable' ) {
421
+ if ( this . #guard === 'immutable' ) {
420
422
throw new TypeError ( 'immutable' )
421
- } else if ( this [ kGuard ] === 'request-no-cors' ) {
422
- // TODO
423
423
}
424
424
425
425
// 6. If this’s header list does not contain name, then
426
426
// return.
427
- if ( ! this [ kHeadersList ] . contains ( name , false ) ) {
427
+ if ( ! this . #headersList . contains ( name , false ) ) {
428
428
return
429
429
}
430
430
431
431
// 7. Delete name from this’s header list.
432
432
// 8. If this’s guard is "request-no-cors", then remove
433
433
// privileged no-CORS request headers from this.
434
- this [ kHeadersList ] . delete ( name , false )
434
+ this . #headersList . delete ( name , false )
435
435
}
436
436
437
437
// https://fetch.spec.whatwg.org/#dom-headers-get
@@ -454,7 +454,7 @@ class Headers {
454
454
455
455
// 2. Return the result of getting name from this’s header
456
456
// list.
457
- return this [ kHeadersList ] . get ( name , false )
457
+ return this . #headersList . get ( name , false )
458
458
}
459
459
460
460
// https://fetch.spec.whatwg.org/#dom-headers-has
@@ -477,7 +477,7 @@ class Headers {
477
477
478
478
// 2. Return true if this’s header list contains name;
479
479
// otherwise false.
480
- return this [ kHeadersList ] . contains ( name , false )
480
+ return this . #headersList . contains ( name , false )
481
481
}
482
482
483
483
// https://fetch.spec.whatwg.org/#dom-headers-set
@@ -518,16 +518,14 @@ class Headers {
518
518
// 6. Otherwise, if this’s guard is "response" and name is a
519
519
// forbidden response-header name, return.
520
520
// Note: undici does not implement forbidden header names
521
- if ( this [ kGuard ] === 'immutable' ) {
521
+ if ( this . #guard === 'immutable' ) {
522
522
throw new TypeError ( 'immutable' )
523
- } else if ( this [ kGuard ] === 'request-no-cors' ) {
524
- // TODO
525
523
}
526
524
527
525
// 7. Set (name, value) in this’s header list.
528
526
// 8. If this’s guard is "request-no-cors", then remove
529
527
// privileged no-CORS request headers from this
530
- this [ kHeadersList ] . set ( name , value , false )
528
+ this . #headersList . set ( name , value , false )
531
529
}
532
530
533
531
// https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
@@ -538,7 +536,7 @@ class Headers {
538
536
// 2. Return the values of all headers in this’s header list whose name is
539
537
// a byte-case-insensitive match for `Set-Cookie`, in order.
540
538
541
- const list = this [ kHeadersList ] . cookies
539
+ const list = this . #headersList . cookies
542
540
543
541
if ( list ) {
544
542
return [ ...list ]
@@ -549,8 +547,8 @@ class Headers {
549
547
550
548
// https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
551
549
get [ kHeadersSortedMap ] ( ) {
552
- if ( this [ kHeadersList ] [ kHeadersSortedMap ] ) {
553
- return this [ kHeadersList ] [ kHeadersSortedMap ]
550
+ if ( this . #headersList [ kHeadersSortedMap ] ) {
551
+ return this . #headersList [ kHeadersSortedMap ]
554
552
}
555
553
556
554
// 1. Let headers be an empty list of headers with the key being the name
@@ -559,14 +557,14 @@ class Headers {
559
557
560
558
// 2. Let names be the result of convert header names to a sorted-lowercase
561
559
// set with all the names of the headers in list.
562
- const names = this [ kHeadersList ] . toSortedArray ( )
560
+ const names = this . #headersList . toSortedArray ( )
563
561
564
- const cookies = this [ kHeadersList ] . cookies
562
+ const cookies = this . #headersList . cookies
565
563
566
564
// fast-path
567
565
if ( cookies === null || cookies . length === 1 ) {
568
566
// Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`
569
- return ( this [ kHeadersList ] [ kHeadersSortedMap ] = names )
567
+ return ( this . #headersList [ kHeadersSortedMap ] = names )
570
568
}
571
569
572
570
// 3. For each name of names:
@@ -596,16 +594,38 @@ class Headers {
596
594
}
597
595
598
596
// 4. Return headers.
599
- return ( this [ kHeadersList ] [ kHeadersSortedMap ] = headers )
597
+ return ( this . #headersList [ kHeadersSortedMap ] = headers )
600
598
}
601
599
602
600
[ util . inspect . custom ] ( depth , options ) {
603
601
options . depth ??= depth
604
602
605
- return `Headers ${ util . formatWithOptions ( options , this [ kHeadersList ] . entries ) } `
603
+ return `Headers ${ util . formatWithOptions ( options , this . #headersList. entries ) } `
604
+ }
605
+
606
+ static getHeadersGuard ( o ) {
607
+ return o . #guard
608
+ }
609
+
610
+ static setHeadersGuard ( o , guard ) {
611
+ o . #guard = guard
612
+ }
613
+
614
+ static getHeadersList ( o ) {
615
+ return o . #headersList
616
+ }
617
+
618
+ static setHeadersList ( o , list ) {
619
+ o . #headersList = list
606
620
}
607
621
}
608
622
623
+ const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers
624
+ Reflect . deleteProperty ( Headers , 'getHeadersGuard' )
625
+ Reflect . deleteProperty ( Headers , 'setHeadersGuard' )
626
+ Reflect . deleteProperty ( Headers , 'getHeadersList' )
627
+ Reflect . deleteProperty ( Headers , 'setHeadersList' )
628
+
609
629
Object . defineProperty ( Headers . prototype , util . inspect . custom , {
610
630
enumerable : false
611
631
} )
@@ -631,8 +651,12 @@ webidl.converters.HeadersInit = function (V, prefix, argument) {
631
651
632
652
// A work-around to ensure we send the properly-cased Headers when V is a Headers object.
633
653
// Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.
634
- if ( ! util . types . isProxy ( V ) && kHeadersList in V && iterator === Headers . prototype . entries ) { // Headers object
635
- return V [ kHeadersList ] . entriesList
654
+ if ( ! util . types . isProxy ( V ) && iterator === Headers . prototype . entries ) { // Headers object
655
+ try {
656
+ return getHeadersList ( V ) . entriesList
657
+ } catch {
658
+ // fall-through
659
+ }
636
660
}
637
661
638
662
if ( typeof iterator === 'function' ) {
@@ -654,5 +678,9 @@ module.exports = {
654
678
// for test.
655
679
compareHeaderName,
656
680
Headers,
657
- HeadersList
681
+ HeadersList,
682
+ getHeadersGuard,
683
+ setHeadersGuard,
684
+ setHeadersList,
685
+ getHeadersList
658
686
}
0 commit comments