Skip to content

Commit e2400f8

Browse files
isaacskoichik
authored andcommitted
http: Do not setTimeout a not-yet-existent socket
Fixes #4967
1 parent 21a9966 commit e2400f8

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

lib/http.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,9 @@ function OutgoingMessage() {
445445

446446
this.finished = false;
447447
this._hangupClose = false;
448+
449+
this.socket = null;
450+
this.connection = null;
448451
}
449452
util.inherits(OutgoingMessage, Stream);
450453

@@ -455,7 +458,12 @@ exports.OutgoingMessage = OutgoingMessage;
455458
OutgoingMessage.prototype.setTimeout = function(msecs, callback) {
456459
if (callback)
457460
this.on('timeout', callback);
458-
this.socket.setTimeout(msecs);
461+
if (!this.socket) {
462+
this.once('socket', function(socket) {
463+
socket.setTimeout(msecs);
464+
});
465+
} else
466+
this.socket.setTimeout(msecs);
459467
};
460468

461469

@@ -1056,6 +1064,7 @@ ServerResponse.prototype.assignSocket = function(socket) {
10561064
socket.on('close', onServerResponseClose);
10571065
this.socket = socket;
10581066
this.connection = socket;
1067+
this.emit('socket', socket);
10591068
this._flush();
10601069
};
10611070

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright Joyent, Inc. and other Node contributors.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a
4+
// copy of this software and associated documentation files (the
5+
// "Software"), to deal in the Software without restriction, including
6+
// without limitation the rights to use, copy, modify, merge, publish,
7+
// distribute, sublicense, and/or sell copies of the Software, and to permit
8+
// persons to whom the Software is furnished to do so, subject to the
9+
// following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included
12+
// in all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21+
22+
var common = require('../common');
23+
var assert = require('assert');
24+
25+
var http = require('http');
26+
var net = require('net');
27+
28+
var server = http.createServer(function(req, res) {
29+
console.log('get', req.url);
30+
res.setTimeout(100, function() {
31+
console.log('timeout on response', req.url);
32+
});
33+
req.on('end', function() {
34+
console.log('end', req.url);
35+
});
36+
}).listen(3000, function() {
37+
var c = net.connect(3000, function() {
38+
c.write('GET /1 HTTP/1.1\r\n' +
39+
'Host: localhost\r\n\r\n');
40+
c.write('GET /2 HTTP/1.1\r\n' +
41+
'Host: localhost\r\n\r\n');
42+
});
43+
});
44+
server.setTimeout(200, function(socket) {
45+
console.log('timeout on server');
46+
socket.destroy();
47+
server.close();
48+
});

0 commit comments

Comments
 (0)