首頁 >後端開發 >Golang >如何使用 Gorilla Websockets 和 alexedwards/scs/v2 實作 http.Hijacker

如何使用 Gorilla Websockets 和 alexedwards/scs/v2 實作 http.Hijacker

PHPz
PHPz轉載
2024-02-10 13:21:081319瀏覽

如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker

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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除