2016-04-01 6 views
0

私はGorilla/Websocketを使用してPOCを作成し、Webプロキシ経由でWebsocket Checkウェブサイト "echo.websocket.org"と通信しています。Golilla Gorilla Websocket with Web Proxy

私は無料オンラインプロキシ "hide.me/en/"を使用してテストしています。

私は単に "echo.websocket.org"(サーバー側)との通信を試みると、クライアントサイトのWebsocket POCが応答を返します。

しかし、私はプロキシジェスチャーを追加しようとすると、すべてがうまくいかない:(

ここでは、私のコードのサンプルです:

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 
     } 
    } 
} 

私はそうではない行くには非常に初心者です私のコード未クリアできれいではないなら、私を修正することを躊躇。あなたの助けを

ありがとう!

+0

失敗した関数から返されるエラーは何ですか? –

+0

こんにちは、 "400 Bad Request"です –

+0

https://hide.me/en/proxyはプロキシサーバーですか?プレーンなHTTPリクエストでテストすることをお勧めします。 –

答えて

0

コードが正しい。サーバーhttps://hide.meプロキシサーバーではありません。