@@ -13,8 +13,8 @@ import { test, expect } from '@playwright/test'
1313import { execa } from 'execa'
1414import { base36 } from 'multiformats/bases/base36'
1515import { CID } from 'multiformats/cid'
16- import { formatSearch , parseQuery } from '../src/lib/query-helpers.ts'
1716import { loadWithServiceWorker } from '../test-e2e/fixtures/load-with-service-worker.js'
17+ import { makeFetchRequest } from '../test-e2e/fixtures/make-range-request.ts'
1818import { setConfig } from '../test-e2e/fixtures/set-sw-config.ts'
1919import { waitForServiceWorker } from '../test-e2e/fixtures/wait-for-service-worker.js'
2020import { GWC_IMAGE } from './fixtures/constants.js'
@@ -23,8 +23,8 @@ import expectedPassingTests from './fixtures/expected-passing-tests.json' with {
2323import { getReportDetails } from './fixtures/get-report-details.js'
2424import { getTestsToRun } from './fixtures/get-tests-to-run.js'
2525import { getTestsToSkip } from './fixtures/get-tests-to-skip.js'
26- import type { BrowserContext } from '@playwright/test'
27- import type { Server } from 'node:http'
26+ import type { BrowserContext , Response } from '@playwright/test'
27+ import type { IncomingHttpHeaders , Server } from 'node:http'
2828
2929test . describe . configure ( { mode : 'serial' } )
3030
@@ -107,32 +107,6 @@ test.describe('@helia/service-worker-gateway - gateway conformance', () => {
107107 url . port = `${ 3000 } `
108108 }
109109
110- // translate headers used by tests into non-standard query params
111- const HEADERS = [
112- 'accept' ,
113- 'range' ,
114- 'if-none-match'
115- ]
116-
117- const overrides : Record < string , string > = { }
118-
119- for ( const header of HEADERS ) {
120- if ( req . headers [ header ] != null ) {
121- let value = req . headers [ header ]
122-
123- if ( Array . isArray ( value ) ) {
124- value = value . join ( ', ' )
125- }
126-
127- overrides [ header ] = value
128- }
129- }
130-
131- url . search = formatSearch ( {
132- ...parseQuery ( url ) ,
133- ...overrides
134- } )
135-
136110 context = await browser . newContext ( )
137111 const page = await context . newPage ( )
138112
@@ -160,17 +134,34 @@ test.describe('@helia/service-worker-gateway - gateway conformance', () => {
160134
161135 console . info ( 'REQUEST' , id , req . method , url . toString ( ) , req . headers )
162136
163- const response = await loadWithServiceWorker ( page , url . toString ( ) , {
164- redirect : maybeAsSubdomainUrlRedirect ( url ) ,
137+ let response : Response
165138
166- // all data should be local so no need to wait for long timeout
167- timeout : 10_000
168- } )
139+ // if headers used by tests are sent, make an in-page window.fetch
140+ // request instead of loading a URL as this is the only way
141+ // specific headers can be sent
142+ const HEADERS = [
143+ 'accept' ,
144+ 'range' ,
145+ 'if-none-match'
146+ ]
147+
148+ if ( [ ...Object . keys ( req . headers ) ] . some ( key => HEADERS . includes ( key ) ) ) {
149+ response = await makeFetchRequest ( page , url , {
150+ headers : new Headers ( incomingHeadersToObject ( req . headers ) )
151+ } )
152+ } else {
153+ response = await loadWithServiceWorker ( page , url . toString ( ) , {
154+ redirect : maybeAsSubdomainUrlRedirect ( url ) ,
155+
156+ // all data should be local so no need to wait for long timeout
157+ timeout : 10_000
158+ } )
159+ }
169160
170161 res . statusCode = response . status ( )
171162 res . statusMessage = response . statusText ( )
172163
173- console . info ( 'RESPONSE' , id , req . method , url . toString ( ) , response . status ( ) , await response . allHeaders ( ) )
164+ console . info ( 'RESPONSE' , id , req . method , url . toString ( ) , res . statusCode , await response . allHeaders ( ) )
174165 const body = await response . body ( )
175166
176167 if ( response . status ( ) === 500 ) {
@@ -353,3 +344,21 @@ function maybeAsSubdomainUrlRedirect (url: URL): string | undefined {
353344function encodeDNSLinkLabel ( name : string ) : string {
354345 return name . replace ( / - / g, '--' ) . replace ( / \. / g, '-' )
355346}
347+
348+ function incomingHeadersToObject ( headers : IncomingHttpHeaders ) : Record < string , string > {
349+ const output : Record < string , string > = { }
350+
351+ for ( let [ key , value ] of Object . entries ( headers ) ) {
352+ if ( value == null ) {
353+ continue
354+ }
355+
356+ if ( Array . isArray ( value ) ) {
357+ value = value . join ( ',' )
358+ }
359+
360+ output [ key ] = value
361+ }
362+
363+ return output
364+ }
0 commit comments