Skip to content

Commit

Permalink
http: handle cases where socket.server is null
Browse files Browse the repository at this point in the history
Fixes a regression that caused an error to be thrown when trying to
emit the 'timeout' event on the server referenced by `socket.server`.

Fixes: #13435
Refs: #11926
PR-URL: #13578
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
lpinca authored and addaleax committed Jun 12, 2017
1 parent 38a1cfb commit fff8a56
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/_http_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ function connectionListener(socket) {

httpSocketSetup(socket);

// Ensure that the server property of the socket is correctly set.
// See https://github.com/nodejs/node/issues/13435
if (socket.server === null)
socket.server = this;

// If the user has added a listener to the server,
// request, or response, then it's their responsibility.
// otherwise, destroy on timeout by default
Expand Down
39 changes: 39 additions & 0 deletions test/parallel/test-cluster-send-socket-to-worker-http-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';

// Regression test for https://github.com/nodejs/node/issues/13435
// Tests that `socket.server` is correctly set when a socket is sent to a worker
// and the `'connection'` event is emitted manually on an HTTP server.

const common = require('../common');
const assert = require('assert');
const cluster = require('cluster');
const http = require('http');
const net = require('net');

if (cluster.isMaster) {
const worker = cluster.fork();
const server = net.createServer(common.mustCall((socket) => {
worker.send('socket', socket);
}));

worker.on('exit', common.mustCall((code) => {
assert.strictEqual(code, 0);
server.close();
}));

server.listen(0, common.mustCall(() => {
net.createConnection(server.address().port);
}));
} else {
const server = http.createServer();

server.on('connection', common.mustCall((socket) => {
assert.strictEqual(socket.server, server);
socket.destroy();
cluster.worker.disconnect();
}));

process.on('message', common.mustCall((message, socket) => {
server.emit('connection', socket);
}));
}

0 comments on commit fff8a56

Please sign in to comment.