GeezerVison is showing github.com — http: fix http server connection list when close · nodejs/node@25ec71d
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/_http_common.js +1Lines changed: 1 addition & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -182,6 +182,7 @@ function freeParser(parser, req, socket) { | 182 | 182 | if (parser._consumed) | 183 | 183 | parser.unconsume(); | 184 | 184 | cleanParser(parser); | | 185 | + parser.remove(); | 185 | 186 | if (parsers.free(parser) === false) { | 186 | 187 | // Make sure the parser's stack has unwound before deleting the | 187 | 188 | // corresponding C++ object through .close(). | |
Collapse file Copy file name to clipboardExpand all lines: src/node_http_parser.cc +10-5Lines changed: 10 additions & 5 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -548,17 +548,21 @@ class Parser : public AsyncWrap, public StreamListener { | 548 | 548 | Parser* parser; | 549 | 549 | ASSIGN_OR_RETURN_UNWRAP(&parser, args.Holder()); | 550 | 550 |
| 551 | | - if (parser->connectionsList_ != nullptr) { | 552 | | - parser->connectionsList_->Pop(parser); | 553 | | - parser->connectionsList_->PopActive(parser); | 554 | | - } | 555 | | - | 556 | 551 | // Since the Parser destructor isn't going to run the destroy() callbacks | 557 | 552 | // it needs to be triggered manually. | 558 | 553 | parser->EmitTraceEventDestroy(); | 559 | 554 | parser->EmitDestroy(); | 560 | 555 | } | 561 | 556 |
| | 557 | + static void Remove(const FunctionCallbackInfo<Value>& args) { | | 558 | + Parser* parser; | | 559 | + ASSIGN_OR_RETURN_UNWRAP(&parser, args.Holder()); | | 560 | + | | 561 | + if (parser->connectionsList_ != nullptr) { | | 562 | + parser->connectionsList_->Pop(parser); | | 563 | + parser->connectionsList_->PopActive(parser); | | 564 | + } | | 565 | + } | 562 | 566 |
| 563 | 567 | void Save() { | 564 | 568 | url_.Save(); | @@ -1221,6 +1225,7 @@ void InitializeHttpParser(Local<Object> target, | 1221 | 1225 | t->Inherit(AsyncWrap::GetConstructorTemplate(env)); | 1222 | 1226 | env->SetProtoMethod(t, "close", Parser::Close); | 1223 | 1227 | env->SetProtoMethod(t, "free", Parser::Free); | | 1228 | + env->SetProtoMethod(t, "remove", Parser::Remove); | 1224 | 1229 | env->SetProtoMethod(t, "execute", Parser::Execute); | 1225 | 1230 | env->SetProtoMethod(t, "finish", Parser::Finish); | 1226 | 1231 | env->SetProtoMethod(t, "initialize", Parser::Initialize); | |
Collapse file Copy file name to clipboard +47Lines changed: 47 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | + | | 3 | +const common = require('../common'); | | 4 | +const http = require('http'); | | 5 | + | | 6 | +function request(server) { | | 7 | + http.get({ | | 8 | + port: server.address().port, | | 9 | + path: '/', | | 10 | + }, (res) => { | | 11 | + res.resume(); | | 12 | + }); | | 13 | +} | | 14 | + | | 15 | +{ | | 16 | + const server = http.createServer((req, res) => { | | 17 | + // Hack to not remove parser out of server.connectionList | | 18 | + // See `freeParser` in _http_common.js | | 19 | + req.socket.parser.free = common.mustCall(); | | 20 | + req.socket.on('close', common.mustCall(() => { | | 21 | + server.close(); | | 22 | + })); | | 23 | + res.end('ok'); | | 24 | + }).listen(0, common.mustCall(() => { | | 25 | + request(server); | | 26 | + })); | | 27 | +} | | 28 | + | | 29 | +{ | | 30 | + const server = http.createServer((req, res) => { | | 31 | + // See `freeParser` in _http_common.js | | 32 | + const { parser } = req.socket; | | 33 | + parser.free = common.mustCall(() => { | | 34 | + setImmediate(common.mustCall(() => { | | 35 | + parser.close(); | | 36 | + })); | | 37 | + }); | | 38 | + req.socket.on('close', common.mustCall(() => { | | 39 | + setImmediate(common.mustCall(() => { | | 40 | + server.close(); | | 41 | + })); | | 42 | + })); | | 43 | + res.end('ok'); | | 44 | + }).listen(0, common.mustCall(() => { | | 45 | + request(server); | | 46 | + })); | | 47 | +} |
|