|
|
@ -1,26 +1,38 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
"golang.org/x/net/websocket" |
|
|
|
"flag" |
|
|
|
"fmt" |
|
|
|
"net/http" |
|
|
|
|
|
|
|
"golang.org/x/net/websocket" |
|
|
|
) |
|
|
|
|
|
|
|
func main() { |
|
|
|
var frontend,backend int |
|
|
|
func main() { |
|
|
|
var frontend, backend int |
|
|
|
flag.IntVar(&frontend, "l", 8088, "frontend, serve websocket") |
|
|
|
flag.IntVar(&backend, "b", 8080, "backend, which fetch flv stream from") |
|
|
|
flag.Parse() |
|
|
|
|
|
|
|
fmt.Println(fmt.Sprintf("Transmux http://:%v/* to ws://:%v/*", backend, frontend)) |
|
|
|
http.Handle("/", websocket.Handler(func(c *websocket.Conn){ |
|
|
|
http.Handle("/", websocket.Handler(func(c *websocket.Conn) { |
|
|
|
r := c.Request() |
|
|
|
url := fmt.Sprintf("http://127.0.0.1:%v%v", backend, r.RequestURI) |
|
|
|
fmt.Println("Proxy client", r.RemoteAddr, "to", url) |
|
|
|
defer c.Close() |
|
|
|
|
|
|
|
flv,err := http.Get(url) |
|
|
|
flv, err := http.Get(url) |
|
|
|
go func() { |
|
|
|
for { |
|
|
|
var content string |
|
|
|
err := websocket.Message.Receive(c, &content) |
|
|
|
if err != nil { |
|
|
|
fmt.Println("receive err", err) |
|
|
|
flv.Body.Close() |
|
|
|
c.Close() |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
}() |
|
|
|
if err != nil { |
|
|
|
fmt.Println("Connect backend", url, "failed, err is", err) |
|
|
|
return |
|
|
@ -30,7 +42,7 @@ func main() { |
|
|
|
b := make([]byte, 1024) |
|
|
|
for { |
|
|
|
var n int |
|
|
|
if n,err = flv.Body.Read(b); err != nil { |
|
|
|
if n, err = flv.Body.Read(b); err != nil { |
|
|
|
fmt.Println("Recv from backend failed, err is", err) |
|
|
|
return |
|
|
|
} |
|
|
@ -47,4 +59,4 @@ func main() { |
|
|
|
fmt.Println("Serve failed, err is", err) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |