main.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const express = require('express')
  2. const httpProxy = require('../lib/http-proxy')
  3. const request = require('request')
  4. const common = require('../lib/http-proxy/common')
  5. const app = express()
  6. const assetsProxy = httpProxy.createProxyServer({
  7. target: 'https://www.heroforge.com',
  8. xfwd: false,
  9. secure: false,
  10. changeOrigin: true,
  11. autoRewrite: true,
  12. protocolRewrite: 'http',
  13. selfHandleResponse: false,
  14. cookieDomainRewrite: true,
  15. preserveHeaderKeyCase: true,
  16. mapHeaders(headers) {
  17. headers.host = 'www.heroforge.com'
  18. if (headers.referer) {
  19. const url = new URL(headers.referer)
  20. url.hostname = 'www.heroforge.com'
  21. url.protocol = 'https'
  22. url.port = 443
  23. headers.referer = url.toString()
  24. headers.origin = 'https://www.heroforge.com'
  25. }
  26. return headers
  27. }
  28. })
  29. assetsProxy.on('error', (err, req, res, url) => {
  30. console.warn(err.message, req.url)
  31. res.redirect(req.url)
  32. })
  33. app.use(/^\/$/, (req, res) => {
  34. request('https://www.heroforge.com', (err, proxyRes, body) => {
  35. if (err) res.status(500).send(err)
  36. else {
  37. for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) {
  38. var rewriteCookieDomainConfig = ['*'],
  39. rewriteCookiePathConfig = ['*']
  40. const key = proxyRes.rawHeaders[i]
  41. let value = proxyRes.rawHeaders[i + 1]
  42. if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
  43. value = common.rewriteCookieProperty(value, rewriteCookieDomainConfig, 'domain');
  44. }
  45. if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
  46. value = common.rewriteCookieProperty(value, rewriteCookiePathConfig, 'path');
  47. }
  48. if (key.toLowerCase() === 'set-cookie') {
  49. const [k, v] = value.split(';')[0].split('=')
  50. res.cookie(k,v)
  51. } else {
  52. res.setHeader(key, value)
  53. }
  54. }
  55. let html = body
  56. .replace(/<script[^>]+googletagmanager.*<\/script>/g, '<!-- google tag manager -->')
  57. .replace(/<img[^>]+facebook.*>/g, '<!-- facebook -->')
  58. .replace('https://connect.facebook.net/en_US/fbevents.js', '')
  59. .replace('</body>', '<script type="text/javascript" src="/custom/main.js"></script></body>')
  60. res.status(200)
  61. .set('Content-Type', 'text/html')
  62. .send(html)
  63. }
  64. })
  65. })
  66. app.use('/custom/', express.static('./dist'))
  67. app.use('/', (req, res) => {
  68. assetsProxy.web(req, res)
  69. })
  70. app.listen(process.env.PORT || 9011)