headers_spec.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. var http = require('http'),
  2. helpers = require('./helpers'),
  3. should = require('should');
  4. var port = 54321;
  5. describe('request headers', function() {
  6. var needle,
  7. server,
  8. existing_sockets,
  9. original_defaultMaxSockets;
  10. before(function(done) {
  11. setTimeout(function() {
  12. existing_sockets = get_active_sockets().length;
  13. server = helpers.server({ port: port }, done);
  14. }, 100);
  15. })
  16. after(function(done) {
  17. server.close(done);
  18. })
  19. function send_request(opts, cb) {
  20. needle.get('http://localhost:' + port, opts, cb);
  21. }
  22. function get_active_sockets() {
  23. var handles = process._getActiveHandles();
  24. return handles.filter(function(el) {
  25. if (el.constructor.name.toString() == 'Socket') {
  26. return el.destroyed !== true;
  27. }
  28. })
  29. }
  30. describe('old node versions (<0.11.4) with persistent keep-alive connections', function() {
  31. before(function() {
  32. delete require.cache[require.resolve('..')] // in case it was already loaded
  33. original_defaultMaxSockets = http.Agent.defaultMaxSockets;
  34. http.Agent.defaultMaxSockets = 5;
  35. needle = require('..');
  36. })
  37. after(function() {
  38. http.Agent.defaultMaxSockets = original_defaultMaxSockets;
  39. delete require.cache[require.resolve('..')]
  40. })
  41. describe('default options', function() {
  42. it('sends a Connection: close header', function(done) {
  43. send_request({}, function(err, resp) {
  44. resp.body.headers['connection'].should.eql('close');
  45. done();
  46. })
  47. })
  48. it('no open sockets remain after request', function(done) {
  49. send_request({}, function(err, resp) {
  50. setTimeout(function() {
  51. get_active_sockets().length.should.eql(existing_sockets);
  52. done();
  53. }, 10)
  54. });
  55. })
  56. })
  57. describe('passing connection: close', function() {
  58. it('sends a Connection: close header', function(done) {
  59. send_request({ connection: 'close' }, function(err, resp) {
  60. resp.body.headers['connection'].should.eql('close');
  61. done();
  62. })
  63. })
  64. it('no open sockets remain after request', function(done) {
  65. send_request({ connection: 'close' }, function(err, resp) {
  66. setTimeout(function() {
  67. get_active_sockets().length.should.eql(existing_sockets);
  68. done();
  69. }, 10)
  70. });
  71. })
  72. })
  73. describe('passing connection: keep-alive', function() {
  74. it('sends a Connection: keep-alive header (using options.headers.connection)', function(done) {
  75. send_request({ headers: { connection: 'keep-alive' }}, function(err, resp) {
  76. resp.body.headers['connection'].should.eql('keep-alive');
  77. done();
  78. })
  79. })
  80. it('sends a Connection: keep-alive header (using options.connection)', function(done) {
  81. send_request({ connection: 'keep-alive' }, function(err, resp) {
  82. resp.body.headers['connection'].should.eql('keep-alive');
  83. done();
  84. })
  85. })
  86. it('one open socket remain after request', function(done) {
  87. send_request({ connection: 'keep-alive' }, function(err, resp) {
  88. get_active_sockets().length.should.eql(existing_sockets + 1);
  89. done();
  90. });
  91. })
  92. })
  93. })
  94. describe('new node versions with smarter connection disposing', function() {
  95. before(function() {
  96. delete require.cache[require.resolve('..')]
  97. original_defaultMaxSockets = http.Agent.defaultMaxSockets;
  98. http.Agent.defaultMaxSockets = Infinity;
  99. needle = require('..');
  100. })
  101. after(function() {
  102. http.Agent.defaultMaxSockets = original_defaultMaxSockets;
  103. delete require.cache[require.resolve('..')]
  104. })
  105. describe('default options', function() {
  106. // TODO:
  107. // this is weird. by default, new node versions set a 'close' header
  108. // while older versions set a keep-alive header
  109. it.skip('sets a Connection header', function(done) {
  110. send_request({}, function(err, resp) {
  111. // should.not.exist(resp.body.headers['connection']);
  112. // done();
  113. })
  114. })
  115. it.skip('one open sockets remain after request', function(done) {
  116. send_request({}, function(err, resp) {
  117. // get_active_sockets().length.should.eql(1);
  118. // done();
  119. });
  120. })
  121. })
  122. describe('passing connection: close', function() {
  123. it('sends a Connection: close header', function(done) {
  124. send_request({ connection: 'close' }, function(err, resp) {
  125. resp.body.headers['connection'].should.eql('close');
  126. done();
  127. })
  128. })
  129. it('no open sockets remain after request', function(done) {
  130. send_request({ connection: 'close' }, function(err, resp) {
  131. setTimeout(function() {
  132. get_active_sockets().length.should.eql(existing_sockets);
  133. done();
  134. }, 10);
  135. });
  136. })
  137. })
  138. describe('passing connection: keep-alive', function() {
  139. it('sends a Connection: keep-alive header (using options.headers.connection)', function(done) {
  140. send_request({ headers: { connection: 'keep-alive' }}, function(err, resp) {
  141. resp.body.headers['connection'].should.eql('keep-alive');
  142. done();
  143. })
  144. })
  145. it('sends a Connection: keep-alive header (using options.connection)', function(done) {
  146. send_request({ connection: 'keep-alive' }, function(err, resp) {
  147. resp.body.headers['connection'].should.eql('keep-alive');
  148. done();
  149. })
  150. })
  151. it('one open socket remain after request', function(done) {
  152. send_request({ connection: 'keep-alive' }, function(err, resp) {
  153. get_active_sockets().length.should.eql(existing_sockets + 1);
  154. done();
  155. });
  156. })
  157. })
  158. })
  159. })