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

标签 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 状态、 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/

相关文章:

node.js - 从 Hyperledger Fabric Node SDK 中的函数 InvokeChaincode() 获取链码调用者 ID

Golang TCP 服务器 - 在客户端之间交换数据

ffmpeg - 使用 FFMPEG 创建无限 MP4(不循环)

MPMoviePlayerController 中没有扩展名的 HTTP 流

nginx - Airflow + Nginx 设置给 Airflow 404 = 很多圈子

c++ - epoll反向代理在编写客户端时卡住

go - 如何使用 govendor 删除未使用的依赖项

go - 检测未初始化的结构字段

android - 通过 rtsp 将 oculus rift 流式传输到 android

node.js - 如何为两个都需要 socket.io 的应用程序设置 NGINX 的端口 80 的反向代理?