2021-09-22 22:44:22 +03:00
/ * *
* Copyright ( c ) Microsoft Corporation . All rights reserved .
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2022-01-14 13:46:17 +03:00
import os from 'os' ;
2021-11-17 02:42:35 +03:00
import * as util from 'util' ;
2023-01-14 00:50:38 +03:00
import { getPlaywrightVersion } from '../../packages/playwright-core/lib/utils/userAgent' ;
2022-03-26 02:05:50 +03:00
import { expect , playwrightTest as it } from '../config/browserTest' ;
2021-09-22 22:44:22 +03:00
it . skip ( ( { mode } ) = > mode !== 'default' ) ;
2021-11-10 01:11:42 +03:00
for ( const method of [ 'fetch' , 'delete' , 'get' , 'head' , 'patch' , 'post' , 'put' ] as const ) {
2022-03-10 21:42:52 +03:00
it ( ` ${ method } should work @smoke ` , async ( { playwright , server } ) = > {
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( ) ;
2021-09-22 22:44:22 +03:00
const response = await request [ method ] ( server . PREFIX + '/simple.json' ) ;
expect ( response . url ( ) ) . toBe ( server . PREFIX + '/simple.json' ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
expect ( response . statusText ( ) ) . toBe ( 'OK' ) ;
expect ( response . ok ( ) ) . toBeTruthy ( ) ;
expect ( response . headers ( ) [ 'content-type' ] ) . toBe ( 'application/json; charset=utf-8' ) ;
expect ( response . headersArray ( ) ) . toContainEqual ( { name : 'Content-Type' , value : 'application/json; charset=utf-8' } ) ;
2022-02-15 20:06:21 +03:00
expect ( await response . text ( ) ) . toBe ( 'head' === method ? '' : '{"foo": "bar"}\n' ) ;
2021-09-22 22:44:22 +03:00
} ) ;
}
2021-11-10 01:11:42 +03:00
it ( ` should dispose global request ` , async function ( { playwright , server } ) {
const request = await playwright . request . newContext ( ) ;
const response = await request . get ( server . PREFIX + '/simple.json' ) ;
expect ( await response . json ( ) ) . toEqual ( { foo : 'bar' } ) ;
await request . dispose ( ) ;
const error = await response . body ( ) . catch ( e = > e ) ;
expect ( error . message ) . toContain ( 'Response has been disposed' ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should support global userAgent option' , async ( { playwright , server } ) = > {
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( { userAgent : 'My Agent' } ) ;
2021-09-22 22:44:22 +03:00
const [ serverRequest , response ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . get ( server . EMPTY_PAGE )
] ) ;
expect ( response . ok ( ) ) . toBeTruthy ( ) ;
expect ( response . url ( ) ) . toBe ( server . EMPTY_PAGE ) ;
expect ( serverRequest . headers [ 'user-agent' ] ) . toBe ( 'My Agent' ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should support global timeout option' , async ( { playwright , server } ) = > {
2023-01-21 02:47:24 +03:00
const request = await playwright . request . newContext ( { timeout : 100 } ) ;
2021-09-22 22:44:22 +03:00
server . setRoute ( '/empty.html' , ( req , res ) = > { } ) ;
const error = await request . get ( server . EMPTY_PAGE ) . catch ( e = > e ) ;
2023-01-21 02:47:24 +03:00
expect ( error . message ) . toContain ( 'Request timed out after 100ms' ) ;
2021-09-22 22:44:22 +03:00
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should propagate extra http headers with redirects' , async ( { playwright , server } ) = > {
2021-09-22 22:44:22 +03:00
server . setRedirect ( '/a/redirect1' , '/b/c/redirect2' ) ;
server . setRedirect ( '/b/c/redirect2' , '/simple.json' ) ;
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( { extraHTTPHeaders : { 'My-Secret' : 'Value' } } ) ;
2021-09-22 22:44:22 +03:00
const [ req1 , req2 , req3 ] = await Promise . all ( [
server . waitForRequest ( '/a/redirect1' ) ,
server . waitForRequest ( '/b/c/redirect2' ) ,
server . waitForRequest ( '/simple.json' ) ,
request . get ( ` ${ server . PREFIX } /a/redirect1 ` ) ,
] ) ;
expect ( req1 . headers [ 'my-secret' ] ) . toBe ( 'Value' ) ;
expect ( req2 . headers [ 'my-secret' ] ) . toBe ( 'Value' ) ;
expect ( req3 . headers [ 'my-secret' ] ) . toBe ( 'Value' ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should support global httpCredentials option' , async ( { playwright , server } ) = > {
2021-09-22 22:44:22 +03:00
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
2021-10-06 04:53:19 +03:00
const request1 = await playwright . request . newContext ( ) ;
2021-09-22 22:44:22 +03:00
const response1 = await request1 . get ( server . EMPTY_PAGE ) ;
expect ( response1 . status ( ) ) . toBe ( 401 ) ;
await request1 . dispose ( ) ;
2021-10-06 04:53:19 +03:00
const request2 = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' } } ) ;
2021-09-22 22:44:22 +03:00
const response2 = await request2 . get ( server . EMPTY_PAGE ) ;
expect ( response2 . status ( ) ) . toBe ( 200 ) ;
await request2 . dispose ( ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should return error with wrong credentials' , async ( { playwright , server } ) = > {
2021-09-22 22:44:22 +03:00
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'wrong' } } ) ;
2021-11-10 01:11:42 +03:00
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 401 ) ;
2021-09-22 22:44:22 +03:00
} ) ;
2023-03-27 18:52:00 +03:00
it ( 'should work with correct credentials and matching origin' , async ( { playwright , server } ) = > {
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' , origin : server.PREFIX } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
} ) ;
it ( 'should work with correct credentials and matching origin case insensitive' , async ( { playwright , server } ) = > {
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' , origin : server.PREFIX.toUpperCase ( ) } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
} ) ;
it ( 'should return error with correct credentials and mismatching scheme' , async ( { playwright , server } ) = > {
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' , origin : server.PREFIX.replace ( 'http://' , 'https://' ) } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 401 ) ;
} ) ;
it ( 'should return error with correct credentials and mismatching hostname' , async ( { playwright , server } ) = > {
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
const hostname = new URL ( server . PREFIX ) . hostname ;
const origin = server . PREFIX . replace ( hostname , 'mismatching-hostname' ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' , origin : origin } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 401 ) ;
} ) ;
it ( 'should return error with correct credentials and mismatching port' , async ( { playwright , server } ) = > {
server . setAuth ( '/empty.html' , 'user' , 'pass' ) ;
const origin = server . PREFIX . replace ( server . PORT . toString ( ) , ( server . PORT + 1 ) . toString ( ) ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' , origin : origin } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 401 ) ;
} ) ;
2021-12-17 00:40:52 +03:00
it ( 'should support WWW-Authenticate: Basic' , async ( { playwright , server } ) = > {
let credentials ;
server . setRoute ( '/empty.html' , ( req , res ) = > {
if ( ! req . headers . authorization ) {
res . writeHead ( 401 , { 'WWW-Authenticate' : 'Basic' } ) ;
res . end ( 'HTTP Error 401 Unauthorized: Access is denied' ) ;
return ;
}
credentials = Buffer . from ( ( req . headers . authorization ) . split ( ' ' ) [ 1 ] || '' , 'base64' ) . toString ( ) ;
res . writeHead ( 200 , { 'content-type' : 'text/plain' } ) ;
res . end ( ) ;
} ) ;
const request = await playwright . request . newContext ( { httpCredentials : { username : 'user' , password : 'pass' } } ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
expect ( credentials ) . toBe ( 'user:pass' ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should support global ignoreHTTPSErrors option' , async ( { playwright , httpsServer } ) = > {
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( { ignoreHTTPSErrors : true } ) ;
2021-09-22 22:44:22 +03:00
const response = await request . get ( httpsServer . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
} ) ;
2021-10-27 09:20:52 +03:00
it ( 'should propagate ignoreHTTPSErrors on redirects' , async ( { playwright , httpsServer } ) = > {
httpsServer . setRedirect ( '/redir' , '/empty.html' ) ;
const request = await playwright . request . newContext ( ) ;
const response = await request . get ( httpsServer . PREFIX + '/redir' , { ignoreHTTPSErrors : true } ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
} ) ;
2021-09-27 19:58:08 +03:00
it ( 'should resolve url relative to gobal baseURL option' , async ( { playwright , server } ) = > {
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( { baseURL : server.PREFIX } ) ;
2021-09-22 22:44:22 +03:00
const response = await request . get ( '/empty.html' ) ;
expect ( response . url ( ) ) . toBe ( server . EMPTY_PAGE ) ;
} ) ;
2022-01-14 13:46:17 +03:00
it ( 'should set playwright as user-agent' , async ( { playwright , server , isWindows , isLinux , isMac } ) = > {
2021-10-06 04:53:19 +03:00
const request = await playwright . request . newContext ( ) ;
2021-09-28 23:01:35 +03:00
const [ serverRequest ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . get ( server . EMPTY_PAGE )
] ) ;
2022-01-14 13:46:17 +03:00
const userAgentMasked = serverRequest . headers [ 'user-agent' ]
. replace ( os . arch ( ) , '<ARCH>' )
. replace ( getPlaywrightVersion ( ) , 'X.X.X' )
. replace ( /\d+/g , 'X' ) ;
2022-07-07 22:43:47 +03:00
const tokens = [ ] ;
if ( process . env . CI )
tokens . push ( 'CI/X' ) ;
const suffix = tokens . length ? ` ${ tokens . join ( ' ' ) } ` : '' ;
2022-01-14 13:46:17 +03:00
if ( isWindows )
2022-07-07 22:43:47 +03:00
expect ( userAgentMasked ) . toBe ( 'Playwright/X.X.X (<ARCH>; windows X.X) node/X.X' + suffix ) ;
2022-01-14 13:46:17 +03:00
else if ( isLinux )
2022-03-29 00:50:56 +03:00
// on ubuntu: distro is 'ubuntu' and version is 'X.X'
// on manjaro: distro is 'Manjaro' and version is 'unknown'
2022-07-07 22:43:47 +03:00
expect ( userAgentMasked . replace ( /<ARCH>; \w+ [^)]+/ , '<ARCH>; distro version' ) ) . toBe ( 'Playwright/X.X.X (<ARCH>; distro version) node/X.X' + suffix ) ;
2022-01-14 13:46:17 +03:00
else if ( isMac )
2022-07-07 22:43:47 +03:00
expect ( userAgentMasked ) . toBe ( 'Playwright/X.X.X (<ARCH>; macOS X.X) node/X.X' + suffix ) ;
2021-09-28 23:01:35 +03:00
} ) ;
2021-10-06 19:02:41 +03:00
2021-10-28 18:31:30 +03:00
it ( 'should be able to construct with context options' , async ( { playwright , browserType , server } ) = > {
const request = await playwright . request . newContext ( ( browserType as any ) . _defaultContextOptions ) ;
2021-10-06 19:02:41 +03:00
const response = await request . get ( server . EMPTY_PAGE ) ;
expect ( response . ok ( ) ) . toBeTruthy ( ) ;
} ) ;
2021-10-07 21:38:51 +03:00
it ( 'should return empty body' , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const response = await request . get ( server . EMPTY_PAGE ) ;
const body = await response . body ( ) ;
expect ( body . length ) . toBe ( 0 ) ;
expect ( await response . text ( ) ) . toBe ( '' ) ;
await request . dispose ( ) ;
} ) ;
2021-10-19 05:41:56 +03:00
it ( 'should abort requests when context is disposed' , async ( { playwright , server } ) = > {
const connectionClosed = new Promise ( resolve = > {
server . setRoute ( '/empty.html' , req = > req . socket . on ( 'close' , resolve ) ) ;
} ) ;
const request = await playwright . request . newContext ( ) ;
const results = await Promise . all ( [
request . get ( server . EMPTY_PAGE ) . catch ( e = > e ) ,
request . post ( server . EMPTY_PAGE ) . catch ( e = > e ) ,
request . delete ( server . EMPTY_PAGE ) . catch ( e = > e ) ,
server . waitForRequest ( '/empty.html' ) . then ( ( ) = > request . dispose ( ) )
] ) ;
for ( const result of results . slice ( 0 , - 1 ) ) {
expect ( result instanceof Error ) . toBeTruthy ( ) ;
expect ( result . message ) . toContain ( 'Request context disposed' ) ;
}
await connectionClosed ;
} ) ;
it ( 'should abort redirected requests when context is disposed' , async ( { playwright , server } ) = > {
server . setRedirect ( '/redirect' , '/test' ) ;
const connectionClosed = new Promise ( resolve = > {
server . setRoute ( '/test' , req = > req . socket . on ( 'close' , resolve ) ) ;
} ) ;
const request = await playwright . request . newContext ( ) ;
const [ result ] = await Promise . all ( [
request . get ( server . PREFIX + '/redirect' ) . catch ( e = > e ) ,
server . waitForRequest ( '/test' ) . then ( ( ) = > request . dispose ( ) )
] ) ;
expect ( result instanceof Error ) . toBeTruthy ( ) ;
expect ( result . message ) . toContain ( 'Request context disposed' ) ;
await connectionClosed ;
} ) ;
2021-10-23 02:52:49 +03:00
2022-05-04 19:44:50 +03:00
it ( 'should remove content-length from redirected post requests' , async ( { playwright , server } ) = > {
2021-10-23 02:52:49 +03:00
server . setRedirect ( '/redirect' , '/empty.html' ) ;
const request = await playwright . request . newContext ( ) ;
const [ result , req1 , req2 ] = await Promise . all ( [
request . post ( server . PREFIX + '/redirect' , {
data : {
'foo' : 'bar'
}
} ) ,
server . waitForRequest ( '/redirect' ) ,
server . waitForRequest ( '/empty.html' )
] ) ;
expect ( result . status ( ) ) . toBe ( 200 ) ;
expect ( req1 . headers [ 'content-length' ] ) . toBe ( '13' ) ;
expect ( req2 . headers [ 'content-length' ] ) . toBe ( undefined ) ;
await request . dispose ( ) ;
} ) ;
2021-11-11 22:12:24 +03:00
2022-01-25 02:06:36 +03:00
const serialization : [ string , any ] [ ] = [
2021-11-11 22:12:24 +03:00
[ 'object' , { 'foo' : 'bar' } ] ,
[ 'array' , [ 'foo' , 'bar' , 2021 ] ] ,
[ 'string' , 'foo' ] ,
2022-01-25 02:06:36 +03:00
[ 'string (falsey)' , '' ] ,
2021-11-11 22:12:24 +03:00
[ 'bool' , true ] ,
2022-01-25 02:06:36 +03:00
[ 'bool (false)' , false ] ,
2021-11-11 22:12:24 +03:00
[ 'number' , 2021 ] ,
2022-01-25 02:06:36 +03:00
[ 'number (falsey)' , 0 ] ,
[ 'null' , null ] ,
[ 'literal string undefined' , 'undefined' ] ,
2021-11-11 22:12:24 +03:00
] ;
for ( const [ type , value ] of serialization ) {
const stringifiedValue = JSON . stringify ( value ) ;
it ( ` should json stringify ${ type } body when content-type is application/json ` , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const [ req ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . post ( server . EMPTY_PAGE , {
headers : {
'content-type' : 'application/json'
} ,
data : value
} )
] ) ;
const body = await req . postBody ;
expect ( body . toString ( ) ) . toEqual ( stringifiedValue ) ;
await request . dispose ( ) ;
} ) ;
it ( ` should not double stringify ${ type } body when content-type is application/json ` , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const [ req ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . post ( server . EMPTY_PAGE , {
headers : {
'content-type' : 'application/json'
} ,
data : stringifiedValue
} )
] ) ;
const body = await req . postBody ;
expect ( body . toString ( ) ) . toEqual ( stringifiedValue ) ;
await request . dispose ( ) ;
} ) ;
}
it ( ` should accept already serialized data as Buffer when content-type is application/json ` , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const value = JSON . stringify ( JSON . stringify ( { 'foo' : 'bar' } ) ) ;
const [ req ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . post ( server . EMPTY_PAGE , {
headers : {
'content-type' : 'application/json'
} ,
data : Buffer.from ( value , 'utf8' )
} )
] ) ;
const body = await req . postBody ;
expect ( body . toString ( ) ) . toEqual ( value ) ;
await request . dispose ( ) ;
} ) ;
2021-11-17 02:42:35 +03:00
it ( ` should have nice toString ` , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const response = await request . post ( server . EMPTY_PAGE , {
headers : {
'content-type' : 'application/json'
} ,
data : 'My post data'
} ) ;
const str = response [ util . inspect . custom ] ( ) ;
expect ( str ) . toContain ( 'APIResponse: 200 OK' ) ;
for ( const { name , value } of response . headersArray ( ) )
expect ( str ) . toContain ( ` ${ name } : ${ value } ` ) ;
await request . dispose ( ) ;
} ) ;
2022-01-28 23:58:58 +03:00
it ( 'should not fail on empty body with encoding' , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
for ( const method of [ 'head' , 'put' ] ) {
for ( const encoding of [ 'br' , 'gzip' , 'deflate' ] ) {
server . setRoute ( '/empty.html' , ( req , res ) = > {
res . writeHead ( 200 , {
'Content-Encoding' : encoding ,
'Content-Type' : 'text/plain' ,
} ) ;
res . end ( ) ;
} ) ;
const response = await request [ method ] ( server . EMPTY_PAGE ) ;
expect ( response . status ( ) ) . toBe ( 200 ) ;
expect ( ( await response . body ( ) ) . length ) . toBe ( 0 ) ;
}
}
await request . dispose ( ) ;
} ) ;
2022-02-15 20:06:21 +03:00
it ( 'should return body for failing requests' , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
for ( const method of [ 'head' , 'put' , 'trace' ] ) {
server . setRoute ( '/empty.html' , ( req , res ) = > {
res . writeHead ( 404 , { 'Content-Length' : 10 , 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Not found.' ) ;
} ) ;
const response = await request . fetch ( server . EMPTY_PAGE , { method } ) ;
expect ( response . status ( ) ) . toBe ( 404 ) ;
// HEAD response returns empty body in node http module.
expect ( await response . text ( ) ) . toBe ( method === 'head' ? '' : 'Not found.' ) ;
}
await request . dispose ( ) ;
} ) ;
2022-09-09 22:14:42 +03:00
it ( 'should throw an error when maxRedirects is exceeded' , async ( { playwright , server } ) = > {
server . setRedirect ( '/a/redirect1' , '/b/c/redirect2' ) ;
server . setRedirect ( '/b/c/redirect2' , '/b/c/redirect3' ) ;
server . setRedirect ( '/b/c/redirect3' , '/b/c/redirect4' ) ;
server . setRedirect ( '/b/c/redirect4' , '/simple.json' ) ;
const request = await playwright . request . newContext ( ) ;
2022-09-09 23:25:36 +03:00
for ( const method of [ 'GET' , 'PUT' , 'POST' , 'OPTIONS' , 'HEAD' , 'PATCH' ] ) {
for ( const maxRedirects of [ 1 , 2 , 3 ] )
await expect ( async ( ) = > request . fetch ( ` ${ server . PREFIX } /a/redirect1 ` , { method : method , maxRedirects : maxRedirects } ) ) . rejects . toThrow ( 'Max redirect count exceeded' ) ;
}
await request . dispose ( ) ;
2022-09-09 22:14:42 +03:00
} ) ;
it ( 'should not follow redirects when maxRedirects is set to 0' , async ( { playwright , server } ) = > {
server . setRedirect ( '/a/redirect1' , '/b/c/redirect2' ) ;
server . setRedirect ( '/b/c/redirect2' , '/simple.json' ) ;
const request = await playwright . request . newContext ( ) ;
for ( const method of [ 'GET' , 'PUT' , 'POST' , 'OPTIONS' , 'HEAD' , 'PATCH' ] ) {
2022-09-09 23:25:36 +03:00
const response = await request . fetch ( ` ${ server . PREFIX } /a/redirect1 ` , { method , maxRedirects : 0 } ) ;
2022-09-09 22:14:42 +03:00
expect ( response . headers ( ) [ 'location' ] ) . toBe ( '/b/c/redirect2' ) ;
expect ( response . status ( ) ) . toBe ( 302 ) ;
}
2022-09-09 23:25:36 +03:00
await request . dispose ( ) ;
2022-09-09 22:14:42 +03:00
} ) ;
it ( 'should throw an error when maxRedirects is less than 0' , async ( { playwright , server } ) = > {
server . setRedirect ( '/a/redirect1' , '/b/c/redirect2' ) ;
server . setRedirect ( '/b/c/redirect2' , '/simple.json' ) ;
const request = await playwright . request . newContext ( ) ;
2022-09-09 23:25:36 +03:00
for ( const method of [ 'GET' , 'PUT' , 'POST' , 'OPTIONS' , 'HEAD' , 'PATCH' ] )
await expect ( async ( ) = > request . fetch ( ` ${ server . PREFIX } /a/redirect1 ` , { method , maxRedirects : - 1 } ) ) . rejects . toThrow ( ` 'maxRedirects' should be greater than or equal to '0' ` ) ;
await request . dispose ( ) ;
2023-03-10 19:58:12 +03:00
} ) ;
it ( 'should keep headers capitalization' , async ( { playwright , server } ) = > {
const request = await playwright . request . newContext ( ) ;
const [ serverRequest , response ] = await Promise . all ( [
server . waitForRequest ( '/empty.html' ) ,
request . get ( server . EMPTY_PAGE , {
headers : {
'X-fOo' : 'vaLUE' ,
}
} ) ,
] ) ;
expect ( response . ok ( ) ) . toBeTruthy ( ) ;
expect ( serverRequest . rawHeaders ) . toContain ( 'X-fOo' ) ;
expect ( serverRequest . rawHeaders ) . toContain ( 'vaLUE' ) ;
await request . dispose ( ) ;
} ) ;