http-agent.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* global test:false, expect:false, describe:false, */
  2. const request = require('request')
  3. const http = require('node:http')
  4. const https = require('node:https')
  5. const { getProtectedHttpAgent, getRedirectEvaluator, FORBIDDEN_IP_ADDRESS } = require('../../src/server/helpers/request')
  6. describe('test getRedirectEvaluator', () => {
  7. const httpURL = 'http://uppy.io'
  8. const httpsURL = 'https://uppy.io'
  9. const httpRedirectResp = {
  10. headers: {
  11. location: 'http://transloadit.com',
  12. },
  13. }
  14. const httpsRedirectResp = {
  15. headers: {
  16. location: 'https://transloadit.com',
  17. },
  18. }
  19. test('when original URL has "https:" as protocol', (done) => {
  20. const shouldRedirectHttps = getRedirectEvaluator(httpsURL, true)
  21. expect(shouldRedirectHttps(httpsRedirectResp)).toEqual(true)
  22. expect(shouldRedirectHttps(httpRedirectResp)).toEqual(false)
  23. done()
  24. })
  25. test('when original URL has "http:" as protocol', (done) => {
  26. const shouldRedirectHttp = getRedirectEvaluator(httpURL, true)
  27. expect(shouldRedirectHttp(httpRedirectResp)).toEqual(true)
  28. expect(shouldRedirectHttp(httpsRedirectResp)).toEqual(false)
  29. done()
  30. })
  31. })
  32. describe('test getProtectedHttpAgent', () => {
  33. test('setting "https:" as protocol', (done) => {
  34. const Agent = getProtectedHttpAgent('https:')
  35. expect(Agent).toEqual(https.Agent)
  36. done()
  37. })
  38. test('setting "https" as protocol', (done) => {
  39. const Agent = getProtectedHttpAgent('https')
  40. expect(Agent).toEqual(https.Agent)
  41. done()
  42. })
  43. test('setting "http:" as protocol', (done) => {
  44. const Agent = getProtectedHttpAgent('http:')
  45. expect(Agent).toEqual(http.Agent)
  46. done()
  47. })
  48. test('setting "http" as protocol', (done) => {
  49. const Agent = getProtectedHttpAgent('http')
  50. expect(Agent).toEqual(http.Agent)
  51. done()
  52. })
  53. })
  54. describe('test protected request Agent', () => {
  55. test('allows URLs without IP addresses', (done) => {
  56. const options = {
  57. uri: 'https://transloadit.com',
  58. method: 'GET',
  59. agentClass: getProtectedHttpAgent('https', true),
  60. }
  61. request(options, (err) => {
  62. if (err) {
  63. expect(err.message).not.toEqual(FORBIDDEN_IP_ADDRESS)
  64. expect(err.message.startsWith(FORBIDDEN_IP_ADDRESS)).toEqual(false)
  65. done()
  66. } else {
  67. done()
  68. }
  69. })
  70. })
  71. test('blocks private http IP address', (done) => {
  72. const options = {
  73. uri: 'http://172.20.10.4:8090',
  74. method: 'GET',
  75. agentClass: getProtectedHttpAgent('http', true),
  76. }
  77. request(options, (err) => {
  78. expect(err).toBeInstanceOf(Error)
  79. expect(err.message).toEqual(FORBIDDEN_IP_ADDRESS)
  80. done()
  81. })
  82. })
  83. test('blocks private https IP address', (done) => {
  84. const options = {
  85. uri: 'https://172.20.10.4:8090',
  86. method: 'GET',
  87. agentClass: getProtectedHttpAgent('https', true),
  88. }
  89. request(options, (err) => {
  90. expect(err).toBeInstanceOf(Error)
  91. expect(err.message).toEqual(FORBIDDEN_IP_ADDRESS)
  92. done()
  93. })
  94. })
  95. test('blocks localhost IP address', (done) => {
  96. const options = {
  97. uri: 'http://127.0.0.1:8090',
  98. method: 'GET',
  99. agentClass: getProtectedHttpAgent('http', true),
  100. }
  101. request(options, (err) => {
  102. expect(err).toBeInstanceOf(Error)
  103. expect(err.message).toEqual(FORBIDDEN_IP_ADDRESS)
  104. done()
  105. })
  106. })
  107. })