aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-04-04 14:26:05 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-04-04 14:26:05 +0200
commitae93cfbf8cdc9cd055c59cddb4f90f436cd2e405 (patch)
tree154fd90517ef63c0448109e8d1cb87e636d4bc12
parent07cc573c5d98ea93e65ad88da3c51be8f0137f88 (diff)
Tweak WS Proxy
-rw-r--r--ws.go27
1 files changed, 12 insertions, 15 deletions
diff --git a/ws.go b/ws.go
index b54c2ce..b1cb1a3 100644
--- a/ws.go
+++ b/ws.go
@@ -5,7 +5,6 @@ import (
"net"
"net/http"
"net/url"
- "path"
)
type WebSocketProxy struct {
@@ -13,33 +12,32 @@ type WebSocketProxy struct {
}
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
- }
-
- conn, _, err := hj.Hijack()
+ 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) {
@@ -55,7 +53,6 @@ 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}
}