Permalink
Browse files

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.
  • Loading branch information...
1 parent 1c9c627 commit 2be12682540c83aee433366318f6164cae21f3e8 @mscdex mscdex committed with Aug 7, 2012
Showing with 29 additions and 29 deletions.
  1. +3 −1 lib/http.js
  2. +26 −28 test/simple/test-http-client-parse-error.js
View
4 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;
View
54 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);
});
-
-

0 comments on commit 2be1268

Please sign in to comment.