Browse Source

http: reset stream to unconsumed in `unconsume()`

Reset the underlying socket of an HTTP stream to be marked as
unconsume after the HTTP parser no longer owns it.

Fixes: https://github.com/nodejs/node/issues/14407
PR-URL: https://github.com/nodejs/node/pull/14410
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
v6
Anna Henningsen 8 years ago
parent
commit
29353e5a99
No known key found for this signature in database GPG Key ID: D8B9F5AEAE84E4CF
  1. 1
      src/node_http_parser.cc
  2. 5
      src/stream_base.h
  3. 29
      test/parallel/test-http-upgrade-reconsume-stream.js

1
src/node_http_parser.cc

@ -527,6 +527,7 @@ class Parser : public AsyncWrap {
stream->set_alloc_cb(parser->prev_alloc_cb_);
stream->set_read_cb(parser->prev_read_cb_);
stream->Unconsume();
}
parser->prev_alloc_cb_.clear();

5
src/stream_base.h

@ -234,6 +234,11 @@ class StreamBase : public StreamResource {
consumed_ = true;
}
inline void Unconsume() {
CHECK_EQ(consumed_, true);
consumed_ = false;
}
template <class Outer>
inline Outer* Cast() { return static_cast<Outer*>(Cast()); }

29
test/parallel/test-http-upgrade-reconsume-stream.js

@ -0,0 +1,29 @@
'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const tls = require('tls');
const http = require('http');
// Tests that, after the HTTP parser stopped owning a socket that emits an
// 'upgrade' event, another C++ stream can start owning it (e.g. a TLSSocket).
const server = http.createServer(common.mustNotCall());
server.on('upgrade', common.mustCall((request, socket, head) => {
// This should not crash.
new tls.TLSSocket(socket);
server.close();
socket.destroy();
}));
server.listen(0, common.mustCall(() => {
http.get({
port: server.address().port,
headers: {
'Connection': 'Upgrade',
'Upgrade': 'websocket'
}
}).on('error', () => {});
}));
Loading…
Cancel
Save