@@ -53,7 +53,8 @@ const test = playwrightTest.extend<ExtraFixtures>({
5353 const server = createHttpServer ( ( req : http . IncomingMessage , res : http . ServerResponse ) => {
5454 res . end ( '<html><body>from-dummy-server</body></html>' ) ;
5555 } ) ;
56- await new Promise < void > ( resolve => server . listen ( 0 , resolve ) ) ;
56+ // Only listen on IPv4 to check that we don't try to connect to it via IPv6.
57+ await new Promise < void > ( resolve => server . listen ( 0 , '127.0.0.1' , resolve ) ) ;
5758 await use ( ( server . address ( ) as net . AddressInfo ) . port ) ;
5859 await new Promise < Error > ( resolve => server . close ( resolve ) ) ;
5960 } ,
@@ -792,9 +793,23 @@ for (const kind of ['launchServer', 'run-server'] as const) {
792793 const remoteServer = await startRemoteServer ( kind ) ;
793794 const browser = await connect ( remoteServer . wsEndpoint ( ) , { _exposeNetwork : '*' } as any , dummyServerPort ) ;
794795 const page = await browser . newPage ( ) ;
795- await page . goto ( `http://127.0.0.1:${ examplePort } /foo.html` ) ;
796- expect ( await page . content ( ) ) . toContain ( 'from-dummy-server' ) ;
797- expect ( reachedOriginalTarget ) . toBe ( false ) ;
796+ {
797+ await page . setContent ( 'empty' ) ;
798+ await page . goto ( `http://127.0.0.1:${ examplePort } /foo.html` ) ;
799+ expect ( await page . content ( ) ) . toContain ( 'from-dummy-server' ) ;
800+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
801+ }
802+ {
803+ await page . setContent ( 'empty' ) ;
804+ await page . goto ( `http://localhost:${ examplePort } /foo.html` ) ;
805+ expect ( await page . content ( ) ) . toContain ( 'from-dummy-server' ) ;
806+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
807+ }
808+ {
809+ const error = await page . goto ( `http://[::1]:${ examplePort } /foo.html` ) . catch ( ( ) => 'failed' ) ;
810+ expect ( error ) . toBe ( 'failed' ) ;
811+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
812+ }
798813 } ) ;
799814
800815 test ( 'should proxy ipv6 localhost requests @smoke' , async ( { startRemoteServer, server, browserName, connect, platform, ipV6ServerPort } , testInfo ) => {
@@ -809,15 +824,27 @@ for (const kind of ['launchServer', 'run-server'] as const) {
809824 const remoteServer = await startRemoteServer ( kind ) ;
810825 const browser = await connect ( remoteServer . wsEndpoint ( ) , { exposeNetwork : '*' } , ipV6ServerPort ) ;
811826 const page = await browser . newPage ( ) ;
812- await page . goto ( `http://[::1]:${ examplePort } /foo.html` ) ;
813- expect ( await page . content ( ) ) . toContain ( 'from-ipv6-server' ) ;
814- const page2 = await browser . newPage ( ) ;
815- await page2 . goto ( `http://localhost:${ examplePort } /foo.html` ) ;
816- expect ( await page2 . content ( ) ) . toContain ( 'from-ipv6-server' ) ;
817- expect ( reachedOriginalTarget ) . toBe ( false ) ;
827+ {
828+ await page . setContent ( 'empty' ) ;
829+ await page . goto ( `http://[::1]:${ examplePort } /foo.html` ) ;
830+ expect ( await page . content ( ) ) . toContain ( 'from-ipv6-server' ) ;
831+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
832+ }
833+ {
834+ await page . setContent ( 'empty' ) ;
835+ await page . goto ( `http://localhost:${ examplePort } /foo.html` ) ;
836+ expect ( await page . content ( ) ) . toContain ( 'from-ipv6-server' ) ;
837+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
838+ }
839+ {
840+ const error = await page . goto ( `http://127.0.0.1:${ examplePort } /foo.html` ) . catch ( ( ) => 'failed' ) ;
841+ expect ( error ) . toBe ( 'failed' ) ;
842+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
843+ }
818844 } ) ;
819845
820- test ( 'should proxy localhost requests from fetch api' , async ( { startRemoteServer, server, browserName, connect, channel, platform, dummyServerPort } , workerInfo ) => {
846+ test ( 'should proxy requests from fetch api' , async ( { startRemoteServer, server, browserName, connect, channel, platform, dummyServerPort } , workerInfo ) => {
847+ test . fixme ( true , 'broken because of socks proxy agent error: Socks5 proxy rejected connection - ConnectionRefused' ) ;
821848 test . skip ( browserName === 'webkit' && platform === 'darwin' , 'no localhost proxying' ) ;
822849
823850 let reachedOriginalTarget = false ;
@@ -829,10 +856,54 @@ for (const kind of ['launchServer', 'run-server'] as const) {
829856 const remoteServer = await startRemoteServer ( kind ) ;
830857 const browser = await connect ( remoteServer . wsEndpoint ( ) , { exposeNetwork : '*' } , dummyServerPort ) ;
831858 const page = await browser . newPage ( ) ;
832- const response = await page . request . get ( `http://127.0.0.1:${ examplePort } /foo.html` ) ;
833- expect ( response . status ( ) ) . toBe ( 200 ) ;
834- expect ( await response . text ( ) ) . toContain ( 'from-dummy-server' ) ;
835- expect ( reachedOriginalTarget ) . toBe ( false ) ;
859+ {
860+ const response = await page . request . get ( `http://localhost:${ examplePort } /foo.html` ) ;
861+ expect ( response . status ( ) ) . toBe ( 200 ) ;
862+ expect ( await response . text ( ) ) . toContain ( 'from-dummy-server' ) ;
863+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
864+ }
865+ {
866+ const response = await page . request . get ( `http://127.0.0.1:${ examplePort } /foo.html` ) ;
867+ expect ( response . status ( ) ) . toBe ( 200 ) ;
868+ expect ( await response . text ( ) ) . toContain ( 'from-dummy-server' ) ;
869+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
870+ }
871+ {
872+ const error = await page . request . get ( `http://[::1]:${ examplePort } /foo.html` ) . catch ( e => 'failed' ) ;
873+ expect ( error ) . toBe ( 'failed' ) ;
874+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
875+ }
876+ } ) ;
877+
878+ test ( 'should proxy requests from fetch api over ipv6' , async ( { startRemoteServer, server, browserName, connect, channel, platform, ipV6ServerPort } , workerInfo ) => {
879+ test . skip ( browserName === 'webkit' && platform === 'darwin' , 'no localhost proxying' ) ;
880+
881+ let reachedOriginalTarget = false ;
882+ server . setRoute ( '/foo.html' , async ( req , res ) => {
883+ reachedOriginalTarget = true ;
884+ res . end ( '<html><body></body></html>' ) ;
885+ } ) ;
886+ const examplePort = 20_000 + workerInfo . workerIndex * 3 ;
887+ const remoteServer = await startRemoteServer ( kind ) ;
888+ const browser = await connect ( remoteServer . wsEndpoint ( ) , { exposeNetwork : '*' } , ipV6ServerPort ) ;
889+ const page = await browser . newPage ( ) ;
890+ {
891+ const response = await page . request . get ( `http://localhost:${ examplePort } /foo.html` ) ;
892+ expect ( response . status ( ) ) . toBe ( 200 ) ;
893+ expect ( await response . text ( ) ) . toContain ( 'from-ipv6-server' ) ;
894+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
895+ }
896+ {
897+ const response = await page . request . get ( `http://[::1]:${ examplePort } /foo.html` ) ;
898+ expect ( response . status ( ) ) . toBe ( 200 ) ;
899+ expect ( await response . text ( ) ) . toContain ( 'from-ipv6-server' ) ;
900+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
901+ }
902+ {
903+ const error = await page . request . get ( `http://127.0.0.1:${ examplePort } /foo.html` ) . catch ( e => 'failed' ) ;
904+ expect ( error ) . toBe ( 'failed' ) ;
905+ expect ( reachedOriginalTarget ) . toBe ( false ) ;
906+ }
836907 } ) ;
837908
838909 test ( 'should proxy local.playwright requests' , async ( { connect, server, dummyServerPort, startRemoteServer } , workerInfo ) => {
0 commit comments