test-https-ipv6.test.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. 'use strict';
  2. const https = require('https');
  3. const assert = require('assert');
  4. const fs = require('fs');
  5. const constants = require('constants');
  6. const HttpsAgent = require('..').HttpsAgent;
  7. const os = require('os');
  8. function isIPv6Available() {
  9. const networkInterfaces = os.networkInterfaces();
  10. return !!Object.keys(networkInterfaces).find(ifName => {
  11. const addresses = networkInterfaces[ifName];
  12. return !!addresses.find(addr => addr.family === 'IPv6');
  13. });
  14. }
  15. describe('test/test-ipv6.test.js', () => {
  16. let port;
  17. let server;
  18. const httpsAgent = new HttpsAgent({
  19. keepAlive: true,
  20. });
  21. const options = {
  22. key: fs.readFileSync(__dirname + '/fixtures/agenttest-key.pem'),
  23. cert: fs.readFileSync(__dirname + '/fixtures/agenttest-cert.pem'),
  24. secureOptions: constants.SSL_OP_NO_TICKET,
  25. };
  26. before(function(done) {
  27. if (!isIPv6Available()) {
  28. this.skip();
  29. }
  30. // Create TLS1.2 server
  31. server = https.createServer(options, (req, res) => {
  32. res.end('ohai');
  33. });
  34. server.listen(0, () => {
  35. port = server.address().port;
  36. done();
  37. });
  38. });
  39. it('should GET / success with 200 status from ::1', function(done) {
  40. const m = process.version.match(/^v(\d+)\.(\d+)/);
  41. const major = parseInt(m[1]);
  42. const minor = parseInt(m[2]);
  43. if (major < 8 || (major === 8 && minor < 10) || (major === 9 && minor < 1)) {
  44. // This only works in node-versions with the fix for
  45. // https://github.com/nodejs/node/issues/14736 included.
  46. this.skip();
  47. }
  48. https.get({
  49. agent: httpsAgent,
  50. hostname: '::1',
  51. port,
  52. path: '/',
  53. ca: fs.readFileSync(__dirname + '/fixtures/ca.pem'),
  54. }, res => {
  55. assert(res.statusCode === 200);
  56. res.resume();
  57. res.on('end', () => {
  58. process.nextTick(() => {
  59. assert(Object.keys(httpsAgent.sockets).length === 0);
  60. assert(Object.keys(httpsAgent.freeSockets).length === 1);
  61. done();
  62. });
  63. });
  64. });
  65. assert(Object.keys(httpsAgent.sockets).length === 1);
  66. });
  67. it('should not crash with invalid host-header', done => {
  68. https.get({
  69. agent: httpsAgent,
  70. hostname: '::1',
  71. port,
  72. path: '/',
  73. headers: {
  74. host: '[::1:80',
  75. },
  76. rejectUnauthorized: false,
  77. }, () => {
  78. done();
  79. });
  80. });
  81. });