diff options
author | Brian White <mscdex@mscdex.net> | 2012-08-06 20:42:13 -0400 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2012-12-16 17:25:03 +0100 |
commit | 827b2a9b0b2b938f458a7569bf6c73b6be25ddc7 (patch) | |
tree | 78a5ce0e989f60c19068df9af62b00d6fb1b85d9 | |
parent | 45cdb0e4c12d8f8e9450174ddd6ddad52a995831 (diff) | |
download | node-827b2a9b0b2b938f458a7569bf6c73b6be25ddc7.tar.gz |
http: bubble up parser errors to ClientRequest
Make parser errors bubble up to the ClientRequest instead of the underlying
net.Socket object.
This is a back-port of commit c78678b from the master branch.
Fixes #3776.
-rw-r--r-- | lib/http.js | 4 | ||||
-rw-r--r-- | test/simple/test-http-client-parse-error.js | 54 |
2 files changed, 29 insertions, 29 deletions
diff --git a/lib/http.js b/lib/http.js index 787c90669..f76bd50bb 100644 --- a/lib/http.js +++ b/lib/http.js @@ -1368,7 +1368,9 @@ function socketOnData(d, start, end) { if (ret instanceof Error) { debug('parse error'); freeParser(parser, req); - socket.destroy(ret); + socket.destroy(); + req.emit('error', ret); + req._hadError = true; } else if (parser.incoming && parser.incoming.upgrade) { // Upgrade or CONNECT var bytesParsed = ret; diff --git a/test/simple/test-http-client-parse-error.js b/test/simple/test-http-client-parse-error.js index 91baa4706..9896ca225 100644 --- a/test/simple/test-http-client-parse-error.js +++ b/test/simple/test-http-client-parse-error.js @@ -25,37 +25,35 @@ var assert = require('assert'); var http = require('http'); var net = require('net'); -// Create a TCP server -var srv = net.createServer(function(c) { - c.write('bad http - should trigger parse error\r\n'); +var connects = 0; +var parseErrors = 0; +// Create a TCP server +net.createServer(function(c) { console.log('connection'); - - c.on('end', function() { c.end(); }); -}); - -var parseError = false; - -srv.listen(common.PORT, '127.0.0.1', function() { - var req = http.request({ - host: '127.0.0.1', - port: common.PORT, - method: 'GET', - path: '/'}); - req.end(); - - req.on('error', function(e) { - console.log('got error from client'); - srv.close(); - assert.ok(e.message.indexOf('Parse Error') >= 0); - assert.equal(e.code, 'HPE_INVALID_CONSTANT'); - parseError = true; - }); + if (++connects === 1) { + c.end('HTTP/1.1 302 Object Moved\r\nContent-Length: 0\r\n\r\nhi world'); + } else { + c.end('bad http - should trigger parse error\r\n'); + this.close(); + } +}).listen(common.PORT, '127.0.0.1', function() { + for (var i = 0; i < 2; i++) { + http.request({ + host: '127.0.0.1', + port: common.PORT, + method: 'GET', + path: '/' + }).on('error', function(e) { + console.log('got error from client'); + assert.ok(e.message.indexOf('Parse Error') >= 0); + assert.equal(e.code, 'HPE_INVALID_CONSTANT'); + parseErrors++; + }).end(); + } }); - process.on('exit', function() { - assert.ok(parseError); + assert.equal(connects, 2); + assert.equal(parseErrors, 2); }); - - |