gpt4 book ai didi

go - 覆盖 http.Server.Serve

转载 作者:IT王子 更新时间:2023-10-29 01:02:43 25 4
gpt4 key购买 nike

我需要在我自己的服务器结构中嵌入默认的 http.Server 并自定义 Serve 方法。

服务器需要短路 go c.serve() 调用,并且只有在它有可用的计算资源在 50 毫秒内响应时才运行该行。否则服务器将发送 204 并继续。

几乎很简单。

type PragmaticServer struct {
http.Server
Addr string
Handler http.Handler
}

func (srv *PragmaticServer) Serve(l net.Listener) error {
defer l.Close()
var tempDelay time.Duration // how long to sleep on accept failure
for {
// SNIP for clarity
c, err := srv.newConn(rw)
if err != nil {
continue
}
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve()
}
}

所以,再说一遍。这几乎有效。除了 srv.newConn 是一个未导出的方法,c.servec.setState 也是,这意味着我最终不得不复制并粘贴几乎整个 net/http 以便编译。这基本上是一个 fork 。有没有更好的方法来做到这一点?

最佳答案

不幸的是,如果不重新实现大部分服务器代码,您将无法做到这一点。除此之外,我们通常会在 conn.Accept 之前或在 Handler.ServerHTTP 之后拦截调用。

第一种方法是创建一个自定义的 net.Listener,它甚至在将连接传递给 http.Server 之前就过滤掉它们。虽然这可以更快地响应并消耗更少的资源,但是它使编写 http 响应变得不那么方便,并且使您无法限制对已打开连接的请求。

处理此问题的第二种方法是在完成任何实际工作之前包装处理程序并拦截请求。您很可能想创建一个 http.Handler 来过滤请求,并将它们传递给您的主处理程序。这也可以更加灵活,因为您可以根据路线或其他请求信息进行过滤(如果您愿意)。

关于go - 覆盖 http.Server.Serve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679000/

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