Closed fengmk2 closed 6 years ago
Since http server has a default KeepAliveTimeout = 5s, we should try to support Keep-Alive Header to avoid the timeout condition confuse.
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.
ECONNRESET
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)
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
It will throw the
ECONNRESET
error after 2~4 requests.