File tree Expand file tree Collapse file tree 2 files changed +42
-3
lines changed Expand file tree Collapse file tree 2 files changed +42
-3
lines changed Original file line number Diff line number Diff line change @@ -605,7 +605,28 @@ class Parser : public AsyncWrap, public StreamListener {
605605    size_t  nparsed =
606606      http_parser_execute (&parser_, &settings, data, len);
607607
608-     Save ();
608+     enum  http_errno err = HTTP_PARSER_ERRNO (&parser_);
609+ 
610+     //  Finish()
611+     if  (data == nullptr ) {
612+       //  `http_parser_execute()` returns either `0` or `1` when `len` is 0
613+       //  (part of the finishing sequence).
614+       CHECK_EQ (len, 0 );
615+       switch  (nparsed) {
616+         case  0 :
617+           err = HPE_OK;
618+           break ;
619+         case  1 :
620+           nparsed = 0 ;
621+           break ;
622+         default :
623+           UNREACHABLE ();
624+       }
625+ 
626+     //  Regular Execute()
627+     } else  {
628+       Save ();
629+     }
609630
610631    //  Unassign the 'buffer_' variable
611632    current_buffer_.Clear ();
@@ -619,7 +640,7 @@ class Parser : public AsyncWrap, public StreamListener {
619640    Local<Integer> nparsed_obj = Integer::New (env ()->isolate (), nparsed);
620641    //  If there was a parse error in one of the callbacks
621642    //  TODO(bnoordhuis) What if there is an error on EOF?
622-     if  (!parser_.upgrade  && nparsed  != len ) {
643+     if  (!parser_.upgrade  && err  != HPE_OK ) {
623644      enum  http_errno err = HTTP_PARSER_ERRNO (&parser_);
624645
625646      Local<Value> e = Exception::Error (env ()->parse_error_string ());
@@ -631,6 +652,11 @@ class Parser : public AsyncWrap, public StreamListener {
631652
632653      return  scope.Escape (e);
633654    }
655+ 
656+     //  No return value is needed for `Finish()`
657+     if  (data == nullptr ) {
658+       return  scope.Escape (Local<Value>());
659+     }
634660    return  scope.Escape (nparsed_obj);
635661  }
636662
Original file line number Diff line number Diff line change 11'use strict' ; 
22
3- require ( '../common' ) ; 
3+ const   common   =   require ( '../common' ) ; 
44const  assert  =  require ( 'assert' ) ; 
55const  {  spawnSync }  =  require ( 'child_process' ) ; 
66const  http  =  require ( 'http' ) ; 
@@ -9,3 +9,16 @@ assert.strictEqual(http.maxHeaderSize, 8 * 1024);
99const  child  =  spawnSync ( process . execPath ,  [ '--max-http-header-size=10' ,  '-p' , 
1010                                           'http.maxHeaderSize' ] ) ; 
1111assert . strictEqual ( + child . stdout . toString ( ) . trim ( ) ,  10 ) ; 
12+ 
13+ { 
14+   const  server  =  http . createServer ( common . mustNotCall ( ) ) ; 
15+   server . listen ( 0 ,  common . mustCall ( ( )  =>  { 
16+     http . get ( { 
17+       port : server . address ( ) . port , 
18+       headers : {  foo : 'x' . repeat ( http . maxHeaderSize  +  1 )  } 
19+     } ,  common . mustCall ( ( res )  =>  { 
20+       assert . strictEqual ( res . statusCode ,  400 ) ; 
21+       server . close ( ) ; 
22+     } ) ) ; 
23+   } ) ) ; 
24+ } 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments