1
1
import fs from 'fs' ;
2
+ import net from 'net' ;
2
3
import http from 'http' ;
3
4
import https from 'https' ;
4
5
import assert from 'assert' ;
@@ -32,25 +33,25 @@ describe('HttpsProxyAgent', () => {
32
33
beforeAll ( async ( ) => {
33
34
// setup target HTTP server
34
35
server = http . createServer ( ) ;
35
- serverUrl = ( await listen ( server ) ) as URL ;
36
+ serverUrl = await listen ( server ) ;
36
37
} ) ;
37
38
38
39
beforeAll ( async ( ) => {
39
40
// setup HTTP proxy server
40
41
proxy = createProxy ( ) ;
41
- proxyUrl = ( await listen ( proxy ) ) as URL ;
42
+ proxyUrl = await listen ( proxy ) ;
42
43
} ) ;
43
44
44
45
beforeAll ( async ( ) => {
45
46
// setup target HTTPS server
46
47
sslServer = https . createServer ( sslOptions ) ;
47
- sslServerUrl = ( await listen ( sslServer ) ) as URL ;
48
+ sslServerUrl = await listen ( sslServer ) ;
48
49
} ) ;
49
50
50
51
beforeAll ( async ( ) => {
51
52
// setup SSL HTTP proxy server
52
53
sslProxy = createProxy ( https . createServer ( sslOptions ) ) ;
53
- sslProxyUrl = ( await listen ( sslProxy ) ) as URL ;
54
+ sslProxyUrl = await listen ( sslProxy ) ;
54
55
} ) ;
55
56
56
57
beforeEach ( ( ) => {
@@ -197,7 +198,11 @@ describe('HttpsProxyAgent', () => {
197
198
198
199
const connectPromise = once ( server , 'connect' ) ;
199
200
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
+ } ) ;
201
206
202
207
const [ req , socket ] = await connectPromise ;
203
208
assert . equal ( 'CONNECT' , req . method ) ;
@@ -212,15 +217,23 @@ describe('HttpsProxyAgent', () => {
212
217
} ) ;
213
218
214
219
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
+ } ) ;
216
225
217
226
const [ req , socket ] = await connectPromise ;
218
227
assert . equal ( 'CONNECT' , req . method ) ;
219
228
assert . equal ( '1' , req . headers . number ) ;
220
229
socket . destroy ( ) ;
221
230
222
231
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
+ } ) ;
224
237
225
238
const [ req2 , socket2 ] = await connectPromise2 ;
226
239
assert . equal ( 'CONNECT' , req2 . method ) ;
@@ -252,6 +265,30 @@ describe('HttpsProxyAgent', () => {
252
265
agent . destroy ( ) ;
253
266
}
254
267
} ) ;
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
+ } ) ;
255
292
} ) ;
256
293
257
294
describe ( '"https" module' , ( ) => {
1 commit comments
vercel[bot] commentedon May 24, 2023
Successfully deployed to the following URLs:
proxy-agents – ./
proxy-agents-tootallnate.vercel.app
proxy-agents.vercel.app
proxy-agents-git-main-tootallnate.vercel.app