aboutsummaryrefslogtreecommitdiff
path: root/ws.go
diff options
context:
space:
mode:
Diffstat (limited to 'ws.go')
-rw-r--r--ws.go41
1 files changed, 19 insertions, 22 deletions
diff --git a/ws.go b/ws.go
index b54c2ce..b07a17b 100644
--- a/ws.go
+++ b/ws.go
@@ -5,41 +5,47 @@ import (
"net"
"net/http"
"net/url"
- "path"
)
type WebSocketProxy struct {
Director func(*http.Request)
}
-func (p *WebSocketProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- hj, ok := w.(http.Hijacker)
- if !ok {
- http.Error(w, "Not a hijacker", http.StatusInternalServerError)
- return
+func NewWebSocketProxy(target *url.URL) *WebSocketProxy {
+ director := func(req *http.Request) {
+ req.URL.Scheme = target.Scheme
+ req.URL.Host = target.Host
}
+ return &WebSocketProxy{Director: director}
+}
- conn, _, err := hj.Hijack()
+func (p *WebSocketProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ p.Director(r)
+ d, err := net.Dial("tcp", r.URL.Host)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
- defer conn.Close()
-
- p.Director(r)
+ defer d.Close()
- d, err := net.Dial("tcp", r.URL.Host)
+ // pass first request to upstream
+ err = r.Write(d)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
- defer d.Close()
- err = r.Write(d)
+ hj, ok := w.(http.Hijacker)
+ if !ok {
+ http.Error(w, "Not a hijacker", http.StatusInternalServerError)
+ return
+ }
+ conn, _, err := hj.Hijack()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
+ defer conn.Close()
errc := make(chan error, 2)
cp := func(dst io.Writer, src io.Reader) {
@@ -50,12 +56,3 @@ func (p *WebSocketProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
go cp(conn, d)
<-errc
}
-
-func NewWebSocketProxy(target *url.URL) *WebSocketProxy {
- director := func(req *http.Request) {
- req.URL.Scheme = target.Scheme
- req.URL.Host = target.Host
- req.URL.Path = path.Join(target.Path, req.URL.Path)
- }
- return &WebSocketProxy{Director: director}
-}