我需要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.serveand 一样c.setState,这意味着我最终不得不复制和粘贴几乎全部内容net/http才能编译。这基本上是一个叉子。有没有更好的方法来做到这一点?
1 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
不幸的是,如果不重新实现大部分服务器代码,您将无法做到这一点。除此之外,我们通常会在 at 之前conn.Accept
或 at 之后拦截调用Handler.ServerHTTP
。
第一种方法是创建一个自定义net.Listener
,在连接被移交给http.Server
. 虽然这可以更快地响应并消耗更少的资源,但是它使编写 http 响应变得不那么方便,并且阻止您限制对已经打开的连接的请求。
第二种处理方法是在任何实际工作完成之前包装处理程序并拦截请求。您很可能希望创建一个http.Handler
来过滤请求,并将它们传递给您的主处理程序。这也可以更灵活,因为您可以根据路由或其他请求信息进行过滤(如果您愿意的话)。
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消