gpt4 book ai didi

http - 服务器端相当于 ClientTrace 中的 go

转载 作者:IT王子 更新时间:2023-10-29 02:21:00 27 4
gpt4 key购买 nike

https://golang.org/src/net/http/httptrace/trace.go#L79允许为 http 连接的客户端 Hook 。是否有 WroteHeaders 的任何服务器端等效项,即类似 RecievedHeaders 的内容。

我查看了go源码,没有找到相关细节。我希望能够尽快响应请求,如果给定的 header 丢失,这可能就像关闭连接一样简单。

最佳答案

标准库不支持此类内置回调,但您可以轻松创建一个。

根据传入(请求) header 拒绝

这简直了。只需通过验证传入的请求 header 来启动您的处理程序。这已经足够了,因为一旦处理(读取)传入的 HTTP header 而不是请求正文,就会调用您的处理程序函数。要判断传入 header 是否丢失,您无论如何都必须读取所有 HTTP header 。

基于远程IP拒绝

如果您想拒绝基于远程 IP 的请求,您可以创建并使用自己的 http.Server实例,它有一个 Server.ConnState 字段,您可以在其中设置回调函数。此回调将在 http.ConnState 中详细说明状态更改时调用。 . StateNew 为新连接触发,StateActive 在调用任何处理程序之前触发。虽然您无法在回调中发出信号表示您想要拒绝请求,但您始终可以关闭传递给回调的连接。

如果您不想这样做,您仍然可以检查并拒绝处理程序中的请求(在读取/处理请求正文之前),有关详细信息,请参阅 How to limit client IP address when using golang http package .

基于传出(响应) header 拒绝

你可以做的是模拟 http.ResponseWriter .在将任何数据作为响应发送回客户端之前,必须写入 HTTP 状态代码和 HTTP header 。这是由 ResponseWriter.WriteHeader() 方法触发的。所以包装原始的 http.ResponseWriter,提供您自己的 WriteHeader() 实现,您可以在其中检查已设置和即将发送的 header 。在检查过程中,如果您发现某些 header 丢失,您可能会决定发回错误并停止提供将由“下游”处理程序写入的数据。

这是一个模拟 ResponseWriter 的例子:

type MyResponseWriter struct {
http.ResponseWriter
err error
}

func (mrw *MyResponseWriter) WriteHeader(statusCode int) {
// Inspect headers:
headers := mrw.Header()
if len(headers["myheader"]) == 0 {
mrw.ResponseWriter.WriteHeader(http.StatusInternalServerError)
mrw.err = fmt.Errorf("myheader was not set")
return
}

// Headers ok, let call "through":
mrw.ResponseWriter.WriteHeader(statusCode)
}

func (mrw *MyResponseWriter) Write(p []byte) (int, error) {
if mrw.err != nil {
return 0, mrw.err
}
return mrw.ResponseWriter.Write(p)
}

它的作用是在 MyResponseWriter.WriteHeader() 中查找 HTTP header “myheader”。如果缺少,则向客户端报告 HTTP 500 内部服务器错误,并跳过所有 Write()(过滤掉将由处理程序发送的响应)。

这是一个将它用于特定处理程序的简单示例:

func fooHandler(w http.ResponseWriter, r *http.Request) {
}

func main() {
http.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
w2 := &MyResponseWriter{ResponseWriter: w}
fooHandler(w2, r)
})
// ...
}

请注意,为了节省资源,MyResponseWriter 应该表明它不会“转发”数据到客户端,因此后续处理程序可以省略写入数据。这可以通过提供一种方法来实现,处理程序可以使用类型断言检查该方法,或者它可以替换请求的上下文并取消它(处理程序必须“监视”上下文才能正常工作)。

另见 Golang read request body (其中详细模拟了请求和响应)。

关于http - 服务器端相当于 ClientTrace 中的 go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49667175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com