From 827b2a9b0b2b938f458a7569bf6c73b6be25ddc7 Mon Sep 17 00:00:00 2001 From: Brian White Date: Mon, 6 Aug 2012 20:42:13 -0400 Subject: [PATCH] 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. --- lib/http.js | 4 ++- 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 787c906..f76bd50 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 91baa47..9896ca2 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); }); - - -- 2.7.4