@@ -5,7 +5,7 @@ const { createServer } = require('node:http')
5
5
const { once } = require ( 'node:events' )
6
6
const { tspl } = require ( '@matteo.collina/tspl' )
7
7
8
- const { Client, interceptors } = require ( '../..' )
8
+ const { Client, Agent , interceptors } = require ( '../..' )
9
9
const { dump } = interceptors
10
10
11
11
if ( platform ( ) === 'win32' ) {
@@ -14,6 +14,71 @@ if (platform() === 'win32') {
14
14
process . exit ( 0 )
15
15
}
16
16
17
+ test ( 'Should handle preemptive network error' , async t => {
18
+ t = tspl ( t , { plan : 4 } )
19
+ let offset = 0
20
+ const server = createServer ( { joinDuplicateHeaders : true } , ( req , res ) => {
21
+ const max = 1024 * 1024
22
+ const buffer = Buffer . alloc ( max )
23
+
24
+ res . writeHead ( 200 , {
25
+ 'Content-Length' : buffer . length ,
26
+ 'Content-Type' : 'application/octet-stream'
27
+ } )
28
+
29
+ const interval = setInterval ( ( ) => {
30
+ offset += 256
31
+ const chunk = buffer . subarray ( offset - 256 , offset )
32
+
33
+ if ( offset === max ) {
34
+ clearInterval ( interval )
35
+ res . end ( chunk )
36
+ return
37
+ }
38
+
39
+ res . write ( chunk )
40
+ } , 0 )
41
+ } )
42
+
43
+ const requestOptions = {
44
+ method : 'GET' ,
45
+ path : '/'
46
+ }
47
+
48
+ const client = new Agent ( ) . compose ( dump ( { maxSize : 1024 * 1024 } ) )
49
+
50
+ after ( async ( ) => {
51
+ await client . close ( )
52
+
53
+ server . close ( )
54
+ await once ( server , 'close' )
55
+ } )
56
+
57
+ try {
58
+ await client . request ( {
59
+ origin : 'http://localhost' ,
60
+ ...requestOptions
61
+ } )
62
+ } catch ( error ) {
63
+ t . equal ( error . code , 'ECONNREFUSED' )
64
+ }
65
+
66
+ server . listen ( 0 )
67
+ await once ( server , 'listening' )
68
+
69
+ const response = await client . request ( {
70
+ origin : `http://localhost:${ server . address ( ) . port } ` ,
71
+ ...requestOptions
72
+ } )
73
+ const body = await response . body . text ( )
74
+
75
+ t . equal ( response . headers [ 'content-length' ] , `${ 1024 * 1024 } ` )
76
+ t . equal ( response . statusCode , 200 )
77
+ t . equal ( body , '' )
78
+
79
+ await t . completed
80
+ } )
81
+
17
82
test ( 'Should dump on abort' , async t => {
18
83
t = tspl ( t , { plan : 2 } )
19
84
let offset = 0
0 commit comments