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

覆盖 http.Server.Serve

覆盖 http.Server.Serve

Go
海绵宝宝撒 2021-10-25 17:11:41
我需要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来过滤请求,并将它们传递给您的主处理程序。这也可以更灵活,因为您可以根据路由或其他请求信息进行过滤(如果您愿意的话)。


查看完整回答
反对 回复 2021-10-25
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

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