summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2012-08-06 20:42:13 -0400
committerBen Noordhuis <info@bnoordhuis.nl>2012-12-16 17:25:03 +0100
commit827b2a9b0b2b938f458a7569bf6c73b6be25ddc7 (patch)
tree78a5ce0e989f60c19068df9af62b00d6fb1b85d9
parent45cdb0e4c12d8f8e9450174ddd6ddad52a995831 (diff)
downloadnode-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.js4
-rw-r--r--test/simple/test-http-client-parse-error.js54
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);
});
-
-