| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent a5b1be2 commit 5198573
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -189,8 +189,8 @@ function freeParser(parser, req, socket) { | |||
| 189 | 189 | if (parser) { | |
| 190 | 190 | if (parser._consumed) | |
| 191 | 191 | parser.unconsume(); | |
| 192 | - cleanParser(parser); | ||
| 193 | 192 | parser.remove(); | |
| 193 | + cleanParser(parser); | ||
| 194 | 194 | if (parsers.free(parser) === false) { | |
| 195 | 195 | // Make sure the parser's stack has unwound before deleting the | |
| 196 | 196 | // corresponding C++ object through .close(). | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -628,6 +628,8 @@ class Parser : public AsyncWrap, public StreamListener { | |||
| 628 | 628 | Parser* parser; | |
| 629 | 629 | ASSIGN_OR_RETURN_UNWRAP(&parser, args.This()); | |
| 630 | 630 | ||
| 631 | + parser->is_being_freed_ = true; | ||
| 632 | + | ||
| 631 | 633 | if (parser->connectionsList_ != nullptr) { | |
| 632 | 634 | parser->connectionsList_->Pop(parser); | |
| 633 | 635 | parser->connectionsList_->PopActive(parser); | |
@@ -1012,6 +1014,7 @@ class Parser : public AsyncWrap, public StreamListener { | |||
| 1012 | 1014 | num_values_ = 0; | |
| 1013 | 1015 | have_flushed_ = false; | |
| 1014 | 1016 | got_exception_ = false; | |
| 1017 | + is_being_freed_ = false; | ||
| 1015 | 1018 | headers_completed_ = false; | |
| 1016 | 1019 | max_http_header_size_ = max_http_header_size; | |
| 1017 | 1020 | } | |
@@ -1056,6 +1059,7 @@ class Parser : public AsyncWrap, public StreamListener { | |||
| 1056 | 1059 | size_t num_values_; | |
| 1057 | 1060 | bool have_flushed_; | |
| 1058 | 1061 | bool got_exception_; | |
| 1062 | + bool is_being_freed_ = false; | ||
| 1059 | 1063 | size_t current_buffer_len_; | |
| 1060 | 1064 | const char* current_buffer_data_; | |
| 1061 | 1065 | bool headers_completed_ = false; | |
@@ -1075,6 +1079,9 @@ class Parser : public AsyncWrap, public StreamListener { | |||
| 1075 | 1079 | struct Proxy<int (Parser::*)(Args...), Member> { | |
| 1076 | 1080 | static int Raw(llhttp_t* p, Args ... args) { | |
| 1077 | 1081 | Parser* parser = ContainerOf(&Parser::parser_, p); | |
| 1082 | + if (parser->is_being_freed_) { | ||
| 1083 | + return 0; | ||
| 1084 | + } | ||
| 1078 | 1085 | int rv = (parser->*Member)(std::forward<Args>(args)...); | |
| 1079 | 1086 | if (rv == 0) { | |
| 1080 | 1087 | rv = parser->MaybePause(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,23 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../common'); | ||
| 4 | + const { createServer } = require('http'); | ||
| 5 | + const { connect } = require('net'); | ||
| 6 | + | ||
| 7 | + // Regression test: ensure llhttp_execute() is aborted when freeParser() is | ||
| 8 | + // called synchronously during parsing of pipelined requests. | ||
| 9 | + const server = createServer(common.mustCall((req, res) => { | ||
| 10 | + req.socket.emit('close'); | ||
| 11 | + res.end(); | ||
| 12 | + }, 1)); | ||
| 13 | + | ||
| 14 | + server.unref(); | ||
| 15 | + | ||
| 16 | + server.listen(0, common.mustCall(() => { | ||
| 17 | + // Two pipelined requests in one write, processed by a single llhttp_execute(). | ||
| 18 | + const client = connect(server.address().port); | ||
| 19 | + client.end( | ||
| 20 | + 'GET / HTTP/1.1\r\nHost: localhost\r\nConnection: keep-alive\r\n\r\n' + | ||
| 21 | + 'GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n', | ||
| 22 | + ); | ||
| 23 | + })); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments