我在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本地运行
那我该怎么做呢。
答案 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!"))
}