You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.6 KiB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
  1. 'use strict'
  2. const path = require('path')
  3. const url = require('url')
  4. const arrayify = require('array-back')
  5. const t = require('typical')
  6. const pathToRegexp = require('path-to-regexp')
  7. const debug = require('./debug')
  8. /**
  9. * @module middleware
  10. */
  11. exports.proxyRequest = proxyRequest
  12. exports.mime = mime
  13. function proxyRequest (route) {
  14. const httpProxy = require('http-proxy')
  15. const proxy = httpProxy.createProxyServer({
  16. changeOrigin: true,
  17. secure: false
  18. })
  19. return function proxyMiddleware () {
  20. const keys = []
  21. route.re = pathToRegexp(route.from, keys)
  22. route.new = this.url.replace(route.re, route.to)
  23. keys.forEach((key, index) => {
  24. const re = RegExp(`:${key.name}`, 'g')
  25. route.new = route.new
  26. .replace(re, arguments[index + 1] || '')
  27. })
  28. debug('proxy request', `from: ${this.path}, to: ${url.parse(route.new).href}`)
  29. return new Promise((resolve, reject) => {
  30. proxy.once('error', err => {
  31. err.message = `[PROXY] Error: ${err.message} Target: ${route.new}`
  32. reject(err)
  33. })
  34. proxy.once('proxyReq', function (proxyReq) {
  35. proxyReq.path = url.parse(route.new).path
  36. })
  37. proxy.once('close', resolve)
  38. proxy.web(this.req, this.res, { target: route.new })
  39. })
  40. }
  41. }
  42. function mime (mimeTypes) {
  43. return function mime (ctx, next) {
  44. return next().then(() => {
  45. const reqPathExtension = path.extname(ctx.path).slice(1)
  46. Object.keys(mimeTypes).forEach(mimeType => {
  47. const extsToOverride = mimeTypes[mimeType]
  48. if (extsToOverride.indexOf(reqPathExtension) > -1) ctx.type = mimeType
  49. })
  50. })
  51. }
  52. }