9
9
filterResponse,
10
10
makeResponse
11
11
} = require ( './response' )
12
- const { Headers } = require ( './headers' )
12
+ const { Headers, HeadersList } = require ( './headers' )
13
13
const { Request, makeRequest } = require ( './request' )
14
14
const zlib = require ( 'zlib' )
15
15
const {
@@ -2075,7 +2075,7 @@ async function httpNetworkFetch (
2075
2075
// 20. Return response.
2076
2076
return response
2077
2077
2078
- async function dispatch ( { body } ) {
2078
+ function dispatch ( { body } ) {
2079
2079
const url = requestCurrentURL ( request )
2080
2080
/** @type {import('../..').Agent } */
2081
2081
const agent = fetchParams . controller . dispatcher
@@ -2085,7 +2085,7 @@ async function httpNetworkFetch (
2085
2085
path : url . pathname + url . search ,
2086
2086
origin : url . origin ,
2087
2087
method : request . method ,
2088
- body : fetchParams . controller . dispatcher . isMockActive ? request . body && ( request . body . source || request . body . stream ) : body ,
2088
+ body : agent . isMockActive ? request . body && ( request . body . source || request . body . stream ) : body ,
2089
2089
headers : request . headersList . entries ,
2090
2090
maxRedirections : 0 ,
2091
2091
upgrade : request . mode === 'websocket' ? 'websocket' : undefined
@@ -2106,59 +2106,57 @@ async function httpNetworkFetch (
2106
2106
}
2107
2107
} ,
2108
2108
2109
- onHeaders ( status , headersList , resume , statusText ) {
2109
+ onHeaders ( status , rawHeaders , resume , statusText ) {
2110
2110
if ( status < 200 ) {
2111
2111
return
2112
2112
}
2113
2113
2114
+ /** @type {string[] } */
2114
2115
let codings = [ ]
2115
2116
let location = ''
2116
2117
2117
- const headers = new Headers ( )
2118
+ const headersList = new HeadersList ( )
2118
2119
2119
- // For H2, the headers are a plain JS object
2120
+ // For H2, the rawHeaders are a plain JS object
2120
2121
// We distinguish between them and iterate accordingly
2121
- if ( Array . isArray ( headersList ) ) {
2122
- for ( let n = 0 ; n < headersList . length ; n += 2 ) {
2123
- const key = headersList [ n + 0 ] . toString ( 'latin1' )
2124
- const val = headersList [ n + 1 ] . toString ( 'latin1' )
2125
- if ( key . toLowerCase ( ) === 'content-encoding' ) {
2126
- // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
2127
- // "All content-coding values are case-insensitive..."
2128
- codings = val . toLowerCase ( ) . split ( ',' ) . map ( ( x ) => x . trim ( ) )
2129
- } else if ( key . toLowerCase ( ) === 'location' ) {
2130
- location = val
2131
- }
2132
-
2133
- headers [ kHeadersList ] . append ( key , val )
2122
+ if ( Array . isArray ( rawHeaders ) ) {
2123
+ for ( let i = 0 ; i < rawHeaders . length ; i += 2 ) {
2124
+ headersList . append ( rawHeaders [ i ] . toString ( 'latin1' ) , rawHeaders [ i + 1 ] . toString ( 'latin1' ) )
2134
2125
}
2126
+ const contentEncoding = headersList . get ( 'content-encoding' )
2127
+ if ( contentEncoding ) {
2128
+ // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
2129
+ // "All content-coding values are case-insensitive..."
2130
+ codings = contentEncoding . toLowerCase ( ) . split ( ',' ) . map ( ( x ) => x . trim ( ) )
2131
+ }
2132
+ location = headersList . get ( 'location' )
2135
2133
} else {
2136
- const keys = Object . keys ( headersList )
2137
- for ( const key of keys ) {
2138
- const val = headersList [ key ]
2139
- if ( key . toLowerCase ( ) === 'content-encoding' ) {
2140
- // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
2141
- // "All content-coding values are case-insensitive..."
2142
- codings = val . toLowerCase ( ) . split ( ',' ) . map ( ( x ) => x . trim ( ) ) . reverse ( )
2143
- } else if ( key . toLowerCase ( ) === 'location' ) {
2144
- location = val
2145
- }
2146
-
2147
- headers [ kHeadersList ] . append ( key , val )
2134
+ const keys = Object . keys ( rawHeaders )
2135
+ for ( let i = 0 ; i < keys . length ; ++ i ) {
2136
+ headersList . append ( keys [ i ] , rawHeaders [ keys [ i ] ] )
2137
+ }
2138
+ // For H2, The header names are already in lowercase,
2139
+ // so we can avoid the `HeadersList#get` call here.
2140
+ const contentEncoding = rawHeaders [ 'content-encoding' ]
2141
+ if ( contentEncoding ) {
2142
+ // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
2143
+ // "All content-coding values are case-insensitive..."
2144
+ codings = contentEncoding . toLowerCase ( ) . split ( ',' ) . map ( ( x ) => x . trim ( ) ) . reverse ( )
2148
2145
}
2146
+ location = rawHeaders . location
2149
2147
}
2150
2148
2151
2149
this . body = new Readable ( { read : resume } )
2152
2150
2153
2151
const decoders = [ ]
2154
2152
2155
- const willFollow = request . redirect === 'follow' &&
2156
- location &&
2153
+ const willFollow = location && request . redirect === 'follow' &&
2157
2154
redirectStatusSet . has ( status )
2158
2155
2159
2156
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
2160
2157
if ( request . method !== 'HEAD' && request . method !== 'CONNECT' && ! nullBodyStatus . includes ( status ) && ! willFollow ) {
2161
- for ( const coding of codings ) {
2158
+ for ( let i = 0 ; i < codings . length ; ++ i ) {
2159
+ const coding = codings [ i ]
2162
2160
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
2163
2161
if ( coding === 'x-gzip' || coding === 'gzip' ) {
2164
2162
decoders . push ( zlib . createGunzip ( {
@@ -2183,7 +2181,7 @@ async function httpNetworkFetch (
2183
2181
resolve ( {
2184
2182
status,
2185
2183
statusText,
2186
- headersList : headers [ kHeadersList ] ,
2184
+ headersList,
2187
2185
body : decoders . length
2188
2186
? pipeline ( this . body , ...decoders , ( ) => { } )
2189
2187
: this . body . on ( 'error' , ( ) => { } )
@@ -2237,24 +2235,21 @@ async function httpNetworkFetch (
2237
2235
reject ( error )
2238
2236
} ,
2239
2237
2240
- onUpgrade ( status , headersList , socket ) {
2238
+ onUpgrade ( status , rawHeaders , socket ) {
2241
2239
if ( status !== 101 ) {
2242
2240
return
2243
2241
}
2244
2242
2245
- const headers = new Headers ( )
2246
-
2247
- for ( let n = 0 ; n < headersList . length ; n += 2 ) {
2248
- const key = headersList [ n + 0 ] . toString ( 'latin1' )
2249
- const val = headersList [ n + 1 ] . toString ( 'latin1' )
2243
+ const headersList = new HeadersList ( )
2250
2244
2251
- headers [ kHeadersList ] . append ( key , val )
2245
+ for ( let i = 0 ; i < rawHeaders . length ; i += 2 ) {
2246
+ headersList . append ( rawHeaders [ i ] . toString ( 'latin1' ) , rawHeaders [ i + 1 ] . toString ( 'latin1' ) )
2252
2247
}
2253
2248
2254
2249
resolve ( {
2255
2250
status,
2256
2251
statusText : STATUS_CODES [ status ] ,
2257
- headersList : headers [ kHeadersList ] ,
2252
+ headersList,
2258
2253
socket
2259
2254
} )
2260
2255
0 commit comments