2016-04-01 7 views
0

Ich arbeite an einem POC mit Gorilla/Websocket, um über einen Web Proxy mit der Websocket Check Website "echo.websocket.org" zu kommunizieren.Golang Gorilla Websocket mit Web Proxy

Ich benutze den kostenlosen Online-Proxy "hide.me/en/" zum Testen.

Wenn ich einfach versuche, mit "echo.websocket.org" (Server-Seite) zu kommunizieren, erreiche mein Websocket POC auf der Client-Seite die Antwort.

Aber wenn ich versuche, die Proxy-Geste an, geht alles schief :(

Hier ist ein Beispiel von meinem Code ist:

package main 

import (
    "flag" 
    "log" 
    "net/url" 
    "os" 
    "os/signal" 
    "time" 

    "github.com/gorilla/websocket" 
    "net/http" 
) 

var addrWebsocket = flag.String("addrWebsocket", "echo.websocket.org", "http service address") 

func main() { 
    flag.Parse() 
    log.SetFlags(0) 

    interrupt := make(chan os.Signal, 1) 
    signal.Notify(interrupt, os.Interrupt) 

    //Initialize the WebSocket URL and the Path to follow 
    uWS := url.URL{Scheme: "wss", Host: *addrWebsocket} 

    //Initialize the Proxy URL and the Path to follow 
    uProxy, _ := url.Parse("https://hide.me/en/proxy") 

    //Set the Dialer (especially the proxy) 
    dialer := websocket.Dialer{ 
     Proxy: http.ProxyURL(uProxy), 
    } 
    //dialer := websocket.DefaultDialer ==> with this default dialer, it works ! 

    c, _, err := dialer.Dial(uWS.String(), nil) // ==> With the proxy config, it fails here ! 
    defer c.Close() 

    done := make(chan struct{}) 

    go func() { 
     defer c.Close() 
     defer close(done) 
     for { 
      _, message, err := c.ReadMessage() 
      if err != nil { 
       log.Println("read:", err) 
       return 
      } 
      log.Printf("recv: %s", message) 
     } 
    }() 

    ticker := time.NewTicker(time.Second) 
    defer ticker.Stop() 

    for { 
     select { 
     case t := <-ticker.C: 
      err := c.WriteMessage(websocket.TextMessage, []byte(t.String())) 
      if err != nil { 
       log.Println("write:", err) 
       return 
      } 
     case <-interrupt: 
      log.Println("interrupt") 
      err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) 
      if err != nil { 
       log.Println("write close:", err) 
       return 
      } 
       select { 
       case <-done: 
       case <-time.After(time.Second): 
       } 
      c.Close() 
      return 
     } 
    } 
} 

ich ein sehr Anfänger in Go bin nicht so tun zögern, mich zu korrigieren, wenn mein Code un nicht klar und sauber.

Vielen Dank für Ihre Hilfe!

+0

Welcher Fehler wird von der fehlgeschlagenen Funktion zurückgegeben? –

+0

Hallo, es ist eine "400 Bad Request" –

+0

Ist https://hide.me/en/proxy ein Proxy-Server? Ich schlage vor, es mit einer einfachen HTTP-Anfrage zu testen. –

Antwort