@@ -4,6 +4,7 @@ var util = require('util'),
4
4
path = require ( 'path' ) ,
5
5
File = require ( './file' ) ,
6
6
defaultOptions = require ( './default_options' ) . defaultOptions ,
7
+ DummyParser = require ( './dummy_parser' ) . DummyParser ,
7
8
MultipartParser = require ( './multipart_parser' ) . MultipartParser ,
8
9
QuerystringParser = require ( './querystring_parser' ) . QuerystringParser ,
9
10
OctetParser = require ( './octet_parser' ) . OctetParser ,
@@ -140,10 +141,7 @@ IncomingForm.prototype.parse = function(req, cb) {
140
141
return ;
141
142
}
142
143
143
- var err = this . _parser . end ( ) ;
144
- if ( err ) {
145
- this . _error ( err ) ;
146
- }
144
+ this . _parser . end ( ) ;
147
145
} ) ;
148
146
149
147
return this ;
@@ -153,6 +151,9 @@ IncomingForm.prototype.writeHeaders = function(headers) {
153
151
this . headers = headers ;
154
152
this . _parseContentLength ( ) ;
155
153
this . _parseContentType ( ) ;
154
+ this . _parser . once ( 'error' , ( error ) => {
155
+ this . _error ( error ) ;
156
+ } ) ;
156
157
} ;
157
158
158
159
IncomingForm . prototype . write = function ( buffer ) {
@@ -167,12 +168,9 @@ IncomingForm.prototype.write = function(buffer) {
167
168
this . bytesReceived += buffer . length ;
168
169
this . emit ( 'progress' , this . bytesReceived , this . bytesExpected ) ;
169
170
170
- var bytesParsed = this . _parser . write ( buffer ) ;
171
- if ( bytesParsed !== buffer . length ) {
172
- this . _error ( new Error ( `parser error,${ bytesParsed } of ${ buffer . length } bytes parsed` ) ) ;
173
- }
171
+ this . _parser . write ( buffer ) ;
174
172
175
- return bytesParsed ;
173
+ return this . bytesReceived ;
176
174
} ;
177
175
178
176
IncomingForm . prototype . pause = function ( ) {
@@ -249,19 +247,10 @@ IncomingForm.prototype.handlePart = function(part) {
249
247
} ) ;
250
248
} ;
251
249
252
- function dummyParser ( incomingForm ) {
253
- return {
254
- end : function ( ) {
255
- incomingForm . ended = true ;
256
- incomingForm . _maybeEnd ( ) ;
257
- return null ;
258
- }
259
- } ;
260
- }
261
250
262
251
IncomingForm . prototype . _parseContentType = function ( ) {
263
252
if ( this . bytesExpected === 0 ) {
264
- this . _parser = dummyParser ( this ) ;
253
+ this . _parser = new DummyParser ( this ) ;
265
254
return ;
266
255
}
267
256
@@ -341,98 +330,103 @@ IncomingForm.prototype._initMultipart = function(boundary) {
341
330
342
331
parser . initWithBoundary ( boundary ) ;
343
332
344
- parser . onPartBegin = function ( ) {
345
- part = new Stream ( ) ;
346
- part . readable = true ;
347
- part . headers = { } ;
348
- part . name = null ;
349
- part . filename = null ;
350
- part . mime = null ;
351
-
352
- part . transferEncoding = 'binary' ;
353
- part . transferBuffer = '' ;
354
-
355
- headerField = '' ;
356
- headerValue = '' ;
357
- } ;
358
-
359
- parser . onHeaderField = ( b , start , end ) => {
360
- headerField += b . toString ( this . encoding , start , end ) ;
361
- } ;
362
-
363
- parser . onHeaderValue = ( b , start , end ) => {
364
- headerValue += b . toString ( this . encoding , start , end ) ;
365
- } ;
366
-
367
- parser . onHeaderEnd = ( ) => {
368
- headerField = headerField . toLowerCase ( ) ;
369
- part . headers [ headerField ] = headerValue ;
370
-
371
- // matches either a quoted-string or a token (RFC 2616 section 19.5.1)
372
- var m = headerValue . match ( / \b n a m e = ( " ( [ ^ " ] * ) " | ( [ ^ \( \) < > @ , ; : \\ " \/ \[ \] \? = \{ \} \s \t / ] + ) ) / i) ;
373
- if ( headerField == 'content-disposition' ) {
374
- if ( m ) {
375
- part . name = m [ 2 ] || m [ 3 ] || '' ;
376
- }
333
+ parser . on ( 'data' , ( { name, buffer, start, end} ) => {
334
+ if ( name === 'partBegin' ) {
335
+ part = new Stream ( ) ;
336
+ part . readable = true ;
337
+ part . headers = { } ;
338
+ part . name = null ;
339
+ part . filename = null ;
340
+ part . mime = null ;
341
+
342
+ part . transferEncoding = 'binary' ;
343
+ part . transferBuffer = '' ;
344
+
345
+ headerField = '' ;
346
+ headerValue = '' ;
347
+ } else if ( name === 'headerField' ) {
348
+ headerField += buffer . toString ( this . encoding , start , end ) ;
349
+ } else if ( name === 'headerValue' ) {
350
+ headerValue += buffer . toString ( this . encoding , start , end ) ;
351
+ } else if ( name === 'headerEnd' ) {
352
+ headerField = headerField . toLowerCase ( ) ;
353
+ part . headers [ headerField ] = headerValue ;
354
+
355
+ // matches either a quoted-string or a token (RFC 2616 section 19.5.1)
356
+ var m = headerValue . match ( / \b n a m e = ( " ( [ ^ " ] * ) " | ( [ ^ \( \) < > @ , ; : \\ " \/ \[ \] \? = \{ \} \s \t / ] + ) ) / i) ;
357
+ if ( headerField == 'content-disposition' ) {
358
+ if ( m ) {
359
+ part . name = m [ 2 ] || m [ 3 ] || '' ;
360
+ }
377
361
378
- part . filename = this . _fileName ( headerValue ) ;
379
- } else if ( headerField == 'content-type' ) {
380
- part . mime = headerValue ;
381
- } else if ( headerField == 'content-transfer-encoding' ) {
382
- part . transferEncoding = headerValue . toLowerCase ( ) ;
383
- }
362
+ part . filename = this . _fileName ( headerValue ) ;
363
+ } else if ( headerField == 'content-type' ) {
364
+ part . mime = headerValue ;
365
+ } else if ( headerField == 'content-transfer-encoding' ) {
366
+ part . transferEncoding = headerValue . toLowerCase ( ) ;
367
+ }
384
368
385
- headerField = '' ;
386
- headerValue = '' ;
387
- } ;
369
+ headerField = '' ;
370
+ headerValue = '' ;
371
+ } else if ( name === 'headersEnd' ) {
372
+
373
+ switch ( part . transferEncoding ) {
374
+ case 'binary' :
375
+ case '7bit' :
376
+ case '8bit' : {
377
+ const dataPropagation = ( { name, buffer, start, end} ) => {
378
+ if ( name === 'partData' ) {
379
+ part . emit ( 'data' , buffer . slice ( start , end ) ) ;
380
+ }
381
+ } ;
382
+ const dataStopPropagation = ( { name} ) => {
383
+ if ( name === 'partEnd' ) {
384
+ part . emit ( 'end' ) ;
385
+ parser . off ( 'data' , dataPropagation ) ;
386
+ parser . off ( 'data' , dataStopPropagation ) ;
387
+ }
388
+ } ;
389
+ parser . on ( 'data' , dataPropagation ) ;
390
+ parser . on ( 'data' , dataStopPropagation ) ;
391
+ break ;
392
+ } case 'base64' : {
393
+ const dataPropagation = ( { name, buffer, start, end} ) => {
394
+ if ( name === 'partData' ) {
395
+ part . transferBuffer += buffer . slice ( start , end ) . toString ( 'ascii' ) ;
396
+
397
+ /*
398
+ four bytes (chars) in base64 converts to three bytes in binary
399
+ encoding. So we should always work with a number of bytes that
400
+ can be divided by 4, it will result in a number of buytes that
401
+ can be divided vy 3.
402
+ */
403
+ var offset = parseInt ( part . transferBuffer . length / 4 , 10 ) * 4 ;
404
+ part . emit ( 'data' , Buffer . from ( part . transferBuffer . substring ( 0 , offset ) , 'base64' ) ) ;
405
+ part . transferBuffer = part . transferBuffer . substring ( offset ) ;
406
+ }
407
+ } ;
408
+ const dataStopPropagation = ( { name} ) => {
409
+ if ( name === 'partEnd' ) {
410
+ part . emit ( 'data' , Buffer . from ( part . transferBuffer , 'base64' ) ) ;
411
+ part . emit ( 'end' ) ;
412
+ parser . off ( 'data' , dataPropagation ) ;
413
+ parser . off ( 'data' , dataStopPropagation ) ;
414
+ }
415
+ } ;
416
+ parser . on ( 'data' , dataPropagation ) ;
417
+ parser . on ( 'data' , dataStopPropagation ) ;
418
+ break ;
419
+
420
+ } default :
421
+ return this . _error ( new Error ( 'unknown transfer-encoding' ) ) ;
422
+ }
388
423
389
- parser . onHeadersEnd = ( ) => {
390
- switch ( part . transferEncoding ) {
391
- case 'binary' :
392
- case '7bit' :
393
- case '8bit' :
394
- parser . onPartData = function ( b , start , end ) {
395
- part . emit ( 'data' , b . slice ( start , end ) ) ;
396
- } ;
397
-
398
- parser . onPartEnd = function ( ) {
399
- part . emit ( 'end' ) ;
400
- } ;
401
- break ;
402
-
403
- case 'base64' :
404
- parser . onPartData = function ( b , start , end ) {
405
- part . transferBuffer += b . slice ( start , end ) . toString ( 'ascii' ) ;
406
-
407
- /*
408
- four bytes (chars) in base64 converts to three bytes in binary
409
- encoding. So we should always work with a number of bytes that
410
- can be divided by 4, it will result in a number of buytes that
411
- can be divided vy 3.
412
- */
413
- var offset = parseInt ( part . transferBuffer . length / 4 , 10 ) * 4 ;
414
- part . emit ( 'data' , Buffer . from ( part . transferBuffer . substring ( 0 , offset ) , 'base64' ) ) ;
415
- part . transferBuffer = part . transferBuffer . substring ( offset ) ;
416
- } ;
417
-
418
- parser . onPartEnd = function ( ) {
419
- part . emit ( 'data' , Buffer . from ( part . transferBuffer , 'base64' ) ) ;
420
- part . emit ( 'end' ) ;
421
- } ;
422
- break ;
423
-
424
- default :
425
- return this . _error ( new Error ( 'unknown transfer-encoding' ) ) ;
424
+ this . onPart ( part ) ;
425
+ } else if ( name === 'end' ) {
426
+ this . ended = true ;
427
+ this . _maybeEnd ( ) ;
426
428
}
427
-
428
- this . onPart ( part ) ;
429
- } ;
430
-
431
-
432
- parser . onEnd = ( ) => {
433
- this . ended = true ;
434
- this . _maybeEnd ( ) ;
435
- } ;
429
+ } ) ;
436
430
437
431
this . _parser = parser ;
438
432
} ;
@@ -456,9 +450,9 @@ IncomingForm.prototype._initUrlencoded = function() {
456
450
457
451
var parser = new QuerystringParser ( this . maxFields ) ;
458
452
459
- parser . onField = ( key , val ) => {
460
- this . emit ( 'field' , key , val ) ;
461
- } ;
453
+ parser . on ( 'data' , ( { key, value } ) => {
454
+ this . emit ( 'field' , key , value ) ;
455
+ } ) ;
462
456
463
457
parser . onEnd = ( ) => {
464
458
this . ended = true ;
@@ -525,16 +519,19 @@ IncomingForm.prototype._initOctetStream = function() {
525
519
IncomingForm . prototype . _initJSONencoded = function ( ) {
526
520
this . type = 'json' ;
527
521
528
- var parser = new JSONParser ( this ) ;
522
+ var parser = new JSONParser ( ) ;
529
523
530
- parser . onField = ( key , val ) => {
531
- this . emit ( 'field' , key , val ) ;
532
- } ;
524
+ parser . on ( 'data' , ( { key, value } ) => {
525
+ this . emit ( 'field' , key , value ) ;
526
+ } ) ;
527
+ // parser.on('data', (key) => {
528
+ // this.emit('field', key);
529
+ // });
533
530
534
- parser . onEnd = ( ) => {
531
+ parser . once ( 'end' , ( ) => {
535
532
this . ended = true ;
536
533
this . _maybeEnd ( ) ;
537
- } ;
534
+ } ) ;
538
535
539
536
this . _parser = parser ;
540
537
} ;
0 commit comments