headers_spec.js 5.7 KB

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