文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-02-10 14:48

关注

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的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯