如何正确拒绝 websocket 升级请求?

有时我想拒绝 http 客户端升级到 websocket 连接的请求。


代码

(使用go'sGin和gorilla/websocket框架:)


允许升级:


c, err := ctl.upgrader.Upgrade(ctx.Writer, ctx.Request, nil)

err = c.WriteJSON(resp)

拒绝升级(由于请求参数无效):


if contentId == "" || !exists {

    // FIXME: provide response in a way that ws client can recognize & show tip?

    ctx.String(http.StatusBadRequest, "invalid or non-existing contentId")

    return

}

说明:这里拒绝升级我只是返回一个http400代码,然后终止连接,根本没有做升级。


问题

使用 about 代码拒绝 websocket 升级请求的问题是,websocket 客户端(例如js)无法在我的响应中读取数据(文本或 json) 。


代码 - 客户端( js):


ws.onerror = function (evt) {

    // TOOD: handle error, (e.g print error msg?),

    print("ERROR");

}

它确实打印了"ERROR"拒绝,但是在检查了有关该evt对象的 chrome 开发人员工具后,找不到获取服务器响应数据的方法,因此我无法以拒绝的原因向前端 UI 显示提示。

问题

  • 如何正确拒绝 websocket 升级请求,并让客户端能够接收返回的原因/数据?(例如客户端js服务器go// gingorilla/websocket

  • 除了返回 http 代码之外,有没有更好的方法来拒绝 websocket 升级请求400



明月笑刀无情
浏览 166回答 1
1回答

交互式爱情

要拒绝 websocket 连接,请不要按照问题中的描述升级连接。浏览器 API 不提供有关连接被拒绝的原因的信息,因为该信息可能违反同源策略。执行以下操作以将错误原因发送回客户端应用程序或用户:升级连接。发送带有错误原因的关闭消息。关闭连接。这是一个例子:c, err := ctl.upgrader.Upgrade(ctx.Writer, ctx.Request, nil)if err != nil {    // TODO: handle error}if contentId == "" || !exists {    c.WriteMessage(websocket.CloseMessage,         websocket.FormatCloseMessage(websocket.ClosePolicyViolation,          "bad content id or not exist"))    c.Close()    return}// Continue with non-error case here.从 JS 中的关闭处理程序访问原因:ws.onclose = function (evt) {    if (evt.code == 1008) {  // 1008 is policy violation       console.log(evt.reason)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go