@@ -7,6 +7,8 @@ var util = require('./_util')
77var multer = require ( '../' )
88var stream = require ( 'stream' )
99var FormData = require ( 'form-data' )
10+ var http = require ( 'http' )
11+ var net = require ( 'net' )
1012
1113function withLimits ( limits , fields ) {
1214 var storage = multer . memoryStorage ( )
@@ -277,4 +279,52 @@ describe('Error Handling', function () {
277279 done ( )
278280 } )
279281 } )
282+
283+ it ( 'should not hang when client aborts multipart upload' , function ( done ) {
284+ this . timeout ( 5000 )
285+
286+ var upload = multer ( { storage : multer . memoryStorage ( ) } ) . any ( )
287+
288+ var server = http . createServer ( function ( req , res ) {
289+ var hung = false
290+
291+ var timer = setTimeout ( function ( ) {
292+ hung = true
293+ server . close ( )
294+ done ( new Error ( 'Middleware hung when client aborted request' ) )
295+ } , 1000 )
296+
297+ upload ( req , res , function ( /* err */ ) {
298+ if ( hung ) return
299+ clearTimeout ( timer )
300+ server . close ( )
301+ done ( )
302+ } )
303+ } )
304+
305+ server . listen ( 0 , function ( ) {
306+ var port = server . address ( ) . port
307+ var boundary = 'PoC' + Date . now ( )
308+ var sock = new net . Socket ( )
309+
310+ sock . connect ( port , '127.0.0.1' , function ( ) {
311+ sock . write (
312+ 'POST / HTTP/1.1\r\n' +
313+ 'Host: localhost\r\n' +
314+ 'Content-Type: multipart/form-data; boundary=' + boundary + '\r\n' +
315+ 'Content-Length: 999999\r\n\r\n' +
316+ '--' + boundary + '\r\n' +
317+ 'Content-Disposition: form-data; name="file"; filename="test.bin"\r\n' +
318+ 'Content-Type: application/octet-stream\r\n\r\n' +
319+ 'AAAAAAAAAAAAAAAA'
320+ )
321+
322+ setTimeout ( function ( ) {
323+ sock . destroy ( )
324+ } , 50 )
325+ } )
326+
327+ sock . on ( 'error' , function ( ) { } )
328+ } )
329+ } )
280330} )
0 commit comments