http: bubble up parser errors to ClientRequest
authorBrian White <mscdex@mscdex.net>
Tue, 7 Aug 2012 00:42:13 +0000 (20:42 -0400)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 24 Aug 2012 15:26:31 +0000 (17:26 +0200)
Make parser errors bubble up to the ClientRequest instead of the underlying
net.Socket object.

Fixes #3776.

lib/http.js
test/simple/test-http-client-parse-error.js

index 87199ea..027e5d8 100644 (file)
@@ -1367,7 +1367,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;
index 91baa47..9896ca2 100644 (file)
@@ -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);
 });
-
-