requestHelper.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const { Agent } = require('http')
  2. const { createConnection } = require('net')
  3. const { promisify } = require('util')
  4. const OError = require('@overleaf/o-error')
  5. const request = require('request')
  6. const Settings = require('@overleaf/settings')
  7. // send requests to web router if this is the api process
  8. const OWN_PORT = Settings.port || Settings.internal.web.port || 3000
  9. const PORT = (Settings.web && Settings.web.web_router_port) || OWN_PORT
  10. // like the curl option `--resolve DOMAIN:PORT:127.0.0.1`
  11. class LocalhostAgent extends Agent {
  12. createConnection(options, callback) {
  13. return createConnection(PORT, '127.0.0.1', callback)
  14. }
  15. }
  16. // degrade the 'HttpOnly; Secure;' flags of the cookie
  17. class InsecureCookieJar extends request.jar().constructor {
  18. setCookie(...args) {
  19. const cookie = super.setCookie(...args)
  20. cookie.secure = false
  21. cookie.httpOnly = false
  22. return cookie
  23. }
  24. }
  25. function requestFactory({ timeout }) {
  26. return promisify(
  27. request.defaults({
  28. agent: new LocalhostAgent(),
  29. baseUrl: `http://smoke${Settings.cookieDomain}`,
  30. headers: {
  31. // emulate the header of a https proxy
  32. // express wont emit a 'Secure;' cookie on a plain-text connection.
  33. 'X-Forwarded-Proto': 'https',
  34. },
  35. jar: new InsecureCookieJar(),
  36. timeout,
  37. })
  38. )
  39. }
  40. function assertHasStatusCode(response, expected) {
  41. const { statusCode: actual } = response
  42. if (actual !== expected) {
  43. throw new OError('unexpected response code', {
  44. url: response.request.uri.href,
  45. actual,
  46. expected,
  47. })
  48. }
  49. }
  50. module.exports = {
  51. assertHasStatusCode,
  52. requestFactory,
  53. }