Whi*_*aws 4 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
},
}
Run Code Online (Sandbox Code Playgroud)
但感觉不对。因此,我正在寻找解决该问题的方法。
更新:在再次查看该问题后,我似乎实际上希望将原始标头添加到客户端实现中,即 javascript websocket 实现
@benjic 我通过 javascript html5 应用程序连接到 websocket,该应用程序未托管在同一服务器上,而是由我通过 chrome 在本地运行
那么我该怎么做呢。
阅读Gorilla WebSocket 文档CheckOrigin表明,当为类型字段提供 nil 值时,Upgrader将使用安全默认值。默认情况下,会在允许请求之前检查传入请求的Origin字段和Host标头值,以确认它们相等。该文档表明浏览器不强制执行跨源有效性,服务器应用程序有责任强制执行。您可以在Gorilla 库的源代码中确切地看到这是如何完成的。
文档和源代码指示了包Upgrade中的一个函数websocket,该函数充当上面示例代码的工厂。工厂函数采用自定义缓冲区大小并覆盖 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!"))
}
Run Code Online (Sandbox Code Playgroud)