Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie http.Hijacker mit Gorilla Websockets und alexedwards/scs/v2

So implementieren Sie http.Hijacker mit Gorilla Websockets und alexedwards/scs/v2

PHPz
PHPznach vorne
2024-02-10 13:21:081239Durchsuche

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

Der Herausgeber von PHP Apple stellt Ihnen heute eine Methode zur Implementierung von http.Hijacker mithilfe von Gorilla Websockets und der Bibliothek alexedwards/scs/v2 vor. Diese Methode kann Entwicklern dabei helfen, Echtzeit-Kommunikationsfunktionen in ihren eigenen Anwendungen zu implementieren. Unabhängig davon, ob es sich um einen Chatroom oder Echtzeit-Updates usw. handelt, kann sie auf diese Weise implementiert werden. Als nächstes erklären wir im Detail, wie Sie diese beiden Bibliotheken verwenden, um http.Hijacker zu implementieren und Ihre Anwendung leistungsfähiger und flexibler zu machen.

Frageninhalt

Die hervorragenden alexedwards/scs/v2 in Go-Webanwendungen wurden kürzlich von 2.5.0 auf 2.7.0 aktualisiert, damit Go 1.20+ http.NewResponseController() unterstützen kann. Ermöglichen Sie anschließend das erweiterungshandlerspezifische serverseitige Schreib-Timeout für das Hochladen großer Dateien. Das ist gut. Eine bedauerliche Folge dieses notwendigen Upgrades ist der Verlust der Websocket-Funktionalität, die derzeit Gorilla Websockets v1.5.1 (neueste Version) verwendet. Ich erhalte eine häufige Fehlermeldung, wenn ich versuche, eine Verbindung zum Upgrade herzustellen ... websocket: Antwort nicht implementiert http.Hijacker Ich habe mir ein paar Threads zu diesem Thema angesehen, einige davon auf SO, aber ich konnte nichts Spezielles zu diesem Fall klären. Ich habe ein paar Dinge ausprobiert, um http.Hijacker zusammen mit meinem anderen Middleware-Code in meinen Websocket-Endpunkt-Handler zu implementieren (auskommentiert, zur Veranschaulichung ein „irreführendes“ Beispiel angehängt) ... Ich glaube einfach, dass ich das nicht gut genug verstehe. ..

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)
}

Das „w“ in diesem Beispiel ist *scs.sessionResponseWriter. Wie kann ich http.Hijacker in der Antwort implementieren, ohne die Verbindung zu unterbrechen und ein Upgrade durchzuführen? Was ist der richtige Ansatz?

Problemumgehung

alexedwards/scs/v2-Paketversion 2.5.0 unterstützt die Hijacker-Schnittstelle. Version 2.7.0 unterstützt die Hijacker-Schnittstelle nicht, unterstützt aber unterstützt Response Controller. Das Gorilla-Websocket-Paket verwendet keine Antwort-Controller.

Option 1

Verwendung von 2.5.0 des alexedwards/scs/v2-Pakets.

Option 2

Beheben Sie den Fehler im Gorilla-Paket, indem Sie den Antwortschreiber in Ihrem Anwendungscode entpacken:

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)
}

Das obige ist der detaillierte Inhalt vonSo implementieren Sie http.Hijacker mit Gorilla Websockets und alexedwards/scs/v2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen