最近将Go Webapp中优秀的alexedwards/scs/v2从2.5.0升级到2.7.0,以允许Go 1.20+支持HTTP.NewResponseController().随后允许为大型文件上传延长处理程序特定的服务器写入超时.这个不错. 这一必要升级的一个不幸后果是失go 了WebSocket功能,目前使用的是Gorilla WebSockets v1.5.1(最新版本).我收到在try 连接升级时产生的常见错误... websocket: response does not implement http.Hijacker个 我已经研究了这件事的几条线索,这里有几条线索,但我还不能解决任何与此案相关的问题. 我已经try 了几次在我的其他中间件代码和我的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.essionResponseWriter. 如何在不 destruct 连接的情况下在响应中实现Http.Hijacker并进行升级?请问正确的方法是什么?