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