From 118a7e86479c7c17c12a1eebcab9fce0659803a3 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 31 Jul 2020 14:42:39 +0200 Subject: [PATCH 1/3] http: reset headers timeout on headers complete headers timeout should not occur *after* headers have been received. Fixes: https://github.com/nodejs/node/issues/34576 --- src/node_http_parser.cc | 2 + .../test-http-parser-timeout-reset.js | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/parallel/test-http-parser-timeout-reset.js diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index c7a3df8d067af4..555a25e0d3f94b 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -297,6 +297,8 @@ class Parser : public AsyncWrap, public StreamListener { A_MAX }; + header_parsing_start_time_ = 0; + Local argv[A_MAX]; Local obj = object(); Local cb = obj->Get(env()->context(), diff --git a/test/parallel/test-http-parser-timeout-reset.js b/test/parallel/test-http-parser-timeout-reset.js new file mode 100644 index 00000000000000..7d5bafa435e96a --- /dev/null +++ b/test/parallel/test-http-parser-timeout-reset.js @@ -0,0 +1,46 @@ +'use strict'; +const common = require('../common'); + +const net = require('net'); +const { HTTPParser } = process.binding('http_parser'); // eslint-disable-line + +const server = net.createServer((socket) => { + socket.write('HTTP/1.1 200 OK\r\n'); + socket.write('Transfer-Encoding: chunked\r\n\r\n'); + setTimeout(() => { + socket.write('1\r\n'); + socket.write('\n\r\n'); + setTimeout(() => { + socket.write('1\r\n'); + socket.write('\n\r\n'); + setImmediate(() => { + socket.destroy(); + server.close(); + }); + }, 500); + }, 500); +}).listen(0, () => { + const socket = net.connect(server.address().port); + const parser = new HTTPParser(HTTPParser.RESPONSE, false); + parser.initialize( + HTTPParser.RESPONSE, + {}, + 0, + false, + 1e3 + ); + + parser[HTTPParser.kOnTimeout] = common.mustNotCall(); + + parser[HTTPParser.kOnHeaders] = common.mustNotCall(); + + parser[HTTPParser.kOnExecute] = common.mustCall(3); + + parser[HTTPParser.kOnHeadersComplete] = common.mustCall(); + + parser[HTTPParser.kOnBody] = common.mustCall(2); + + parser[HTTPParser.kOnMessageComplete] = common.mustNotCall(); + + parser.consume(socket._handle); +}); From 936ed553a61b6b2d34ba530d3718b0484a58c680 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 31 Jul 2020 14:53:38 +0200 Subject: [PATCH 2/3] fix: linting --- test/parallel/test-http-parser-timeout-reset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-http-parser-timeout-reset.js b/test/parallel/test-http-parser-timeout-reset.js index 7d5bafa435e96a..c9daa7c2124a73 100644 --- a/test/parallel/test-http-parser-timeout-reset.js +++ b/test/parallel/test-http-parser-timeout-reset.js @@ -2,7 +2,7 @@ const common = require('../common'); const net = require('net'); -const { HTTPParser } = process.binding('http_parser'); // eslint-disable-line +const { HTTPParser } = process.binding('http_parser'); const server = net.createServer((socket) => { socket.write('HTTP/1.1 200 OK\r\n'); From 0d985e1fc5e8495e489f771289d85a39446f582d Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 31 Jul 2020 14:59:11 +0200 Subject: [PATCH 3/3] fixup: style --- src/node_http_parser.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index 555a25e0d3f94b..b409d007307877 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -280,6 +280,7 @@ class Parser : public AsyncWrap, public StreamListener { int on_headers_complete() { header_nread_ = 0; + header_parsing_start_time_ = 0; // Arguments for the on-headers-complete javascript callback. This // list needs to be kept in sync with the actual argument list for @@ -297,8 +298,6 @@ class Parser : public AsyncWrap, public StreamListener { A_MAX }; - header_parsing_start_time_ = 0; - Local argv[A_MAX]; Local obj = object(); Local cb = obj->Get(env()->context(),