Skip to content

Commit f3fc6ff

Browse files
committed
Merge pull request #546 from CartoDB/2.11-ensure-connect-callback
Ensure connect callback is invoked on premature socket hangup
2 parents 8248692 + e72aff4 commit f3fc6ff

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

lib/client.js

+8
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,17 @@ Client.prototype.connect = function(callback) {
170170
return self.emit('error', error);
171171
}
172172
callback(error);
173+
callback = null;
173174
});
174175

175176
con.once('end', function() {
177+
if ( callback ) {
178+
// haven't received a connection message yet !
179+
var err = new Error("Stream unexpectedly ended before getting ready for query execution");
180+
callback(err);
181+
callback = null;
182+
return;
183+
}
176184
if(self.activeQuery) {
177185
var disconnectError = new Error('Stream unexpectedly ended during query execution');
178186
self.activeQuery.handleError(disconnectError, con);

lib/connection.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ Connection.prototype.connect = function(port, host) {
6161
self.emit('error', error);
6262
});
6363

64-
this.stream.on('end', function() {
64+
this.stream.on('close', function() {
65+
// NOTE: node-0.10 emits both 'end' and 'close'
66+
// for streams closed by the peer, while
67+
// node-0.8 only emits 'close'
6568
self.emit('end');
6669
});
6770

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var helper = require(__dirname + '/test-helper');
2+
var net = require('net');
3+
var pg = require('../../..//lib/index.js');
4+
5+
var server = net.createServer(function(c) {
6+
console.log('server connected');
7+
c.destroy();
8+
console.log('server socket destroyed.');
9+
server.close(function() { console.log('server closed'); });
10+
});
11+
12+
server.listen(7777, function() {
13+
console.log('server listening');
14+
var client = new pg.Client('postgres://localhost:7777');
15+
console.log('client connecting');
16+
client.connect(assert.calls(function(err) {
17+
if (err) console.log("Error on connect: "+err);
18+
else console.log('client connected');
19+
assert(err);
20+
}));
21+
22+
});

test/unit/client/stream-and-query-error-interaction-tests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ test('emits end when not in query', function() {
2020
assert.equal(client.queryQueue.length, 0);
2121
assert(client.activeQuery, 'client should have issued query');
2222
process.nextTick(function() {
23-
stream.emit('end');
23+
stream.emit('close');
2424
});
2525
});
2626
});

0 commit comments

Comments
 (0)