mirror of https://github.com/nodejs/node.git
http: bubble up parser errors to ClientRequest
Make parser errors bubble up to the ClientRequest instead of the underlying net.Socket object. Fixes #3776.
This commit is contained in:
parent
1867511400
commit
c78678b081
|
@ -1367,7 +1367,9 @@ function socketOnData(d, start, end) {
|
||||||
if (ret instanceof Error) {
|
if (ret instanceof Error) {
|
||||||
debug('parse error');
|
debug('parse error');
|
||||||
freeParser(parser, req);
|
freeParser(parser, req);
|
||||||
socket.destroy(ret);
|
socket.destroy();
|
||||||
|
req.emit('error', ret);
|
||||||
|
req._hadError = true;
|
||||||
} else if (parser.incoming && parser.incoming.upgrade) {
|
} else if (parser.incoming && parser.incoming.upgrade) {
|
||||||
// Upgrade or CONNECT
|
// Upgrade or CONNECT
|
||||||
var bytesParsed = ret;
|
var bytesParsed = ret;
|
||||||
|
|
|
@ -25,37 +25,35 @@ var assert = require('assert');
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
var net = require('net');
|
var net = require('net');
|
||||||
|
|
||||||
|
var connects = 0;
|
||||||
|
var parseErrors = 0;
|
||||||
|
|
||||||
// Create a TCP server
|
// Create a TCP server
|
||||||
var srv = net.createServer(function(c) {
|
net.createServer(function(c) {
|
||||||
c.write('bad http - should trigger parse error\r\n');
|
|
||||||
|
|
||||||
console.log('connection');
|
console.log('connection');
|
||||||
|
if (++connects === 1) {
|
||||||
c.on('end', function() { c.end(); });
|
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');
|
||||||
var parseError = false;
|
this.close();
|
||||||
|
}
|
||||||
srv.listen(common.PORT, '127.0.0.1', function() {
|
}).listen(common.PORT, '127.0.0.1', function() {
|
||||||
var req = http.request({
|
for (var i = 0; i < 2; i++) {
|
||||||
|
http.request({
|
||||||
host: '127.0.0.1',
|
host: '127.0.0.1',
|
||||||
port: common.PORT,
|
port: common.PORT,
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
path: '/'});
|
path: '/'
|
||||||
req.end();
|
}).on('error', function(e) {
|
||||||
|
|
||||||
req.on('error', function(e) {
|
|
||||||
console.log('got error from client');
|
console.log('got error from client');
|
||||||
srv.close();
|
|
||||||
assert.ok(e.message.indexOf('Parse Error') >= 0);
|
assert.ok(e.message.indexOf('Parse Error') >= 0);
|
||||||
assert.equal(e.code, 'HPE_INVALID_CONSTANT');
|
assert.equal(e.code, 'HPE_INVALID_CONSTANT');
|
||||||
parseError = true;
|
parseErrors++;
|
||||||
});
|
}).end();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
process.on('exit', function() {
|
process.on('exit', function() {
|
||||||
assert.ok(parseError);
|
assert.equal(connects, 2);
|
||||||
|
assert.equal(parseErrors, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue