I'm testing a reverse proxy in go. Mainly for playing videos though underlying nginx and streaming videos from other backend servers.
Problem is when navigating through video. For example when playing with vlc through proxy - video starts normally, but stops when trying to navigate. But if i play this video directly from nginx - it works fine.
I expected that on navigation player would create new connection with Range: N-
header, but there is no new connections, only when starting video again.
Question:
How does player navigates, when playing video stream? What requests it sends to server? Maybe i'm missing something in connection handling?
This is very basic version for testing, it streams video from local nginx, (local video url - 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
}
Update (headers dump):
First player connection:
map[User-Agent:[VLC/2.0.0 LibVLC/2.0.0] Range:[bytes=0-] Connection:[close] Icy-Metadata:[1]]
Response from nginx, when creating connection in go:
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]]