-
Notifications
You must be signed in to change notification settings - Fork 58
Closed
Labels
Description
Since http server has a default KeepAliveTimeout = 5s, we should try to support Keep-Alive Header to avoid the timeout condition confuse.
Repeat the root case code
const http = require('http');
const urllib = require('urllib');
const keepaliveAgent = new http.Agent({
keepAlive: true,
});
const server = http.createServer((req, res) => {
res.end('Hello World, ' + req.connection.remotePort);
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(3000);
function request() {
urllib.request('http://127.0.0.1:3000', {
agent: keepaliveAgent,
dataType: 'text',
}, (err, data, res) => {
if (err) {
console.error('error: %s, status: %s', err, res.status, res);
throw err;
}
console.log('status: %s, data: %s', res.status, data, res);
});
}
setInterval(request, 5000);
request();It will throw the ECONNRESET error after 2~4 requests.
status: 200, data: Hello World, 53299 { status: 200,
statusCode: 200,
headers:
{ date: 'Mon, 26 Feb 2018 09:32:43 GMT',
connection: 'keep-alive',
'content-length': '18' },
size: 18,
aborted: false,
rt: 2,
keepAliveSocket: true,
data: 'Hello World, 53299',
requestUrls: [ 'http://127.0.0.1:3000/' ],
timing: null,
remoteAddress: '127.0.0.1',
remotePort: 3000 }
error: ResponseError: read ECONNRESET (req "error"), GET http://127.0.0.1:3000 -1 (connected: true, keepalive socket: true)
headers: {}, status: -1 { status: -1,
statusCode: -1,
headers: {},
size: 0,
aborted: false,
rt: 2,
keepAliveSocket: true,
data: undefined,
requestUrls: [ 'http://127.0.0.1:3000/' ],
timing: null,
remoteAddress: '127.0.0.1',
remotePort: 3000 }
xxx/server_timeout.js:25
throw err;
^
Error: read ECONNRESET
at _errnoException (util.js:1022:11)
at TCP.onread (net.js:615:25)