为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在不向客户端发送任何内容的情况下在 golang 中删除 http 连接?

有没有办法在不向客户端发送任何内容的情况下在 golang 中删除 http 连接?

Go
一只名叫tom的猫 2022-12-19 10:45:32
在某些情况下,我不想向客户端响应任何内容,就好像某个端口没有任何响应一样,就好像该端口未被使用一样。示意图:func handleClient(w http.ResponseWriter, r *http.Request) {    if ( **** condition **** ) {        // Drop connection without sending anything to client    } else {        // Normal response    }    }我将不胜感激任何帮助或线索来负担得起。
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

您可以劫持连接以访问底层的 tcp 连接。它由 golang 中的标准 http 服务器支持。


以下是文档中的示例。您可以直接调用并返回,而不是像本例

中那样做,这将断开连接。defer conn.Close()conn.Close()


请记住,此时连接已被接受。如果你甚至不想接受连接,你需要实现一个自定义的 tcp 侦听器,有条件地将流量路由到你的 http 服务器。您还必须考虑您的情况。或者例如,您是否需要从 http 请求中读取任何内容以确定您的条件的结果?


http.HandleFunc("/hijack", func(w http.ResponseWriter, r *http.Request) {

        hj, ok := w.(http.Hijacker)

        if !ok {

            http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)

            return

        }

        conn, bufrw, err := hj.Hijack()

        if err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

            return

        }

        // Don't forget to close the connection:

        defer conn.Close()

        bufrw.WriteString("Now we're speaking raw TCP. Say hi: ")

        bufrw.Flush()

        s, err := bufrw.ReadString('\n')

        if err != nil {

            log.Printf("error reading string: %v", err)

            return

        }

        fmt.Fprintf(bufrw, "You said: %q\nBye.\n", s)

        bufrw.Flush()

    })

完整文档: https ://pkg.go.dev/net/http#Hijacker


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信