node-modules / agentkeepalive

Support keepalive http agent.
MIT License
579 stars 57 forks source link

Support Keep-Alive Header #58

Closed fengmk2 closed 6 years ago

fengmk2 commented 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.

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)