Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan alexedwards/scs/v2

Bagaimana untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan alexedwards/scs/v2

PHPz
PHPzke hadapan
2024-02-10 13:21:081239semak imbas

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

Editor PHP Apple hari ini memperkenalkan kepada anda kaedah untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan perpustakaan alexedwards/scs/v2. Kaedah ini boleh membantu pembangun melaksanakan fungsi komunikasi masa nyata dalam aplikasi mereka sendiri, sama ada ruang sembang atau kemas kini masa nyata, dsb., boleh dilaksanakan dengan cara ini. Seterusnya, kami akan menerangkan secara terperinci cara menggunakan kedua-dua perpustakaan ini untuk melaksanakan http.Hijacker untuk menjadikan aplikasi anda lebih berkuasa dan fleksibel.

Kandungan soalan

Alexedwards/scs/v2 yang sangat baik dalam aplikasi web Go baru-baru ini dinaik taraf daripada 2.5.0 kepada 2.7.0 untuk membolehkan Go 1.20+ menyokong http.NewResponseController(). Selepas itu benarkan tamat masa tulis pelayan khusus pengendali sambungan untuk muat naik fail yang besar. Ini bagus. Akibat malang daripada peningkatan yang diperlukan ini ialah kehilangan kefungsian soket web, pada masa ini menggunakan soket web Gorilla v1.5.1 (terkini). Saya mendapat ralat biasa apabila cuba menyambung untuk menaik taraf... soket web: respons tidak dilaksanakan http.Hijacker Saya telah meneliti beberapa utas untuk ini, beberapa daripadanya di SO, tetapi saya tidak dapat menyelesaikan apa-apa yang khusus untuk kes ini. Saya telah mencuba beberapa perkara untuk mencuba dan melaksanakan http.Hijacker dalam pengendali titik akhir soket web saya bersama-sama dengan kod perisian tengah saya yang lain (diulas, dilampirkan contoh "mengelirukan" untuk ilustrasi)... Saya cuma rasa saya faham ini Tidak cukup baik. ..

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" dalam contoh ini ialah *scs.sessionResponseWriter. Bagaimanakah saya boleh melaksanakan http.Hijacker dalam respons tanpa memutuskan sambungan dan menaik taraf? Apakah pendekatan yang betul?

Penyelesaian

pakej alexedwards/scs/v2 versi 2.5.0 menyokong antara muka perampas. Versi 2.7.0 tidak menyokong antara muka Hijacker, tetapi menyokong menyokong pengawal tindak balas. Pakej soket web gorila tidak menggunakan pengawal tindak balas.

Pilihan 1

Menggunakan 2.5.0 pakej alexedwards/scs/v2.

Pilihan 2

Betulkan kecacatan pakej gorila dengan membongkar penulis respons dalam kod aplikasi anda:

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

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan http.Hijacker menggunakan Gorilla Websockets dan alexedwards/scs/v2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam