@@ -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+
269334func main () {
270335 var addr = flag .String ("addr" , "127.0.0.1:8080" , "The addr of the application." )
271336 flag .Parse ()
0 commit comments