覆盖http.Server.Serve

时间:2015-07-28 14:17:03

标签: go

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

服务器需要将Serve呼叫短路,并且只有在50ms内有可用于响应的计算资源时才运行该线路。否则服务器将发送204并继续前进。

几乎直截了当。

go c.serve()

所以,再一次。这几乎可行。除了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.newConnc.serve也是如此,这意味着我最终必须复制并粘贴几乎所有c.setState以便这要编译。这基本上是一个分叉。有没有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:4)

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

第一种方法是创建一个自定义net.Listener,用于在连接切换到http.Server之前过滤掉连接。虽然这可以更快地响应并消耗更少的资源,但是它使得编写http响应变得不那么方便,并且阻止您限制对已经打开的连接的请求。

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