为了账号安全,请及时绑定邮箱和手机立即绑定

使 httputil.ReverseProxy 转发响应流正确

使 httputil.ReverseProxy 转发响应流正确

Go
白猪掌柜的 2023-06-01 15:08:55
我的主 Web 服务器中有反向代理,专门用于某个微服务,并处理对其适当的微服务的转发请求。func newTrimPrefixReverseProxy(target *url.URL, prefix string) *httputil.ReverseProxy {    director := func(req *http.Request) {        // ... trims prefix from request path and prepends the path of the target url    }    return &httputil.ReverseProxy{Director: director}}这对于纯 JSON 响应非常有效,但最近我在尝试通过反向代理提供内容(流响应)时遇到了问题。提供内容的方式无关紧要,当直接访问服务而不是通过反向代理访问服务时,(视频)内容将按预期提供。服务内容:http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {    http.ServeContent(w, r, "video.mp4", time.Now().Add(time.Hour*24*365*12*9*-1), videoReadSeeker)})同样,videoReadSeeker 和内容的提供方式不是问题,问题是通过反向代理将我的响应按预期转发给请求者;直接访问该服务时,会显示视频,我可以随心所欲地浏览它。请注意,接收到内容的数据响应(http 状态、标头),但没有接收到响应正文中的内容流。我如何才能确保反向代理按照内容的预期处理流式响应?
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

使用时是否得到相同的结果:


package main


import (

    "log"

    "net/http"

    "net/http/httputil"

    "net/url"

)


func main() {

    u, err := url.Parse("http://localhost:8080/asdfasdf")

    if err != nil {

        log.Fatal("url.Parse: %v", err)

    }


    proxy := httputil.NewSingleHostReverseProxy(u)


    log.Printf("Listening at :8081")

    if err := http.ListenAndServe(":8081", proxy); err != nil {

        log.Fatal("ListenAndServe: %v", err)

    }

}

最终,这些在幕后是相同的实现,但此处提供的 director 确保存在一些预期的标头,您需要这些标头才能使某些代理功能按预期运行。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信