@@ -58,6 +58,7 @@ const { dataURLProcessor, serializeAMimeType } = require('./dataURL')
5858const { TransformStream } = require ( 'stream/web' )
5959const { getGlobalDispatcher } = require ( '../../index' )
6060const { webidl } = require ( './webidl' )
61+ const { STATUS_CODES } = require ( 'http' )
6162
6263/** @type {import('buffer').resolveObjectURL } */
6364let resolveObjectURL
@@ -1745,12 +1746,17 @@ async function httpNetworkFetch (
17451746 }
17461747
17471748 try {
1748- const { body, status, statusText, headersList } = await dispatch ( { body : requestBody } )
1749+ // socket is only provided for websockets
1750+ const { body, status, statusText, headersList, socket } = await dispatch ( { body : requestBody } )
17491751
1750- const iterator = body [ Symbol . asyncIterator ] ( )
1751- fetchParams . controller . next = ( ) => iterator . next ( )
1752+ if ( socket ) {
1753+ response = makeResponse ( { status, statusText, headersList, socket } )
1754+ } else {
1755+ const iterator = body [ Symbol . asyncIterator ] ( )
1756+ fetchParams . controller . next = ( ) => iterator . next ( )
17521757
1753- response = makeResponse ( { status, statusText, headersList } )
1758+ response = makeResponse ( { status, statusText, headersList } )
1759+ }
17541760 } catch ( err ) {
17551761 // 10. If aborted, then:
17561762 if ( err . name === 'AbortError' ) {
@@ -1934,7 +1940,10 @@ async function httpNetworkFetch (
19341940
19351941 async function dispatch ( { body } ) {
19361942 const url = requestCurrentURL ( request )
1937- return new Promise ( ( resolve , reject ) => fetchParams . controller . dispatcher . dispatch (
1943+ /** @type {import('../..').Agent } */
1944+ const agent = fetchParams . controller . dispatcher
1945+
1946+ return new Promise ( ( resolve , reject ) => agent . dispatch (
19381947 {
19391948 path : url . pathname + url . search ,
19401949 origin : url . origin ,
@@ -1943,7 +1952,8 @@ async function httpNetworkFetch (
19431952 headers : request . headersList [ kHeadersCaseInsensitive ] ,
19441953 maxRedirections : 0 ,
19451954 bodyTimeout : 300_000 ,
1946- headersTimeout : 300_000
1955+ headersTimeout : 300_000 ,
1956+ upgrade : request . mode === 'websocket' ? 'websocket' : undefined
19471957 } ,
19481958 {
19491959 body : null ,
@@ -2062,6 +2072,30 @@ async function httpNetworkFetch (
20622072 fetchParams . controller . terminate ( error )
20632073
20642074 reject ( error )
2075+ } ,
2076+
2077+ onUpgrade ( status , headersList , socket ) {
2078+ if ( status !== 101 ) {
2079+ return
2080+ }
2081+
2082+ const headers = new Headers ( )
2083+
2084+ for ( let n = 0 ; n < headersList . length ; n += 2 ) {
2085+ const key = headersList [ n + 0 ] . toString ( 'latin1' )
2086+ const val = headersList [ n + 1 ] . toString ( 'latin1' )
2087+
2088+ headers . append ( key , val )
2089+ }
2090+
2091+ resolve ( {
2092+ status,
2093+ statusText : STATUS_CODES [ status ] ,
2094+ headersList : headers [ kHeadersList ] ,
2095+ socket
2096+ } )
2097+
2098+ return true
20652099 }
20662100 }
20672101 ) )
0 commit comments