[beego]beego 对 ReverseProxy 适配

2024-01-30 477 views
2

beego 1.6 当需要某个接口 Reverse Proxy 到其他服务时,通过

beego.Handler("/proxy/*", reverseProxy)

增加 router,POST 之类带有 Body 的请求会在 router.go 643行

    if r.Method != "GET" && r.Method != "HEAD" {
        if BConfig.CopyRequestBody && !context.Input.IsUpload() {
            context.Input.CopyBody(BConfig.MaxMemory)
        }
        context.Input.ParseFormOrMulitForm(BConfig.MaxMemory)
    }

时,将 Body Close,导致 reverse proxy 给其他服务时,Body 为空,同时报错“http: proxy error: http: ContentLength=XXX with Body length 0” 的错误。

希望能加入一个某个逻辑,比如通过这样

beego.Proxy(h http.Handler)

来表明这个 endpoint 不需要 ParseFormOrMulitForm。

回答

1

hi @tonyluj 确实 Body 会被 Close ,但在关闭的同时默认会将 Body 拷贝到 Context.Input 中保存下来。你可以在 Proxy 中通过访问 c.Ctx.Input.RequestBody 来获取 Body 信息。

8

通过 c.Ctx.Input.RequestBody 来获得 Body 也可以,不过不能用标准库里面的 net/http/httputil.ReverseProxy 来方便的实现 Proxy,并且从 io.Reader -> []byte -> io.Reader 也会有影响性能

3
rp := httputil.NewSingleHostReverseProxy(u)
rp.ServeHTTP(this.Ctx.ResponseWriter, this.Ctx.Request)