Skip to content

Commit e705baa

Browse files
chore: update proxy.go
Signed-off-by: saurabhraghuvanshii <[email protected]>
1 parent 45793f4 commit e705baa

File tree

1 file changed

+67
-2
lines changed

1 file changed

+67
-2
lines changed

vm/proxy/proxy.go

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,10 @@ func (p *Proxy) ServeHTTP(wr http.ResponseWriter, req *http.Request) {
211211
}
212212

213213
default:
214-
//http: Request.RequestURI can't be set in client requests.
215-
//http://golang.org/src/pkg/net/http/client.go
214+
if strings.EqualFold(req.Header.Get("Upgrade"), "websocket") {
215+
p.proxyWebsocket(wr, req)
216+
return
217+
}
216218
req.RequestURI = ""
217219
req.URL.Scheme = "http"
218220

@@ -266,6 +268,69 @@ func (p *Proxy) ServeHTTP(wr http.ResponseWriter, req *http.Request) {
266268
}
267269
}
268270

271+
func (p *Proxy) proxyWebsocket(wr http.ResponseWriter, req *http.Request) {
272+
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
273+
274+
clientConn, err := upgrader.Upgrade(wr, req, nil)
275+
if err != nil {
276+
log.Println("websocket upgrade (client) failed:", err)
277+
return
278+
}
279+
280+
upstreamURL := fmt.Sprintf("ws://%s%s", MesheryServerHost, req.URL.RequestURI())
281+
282+
header := http.Header{}
283+
copyHeader(header, req.Header)
284+
285+
if p.token != "" {
286+
header.Add("Cookie", fmt.Sprintf("token=%s", p.token))
287+
header.Add("Cookie", "meshery-provider=Layer5")
288+
}
289+
290+
backendConn, _, err := websocket.DefaultDialer.Dial(upstreamURL, header)
291+
if err != nil {
292+
log.Println("websocket dial (backend) failed:", err)
293+
clientConn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseTryAgainLater, err.Error()))
294+
clientConn.Close()
295+
return
296+
}
297+
298+
errc := make(chan error, 2)
299+
300+
go func() {
301+
for {
302+
mt, message, err := clientConn.ReadMessage()
303+
if err != nil {
304+
errc <- err
305+
return
306+
}
307+
if err := backendConn.WriteMessage(mt, message); err != nil {
308+
errc <- err
309+
return
310+
}
311+
}
312+
}()
313+
314+
go func() {
315+
for {
316+
mt, message, err := backendConn.ReadMessage()
317+
if err != nil {
318+
errc <- err
319+
return
320+
}
321+
if err := clientConn.WriteMessage(mt, message); err != nil {
322+
errc <- err
323+
return
324+
}
325+
}
326+
}()
327+
328+
<-errc
329+
330+
clientConn.Close()
331+
backendConn.Close()
332+
}
333+
269334
func main() {
270335
var addr = flag.String("addr", "127.0.0.1:8080", "The addr of the application.")
271336
flag.Parse()

0 commit comments

Comments
 (0)