覆盖 http.Server.Serve

我需要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才能编译。这基本上是一个叉子。有没有更好的方法来做到这一点?


海绵宝宝撒
浏览 158回答 1
1回答

ibeautiful

不幸的是,如果不重新实现大部分服务器代码,您将无法做到这一点。除此之外,我们通常会在 at 之前conn.Accept或 at 之后拦截调用Handler.ServerHTTP。第一种方法是创建一个自定义net.Listener,在连接被移交给http.Server. 虽然这可以更快地响应并消耗更少的资源,但是它使编写 http 响应变得不那么方便,并且阻止您限制对已经打开的连接的请求。第二种处理方法是在任何实际工作完成之前包装处理程序并拦截请求。您很可能希望创建一个http.Handler来过滤请求,并将它们传递给您的主处理程序。这也可以更灵活,因为您可以根据路由或其他请求信息进行过滤(如果您愿意的话)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go