有没有办法在不向客户端发送任何内容的情况下在 golang 中删除 http 连接?
Is there a way to drop an http connection in golang without sending anything to client?
在某些情况下,我不想向客户端响应任何内容,就好像某个端口没有任何响应,就好像该端口没有被使用。
示意图:
func handleClient(w http.ResponseWriter, r *http.Request) {
if ( **** condition **** ) {
// Drop connection without sending anything to client
} else {
// Normal response
}
}
如果能提供任何帮助或线索,我将不胜感激。
你可以劫持连接来访问底层的tcp连接。
golang中的标准http服务器支持。
下面是文档中的示例。
您可以直接调用 conn.Close()
和 return,而不是像本例中那样执行 defer 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()
})
在某些情况下,我不想向客户端响应任何内容,就好像某个端口没有任何响应,就好像该端口没有被使用。
示意图:
func handleClient(w http.ResponseWriter, r *http.Request) {
if ( **** condition **** ) {
// Drop connection without sending anything to client
} else {
// Normal response
}
}
如果能提供任何帮助或线索,我将不胜感激。
你可以劫持连接来访问底层的tcp连接。 golang中的标准http服务器支持。
下面是文档中的示例。
您可以直接调用 conn.Close()
和 return,而不是像本例中那样执行 defer 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()
})