From ef7ae551ad63d4239f51bba4940c7a71cb26ae24 Mon Sep 17 00:00:00 2001 From: liangtongchuan Date: Mon, 22 May 2023 21:23:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix(web-server):=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9proxy=E8=A7=A3=E5=86=B3mid-web=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- npm-install.sh | 2 + web-server/app/middleware/egg-proxy.ts | 50 ++++++++++++++++++++ web-server/typings/app/middleware/index.d.ts | 2 + 3 files changed, 54 insertions(+) create mode 100644 web-server/app/middleware/egg-proxy.ts diff --git a/npm-install.sh b/npm-install.sh index 192912370..9b59d2993 100644 --- a/npm-install.sh +++ b/npm-install.sh @@ -3,8 +3,10 @@ cd ./game-server && npm install -d echo '============ game-server npm installed ============' cd .. cd ./web-server && npm install -d +sed -i.bak 's/this.serverOnCloseSubscribed = false/this.serverOnCloseSubscribed = true/g' ./node_modules/http-proxy-middleware/dist/http-proxy-middleware.js echo '============ web-server npm installed ============' cd .. cd ./gm-server && npm install -d +sed -i.bak 's/this.serverOnCloseSubscribed = false/this.serverOnCloseSubscribed = true/g' ./node_modules/http-proxy-middleware/dist/http-proxy-middleware.js echo '============ gm-server npm installed ============' cd .. diff --git a/web-server/app/middleware/egg-proxy.ts b/web-server/app/middleware/egg-proxy.ts new file mode 100644 index 000000000..831ff5360 --- /dev/null +++ b/web-server/app/middleware/egg-proxy.ts @@ -0,0 +1,50 @@ +import c2k = require('koa-connect'); +import { createProxyMiddleware, Options as ContextOptions } from 'http-proxy-middleware'; +import * as micromatch from 'micromatch'; +import * as isGlob from 'is-glob'; + +function match(context: string, path: string): boolean { + // single path + if (!isGlob(context)) { + return path.indexOf(context) === 0; + } else { + // single glob path + const matches = micromatch([path], context); + return matches?.length > 0; + } +} + +export interface Options { + [contextName: string]: ContextOptions; +} + +export default function (options: Options) { + return async (ctx, next) => { + for (const context of Object.keys(options)) { + if (match(context, ctx.path)) { + const contextOptions: ContextOptions = options[context]; + const { onProxyReq } = contextOptions; + await c2k( + createProxyMiddleware(context, { + ...contextOptions, + onProxyReq(proxyReq, req, res) { + if (onProxyReq && typeof onProxyReq === 'function') { + onProxyReq(proxyReq, req, res); + } + // reset rawBody after bodyparser + const { rawBody, body: requestBody } = ctx.request; + if (requestBody && rawBody) { + proxyReq.setHeader('Content-Length', Buffer.byteLength(rawBody)); + proxyReq.write(rawBody); + proxyReq.end(); + } + return proxyReq; + }, + }) as any + )(ctx, next); + } + } + await next(); + }; +} + diff --git a/web-server/typings/app/middleware/index.d.ts b/web-server/typings/app/middleware/index.d.ts index ad3efd628..765e86b23 100644 --- a/web-server/typings/app/middleware/index.d.ts +++ b/web-server/typings/app/middleware/index.d.ts @@ -3,6 +3,7 @@ import 'egg'; import ExportCheckMainten from '../../../app/middleware/checkMainten'; +import ExportEggProxy from '../../../app/middleware/egg-proxy'; import ExportGetIp from '../../../app/middleware/getIp'; import ExportGmTokenParser from '../../../app/middleware/gmTokenParser'; import ExportParmsDecode from '../../../app/middleware/parmsDecode'; @@ -12,6 +13,7 @@ import ExportTokenParser from '../../../app/middleware/tokenParser'; declare module 'egg' { interface IMiddleware { checkMainten: typeof ExportCheckMainten; + eggProxy: typeof ExportEggProxy; getIp: typeof ExportGetIp; gmTokenParser: typeof ExportGmTokenParser; parmsDecode: typeof ExportParmsDecode;