更新:使用js websockets发送origin标头

时间:2015-10-24 21:05:21

标签: go websocket gorilla

我在Go中一直在使用gorilla-websocket,当我实现基本的echo示例时,我在部署服务器后记录了一个错误,

  

未找到原点   Websocket版本!= 13

我找到了一种方法来绕过这个,通过使检查原点的函数总是返回true

var wsUpgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

但它感觉不对。因此,我正在寻找解决该问题的方法。

更新:再看一下这个问题之后,似乎我真的希望将原始头添加到客户端实现,即javascript websocket实现

@benjic 我通过javascript html5应用程序连接到websocket,该应用程序不是托管在同一台服务器上,而是由我通过chrome本地运行

那我该怎么做呢。

1 个答案:

答案 0 :(得分:2)

阅读Gorilla WebSocket Documentation表示,当为Upgrader类型的CheckOrigin字段提供nil值时,会使用安全默认值。默认情况下,使用主机标头值检查传入请求的 Origin 字段,以确认它们在允许请求之前是否相等。该文档表明浏览器不强制执行跨源有效性,并且服务器应用程序负责执行。你可以在Gorilla库的source code中看到这是如何完成的。

文档和来源指示websocket包中的Upgrade函数,该函数充当上述示例代码的工厂。 The factory function采用自定义缓冲区大小并覆盖CheckOrigin以始终返回true。您可以在Upgrader中使用此工厂函数来升级您的连接,而不是创建自定义HttpHandler

func webSocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
    defer conn.Close()

    if err != nil {
        http.Error(w, err, http.StatusInternalServerError)
        return
    }

    conn.WriteMessage(websocket.TextMessage, []byte("Hello, world!"))
}