php小编苹果今天为大家介绍一种使用Gorilla Websockets和alexedwards/scs/v2库来实现http.Hijacker的方法。这种方法可以帮助开发者在自己的应用程序中实现实时通信的功能,无论是聊天室还是实时更新等场景,都可以通过这种方式实现。接下来,我们将详细讲解如何使用这两个库来实现http.Hijacker,让你的应用程序更加强大和灵活。
问题内容
最近将 Go Web 应用程序中出色的 alexedwards/scs/v2 从 2.5.0 升级到 2.7.0,以允许 Go 1.20+ 支持 http.NewResponseController()。随后允许扩展处理程序特定的服务器写入超时以进行大文件上传。这很好。 此必要升级的一个不幸后果是 websocket 功能的丢失,目前使用 Gorilla websockets v1.5.1(最新)。我在尝试连接升级时遇到常见错误... websocket:响应未实现 http.Hijacker 我已经为此研究了几个线索,其中一些是关于 SO 的,但我还无法解决任何特定于本案的问题。 我已经尝试了一些尝试与我的其他中间件代码一起并在我的 websocket 端点处理程序中实现 http.Hijacker (注释掉,附加“误导”示例以供说明)...我只是认为我对此理解得不够好。 ..
type WebsocketConnection struct {
*websocket.Conn
}
type WebsocketPayload struct {
Action string `json:"action"`
Message string `json:"message"`
AdminName string `json:"admin_name"`
MessageType string `json:"message_type"`
AdminID int `json:"admin_id"`
Connection WebsocketConnection `json:"-"`
}
type WebsocketJSONResponse struct {
Action string `json:"action"`
Message string `json:"message"`
AdminName string `json:"admin_name"`
AdminID int `json:"admin_id"`
CurrentLogins []string `json:"current_logins"`
}
var upgradeConnection = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true },
}
var webClients = make(map[WebsocketConnection]string)
var websocketChannel = make(chan WebsocketPayload)
func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) {
// rc := http.NewResponseController(w)
// netConn, _, err := rc.Hijack()
// if err != nil {
// app.errorLog.Println(err)
// return
// }
// defer netConn.Close()
app.debugLog.Printf("w's type is %T\n", w)
ws, err := upgradeConnection.Upgrade(w, r, nil)
if err != nil {
app.errorLog.Println(err) <= ERROR HERE
return
}
app.infoLog.Printf("Web client connected from %s", r.RemoteAddr)
var response WebsocketJSONResponse
response.Message = "Connected to server..."
err = ws.WriteJSON(response)
if err != nil {
app.errorLog.Println(err)
return
}
conn := WebsocketConnection{Conn: ws}
webClients[conn] = ""
go app.ListenForWebsocket(&conn)
}
本例中的“w”是*scs.sessionResponseWriter。 如何在响应中实现 http.Hijacker 而不破坏连接并进行升级?请问正确的做法是什么?
解决方法
alexedwards/scs/v2 软件包版本 2.5.0 支持劫持者接口。 2.7.0 版本不支持 Hijacker 接口,但支持 支持响应控制器。 gorilla websocket 包不使用响应控制器。
选项 1
使用 alexedwards/scs/v2 软件包的 2.5.0。
选项 2
通过在应用程序代码中解开响应编写器来解决 gorilla 包的缺陷:
func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) {
wupgrade := w
if u, ok := w.(interface{ Unwrap() http.ResponseWriter }); ok {
wupgrade = u.Unwrap()
}
app.debugLog.Printf("w's type is %T\n", w)
ws, err := upgradeConnection.Upgrade(wupgrade, r, nil)
if err != nil {
app.errorLog.Println(err)
return
}
app.infoLog.Printf("Web client connected from %s", r.RemoteAddr)
var response WebsocketJSONResponse
response.Message = "Connected to server..."
err = ws.WriteJSON(response)
if err != nil {
app.errorLog.Println(err)
return
}
conn := WebsocketConnection{Conn: ws}
webClients[conn] = ""
go app.ListenForWebsocket(&conn)
}
以上就是如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker的详细内容,更多请关注编程网其它相关文章!