server_timeout.test.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. 'use strict';
  2. const assert = require('assert');
  3. const http = require('http');
  4. const Agent = require('..');
  5. describe('test/server_timeout.test.js', () => {
  6. let port;
  7. let server;
  8. let timer;
  9. before(done => {
  10. server = http.createServer((req, res) => {
  11. if (server.keepAliveTimeout) {
  12. res.setHeader('Keep-Alive', `timeout=${parseInt(server.keepAliveTimeout / 1000)}`);
  13. }
  14. res.end('Hello World, ' + req.connection.remotePort);
  15. });
  16. server.on('clientError', (err, socket) => {
  17. socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
  18. });
  19. server.keepAliveTimeout = 1000;
  20. server.listen(0, err => {
  21. port = server.address().port;
  22. done(err);
  23. });
  24. });
  25. after(() => {
  26. clearInterval(timer);
  27. });
  28. it('should handle Keep-Alive header and not throw reset error', done => {
  29. const keepaliveAgent = new Agent({
  30. keepAlive: true,
  31. });
  32. let count = 0;
  33. function request() {
  34. count++;
  35. const req = http.request({
  36. method: 'GET',
  37. port,
  38. path: '/',
  39. agent: keepaliveAgent,
  40. }, res => {
  41. assert(res.statusCode === 200);
  42. const chunks = [];
  43. res.on('data', data => {
  44. chunks.push(data);
  45. });
  46. res.on('end', () => {
  47. const text = Buffer.concat(chunks).toString();
  48. console.log('[%s] status: %s, text: %s, headers: %j', count, text, res.statusCode, res.headers);
  49. assert(res.headers.connection === 'keep-alive');
  50. assert(res.headers['keep-alive'] === 'timeout=1');
  51. const m = /^timeout=(\d+?)/.exec(res.headers['keep-alive']);
  52. if (m) {
  53. const keepAliveTimeout = parseInt(m[1]) * 1000 - 500;
  54. if (keepAliveTimeout > 0) {
  55. res.socket.freeSocketKeepAliveTimeout = keepAliveTimeout;
  56. }
  57. }
  58. if (count > 5) {
  59. done();
  60. }
  61. });
  62. });
  63. req.on('error', err => {
  64. console.error('[%s] error: %s', count, err);
  65. done(err);
  66. });
  67. req.end();
  68. }
  69. timer = setInterval(request, server.keepAliveTimeout);
  70. request();
  71. });
  72. });