@@ -76,3 +76,88 @@ test('set `cookie` header', async t => {
7676 t . is ( body . headers . cookie , 'yummy_cookie=choco; tasty_cookie=strawberry' )
7777 t . is ( cookies . length , 2 )
7878} )
79+
80+ test ( 'does not forward cookie through extra headers' , async t => {
81+ const browserless = await getBrowserContext ( t )
82+ const url = await getUrl ( t )
83+ let extraHTTPHeaders
84+
85+ const run = browserless . withPage ( ( page , goto ) => async ( ) => {
86+ const originalSetExtraHTTPHeaders = page . setExtraHTTPHeaders . bind ( page )
87+ page . setExtraHTTPHeaders = headers => {
88+ extraHTTPHeaders = headers
89+ return originalSetExtraHTTPHeaders ( headers )
90+ }
91+
92+ const result = await goto ( page , {
93+ url,
94+ headers : {
95+ 'x-foo' : 'bar' ,
96+ cookie : 'yummy_cookie=choco'
97+ }
98+ } )
99+
100+ const cookies = await page . cookies ( url )
101+ return { result, cookies }
102+ } )
103+
104+ const { cookies } = await run ( )
105+
106+ t . truthy ( extraHTTPHeaders )
107+ t . false ( Object . prototype . hasOwnProperty . call ( extraHTTPHeaders , 'cookie' ) )
108+ t . true ( cookies . some ( ( { name, value } ) => name === 'yummy_cookie' && value === 'choco' ) )
109+ } )
110+
111+ test ( 'cookies are not sent to subrequests via extra headers' , async t => {
112+ const browserless = await getBrowserContext ( t )
113+ let subrequestHeaders
114+
115+ const subrequestUrl = (
116+ await runServer ( t , ( { req, res } ) => {
117+ if ( req . method === 'OPTIONS' ) {
118+ res . setHeader ( 'access-control-allow-origin' , '*' )
119+ res . setHeader ( 'access-control-allow-methods' , 'GET,POST,OPTIONS' )
120+ res . setHeader ( 'access-control-allow-headers' , 'x-foo' )
121+ res . statusCode = 204
122+ return res . end ( )
123+ }
124+
125+ subrequestHeaders = req . headers
126+ res . setHeader ( 'access-control-allow-origin' , '*' )
127+ res . setHeader ( 'content-type' , 'application/json' )
128+ res . end ( JSON . stringify ( { ok : true } ) )
129+ } )
130+ ) . replace ( '127.0.0.1' , 'localhost' )
131+
132+ const url = await runServer ( t , ( { res } ) => {
133+ res . setHeader ( 'content-type' , 'text/html' )
134+ res . end ( `
135+ <script>
136+ fetch('${ subrequestUrl } ').finally(() => {
137+ window.__subrequest_complete = true
138+ })
139+ </script>
140+ ` )
141+ } )
142+
143+ const run = browserless . withPage ( ( page , goto ) => async ( ) => {
144+ await goto ( page , {
145+ url,
146+ waitForFunction : ( ) => window . __subrequest_complete === true ,
147+ headers : {
148+ 'x-foo' : 'bar' ,
149+ cookie : 'secret_token=top_secret'
150+ }
151+ } )
152+
153+ const cookies = await page . cookies ( url )
154+ return { cookies }
155+ } )
156+
157+ const { cookies } = await run ( )
158+
159+ t . truthy ( subrequestHeaders )
160+ t . is ( subrequestHeaders [ 'x-foo' ] , 'bar' )
161+ t . falsy ( subrequestHeaders . cookie )
162+ t . true ( cookies . some ( ( { name, value } ) => name === 'secret_token' && value === 'top_secret' ) )
163+ } )
0 commit comments