11import fs from 'fs' ;
2+ import net from 'net' ;
23import http from 'http' ;
34import https from 'https' ;
45import assert from 'assert' ;
@@ -32,25 +33,25 @@ describe('HttpsProxyAgent', () => {
3233 beforeAll ( async ( ) => {
3334 // setup target HTTP server
3435 server = http . createServer ( ) ;
35- serverUrl = ( await listen ( server ) ) as URL ;
36+ serverUrl = await listen ( server ) ;
3637 } ) ;
3738
3839 beforeAll ( async ( ) => {
3940 // setup HTTP proxy server
4041 proxy = createProxy ( ) ;
41- proxyUrl = ( await listen ( proxy ) ) as URL ;
42+ proxyUrl = await listen ( proxy ) ;
4243 } ) ;
4344
4445 beforeAll ( async ( ) => {
4546 // setup target HTTPS server
4647 sslServer = https . createServer ( sslOptions ) ;
47- sslServerUrl = ( await listen ( sslServer ) ) as URL ;
48+ sslServerUrl = await listen ( sslServer ) ;
4849 } ) ;
4950
5051 beforeAll ( async ( ) => {
5152 // setup SSL HTTP proxy server
5253 sslProxy = createProxy ( https . createServer ( sslOptions ) ) ;
53- sslProxyUrl = ( await listen ( sslProxy ) ) as URL ;
54+ sslProxyUrl = await listen ( sslProxy ) ;
5455 } ) ;
5556
5657 beforeEach ( ( ) => {
@@ -197,7 +198,11 @@ describe('HttpsProxyAgent', () => {
197198
198199 const connectPromise = once ( server , 'connect' ) ;
199200
200- http . get ( { agent } ) ;
201+ http . get ( { agent } ) . on ( 'error' , ( ) => {
202+ // "error" happens because agent didn't receive proper
203+ // CONNECT response before the socket was closed.
204+ // We can safely ignore that.
205+ } ) ;
201206
202207 const [ req , socket ] = await connectPromise ;
203208 assert . equal ( 'CONNECT' , req . method ) ;
@@ -212,15 +217,23 @@ describe('HttpsProxyAgent', () => {
212217 } ) ;
213218
214219 const connectPromise = once ( server , 'connect' ) ;
215- http . get ( { agent } ) ;
220+ http . get ( { agent } ) . on ( 'error' , ( ) => {
221+ // "error" happens because agent didn't receive proper
222+ // CONNECT response before the socket was closed.
223+ // We can safely ignore that.
224+ } ) ;
216225
217226 const [ req , socket ] = await connectPromise ;
218227 assert . equal ( 'CONNECT' , req . method ) ;
219228 assert . equal ( '1' , req . headers . number ) ;
220229 socket . destroy ( ) ;
221230
222231 const connectPromise2 = once ( server , 'connect' ) ;
223- http . get ( { agent } ) ;
232+ http . get ( { agent } ) . on ( 'error' , ( ) => {
233+ // "error" happens because agent didn't receive proper
234+ // CONNECT response before the socket was closed.
235+ // We can safely ignore that.
236+ } ) ;
224237
225238 const [ req2 , socket2 ] = await connectPromise2 ;
226239 assert . equal ( 'CONNECT' , req2 . method ) ;
@@ -252,6 +265,30 @@ describe('HttpsProxyAgent', () => {
252265 agent . destroy ( ) ;
253266 }
254267 } ) ;
268+
269+ it ( 'should emit "error" on request if proxy has invalid header' , async ( ) => {
270+ const badProxy = net . createServer ( ( socket ) => {
271+ socket . write (
272+ 'HTTP/1.1 200 Connection established\r\nbadheader\r\n\r\n'
273+ ) ;
274+ } ) ;
275+ const addr = await listen ( badProxy ) ;
276+ let err : Error | undefined ;
277+ try {
278+ const agent = new HttpsProxyAgent (
279+ addr . href . replace ( 'tcp' , 'http' )
280+ ) ;
281+ await req ( 'http://example.com' , { agent } ) ;
282+ } catch ( _err ) {
283+ err = _err as Error ;
284+ } finally {
285+ badProxy . close ( ) ;
286+ }
287+ assert ( err ) ;
288+ expect ( err . message ) . toEqual (
289+ 'Invalid header from proxy CONNECT response: "badheader"'
290+ ) ;
291+ } ) ;
255292 } ) ;
256293
257294 describe ( '"https" module' , ( ) => {
0 commit comments