gpt4 book ai didi

go - 使 httputil.ReverseProxy 转发响应流正确

转载 作者:数据小太阳 更新时间:2023-10-29 03:20:54 28 4
gpt4 key购买 nike

我的主 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 状态、 header ),但响应正文中的内容流不是。

我如何确保反向代理能够按照内容的预期处理流式响应?

最佳答案

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

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 确保存在一些预期的 header ,您需要这些 header 才能使某些代理功能按预期运行。

关于go - 使 httputil.ReverseProxy 转发响应流正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186954/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com