正确设置httputil.ReverseProxy Foward响应流

时间:2019-01-14 18:10:17

标签: go video-streaming reverse-proxy httpresponse

我的主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 个答案:

答案 0 :(得分:0)

使用时,您得到相同的结果吗?

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)
    }
}

最终,这些功能在后台是相同的实现,但是此处提供的导演确保了某些期望的标头存在,而某些代理功能必须能够按预期发挥功能。