带有Web代理的Golang Gorilla Websocket

带有Web代理的Golang Gorilla Websocket,go,proxy,websocket,gorilla,Go,Proxy,Websocket,Gorilla,我正在开发一个POC,使用Gorilla/Websocket通过Web代理与Websocket检查网站“echo.Websocket.org”进行通信 我正在使用免费的在线代理“hide.me/en/”进行测试 当我尝试与“echo.websocket.org”(服务器端)通信时,我的客户机站点websocket POC会收到响应 但当我尝试添加代理手势时,一切都出错了:( 以下是我的代码示例: package main import ( "flag" "log" "n

我正在开发一个POC,使用Gorilla/Websocket通过Web代理与Websocket检查网站“echo.Websocket.org”进行通信

我正在使用免费的在线代理“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
        }
    }
}
主程序包
进口(
“旗帜”
“日志”
“网络/网址”
“操作系统”
“操作系统/信号”
“时间”
“github.com/gorilla/websocket”
“net/http”
)
var addrWebsocket=flag.String(“addrWebsocket”、“echo.websocket.org”、“http服务地址”)
func main(){
flag.Parse()
log.SetFlags(0)
中断:=接通(切换操作信号,1)
信号通知(中断,操作系统中断)
//初始化WebSocket URL和要遵循的路径
uWS:=url.url{Scheme:“wss”,主机:*addrWebsocket}
//初始化代理URL和要遵循的路径
uProxy,xy:=url.Parse(“https://hide.me/en/proxy")
//设置拨号程序(尤其是代理)
拨号器:=websocket.拨号器{
代理:http.ProxyURL(uProxy),
}
//拨号器:=websocket.DefaultDialer==>使用此默认拨号器,它可以工作!
c、 _u,err:=dialer.Dial(uWS.String(),nil)/=>使用代理配置,在这里失败!
推迟c.结束()
完成:=make(chan结构{})
go func(){
推迟c.结束()
延迟关闭(完成)
为了{
_,消息,错误:=c.ReadMessage()
如果错误!=零{
log.Println(“读取:”,错误)
返回
}
log.Printf(“记录:%s”,消息)
}
}()
股票代码:=time.NewTicker(time.Second)
延迟停止
为了{
挑选{

案例t:=代码正确。服务器不是代理服务器。

代码正确。服务器不是代理服务器。

失败的函数返回的错误是什么?您好,这是一个“400错误请求”是代理服务器吗?我建议使用普通HTTP请求进行测试。这是一个用于匿名导航的在线代理解决方案。我认为这是一个用于测试websocket客户端的良好外部代理解决方案。您能解释一下“普通HTTP请求”的确切建议吗在go lang?ThanksI中,我建议您在不升级websocket的情况下通过代理测试HTTP请求。使用代理url创建客户端:
c:=HTTP.client{Transport:&HTTP.Transport{proxy:HTTP.ProxyURL(uProxy)}
,确认
c.Get('http://stackoverflow.com/")
有效。如果有效,请尝试了解websocket的情况。失败的函数返回的错误是什么?您好,这是一个“400错误请求”是代理服务器吗?我建议使用普通HTTP请求进行测试。这是一个用于匿名导航的在线代理解决方案。我认为这是一个用于测试websocket客户端的良好外部代理解决方案。您能解释一下“普通HTTP请求”的确切建议吗在go lang?ThanksI中,我建议您在不升级websocket的情况下通过代理测试HTTP请求。使用代理url创建客户端:
c:=HTTP.client{Transport:&HTTP.Transport{proxy:HTTP.ProxyURL(uProxy)}
,确认
c.Get('http://stackoverflow.com/")
有效。如果有效,请尝试了解websocket的情况。