我正在测试反向代理。主要用于通过底层nginx和来自其他后端服务器的流视频播放视频。
问题在于浏览视频时。例如,通过代理播放vlc时 - 视频正常启动,但在尝试导航时停止。但如果我直接从nginx播放这个视频 - 它工作正常。
我预计在导航播放器上会创建与Range: N-
标头的新连接,但只有在再次启动视频时才会有新的连接。
问题:
播放视频流时,播放器如何导航?它发送给服务器的请求是什么? 也许我在连接处理方面缺少一些东西?
这是测试的基本版本,它从本地nginx流式传输视频,(本地视频网址 - http://localhost/31285611
):
package main
import (
"net/http"
)
func main() {
(&proxy{}).start()
}
type proxy struct {
// ...
}
func (p *proxy) start() {
http.HandleFunc("/play", p.connection)
http.ListenAndServe("localhost:8040", nil)
}
func (p *proxy) connection(w http.ResponseWriter, r *http.Request) {
disconnect := make(chan bool, 1)
go p.send(w, r, disconnect)
// ...
<-disconnect
}
func (p *proxy) send(rv http.ResponseWriter, rvq *http.Request, disconnect chan bool) {
rq, _ := http.NewRequest("GET", "http://localhost/31285611", rvq.Body)
rq.Header = rvq.Header
rs, _ := http.DefaultClient.Do(rq)
for k, v := range rs.Header {
rv.Header().Set(k, v[0])
}
rv.WriteHeader(http.StatusOK)
buf := make([]byte, 1024)
// for testing sending only first part.
for i := 0; i < 100000; i++ {
n, e := rs.Body.Read(buf[0:])
if n == 0 || e != nil {
break
}
rv.Write(buf[0:])
}
disconnect <- true
}
更新(标头转储):
第一个玩家连接:
map[User-Agent:[VLC/2.0.0 LibVLC/2.0.0] Range:[bytes=0-] Connection:[close] Icy-Metadata:[1]]
在go:
中创建连接时来自nginx的响应map[Server:[nginx/1.3.4] Date:[Tue, 23 Apr 2013 13:29:00 GMT] Content-Type:[application/octet-stream] Content-Length:[8147855699] Last-Modified:[Tue, 21 Aug 2012 20:47:20 GMT] Etag:["5033f3d8-1e5a66953"] Content-Range:[bytes 0-8147855698/8147855699]]
答案 0 :(得分:0)
我知道它并没有真正回答你的问题(我还没有足够的评论来评论,很抱歉提供这个作为答案!)但是你尝试过使用Go内置的http.ReverseProxy({{3} })?
这里似乎有一个很好的,简单的例子http://golang.org/pkg/net/http/httputil/#ReverseProxy我已经非常在下面进行了一些修改:
package main
import "http"
import "log"
func main(){
proxy := http.NewSingleHostReverseProxy( &http.URL{Scheme:"http",Host:"http://localhost/31285611",Path:"/"})
err := http.ListenAndServe(":8040", proxy)
if err != nil {
log.Fatal("ListenAndServe: ", err.String())
}
}
看看是否能胜任。
此外,在之前链接的Google网上论坛中,提到NginX存在分块编码问题。如果这是相关的,可能值得检查。