Go 捕获传递给http.Server.service的net.Listener
我想通过执行优雅的关机和一些其他小工具来扩展Go 捕获传递给http.Server.service的net.Listener,go,wrapper,httpserver,Go,Wrapper,Httpserver,我想通过执行优雅的关机和一些其他小工具来扩展http.Server功能,这些小工具将在我的http服务中共享。目前,我的代码或多或少地说: type MyServer struct { server *http.Server // ... } func (s *MyServer) ListenAndServe() { // Create listener and pass to s.server.Serve() } 这非常有效,但需要手动公开http.Server的所
http.Server
功能,这些小工具将在我的http服务中共享。目前,我的代码或多或少地说:
type MyServer struct {
server *http.Server
// ...
}
func (s *MyServer) ListenAndServe() {
// Create listener and pass to s.server.Serve()
}
这非常有效,但需要手动公开http.Server
的所有必要方法和变量
包装大多数方法不会是一个大问题,但我找不到一种明智的方法来公开对http.Server.ListenAndServeTLS的访问,而不从中实际复制实现。方法的最后一行是srv.service(tlsListener)
,我想提供我自己的service
方法,因此在将net.Listener
传递给http.Server.service
之前,可以修改net.Listener
我开始用铅笔写我的包装纸,简单地写:
type MyServer struct {
http.Server
}
func (s *MyServer) Serve(l net.Listener) {
// Wrap l with MyListener, pass to s.Server.Serve()
}
但是显然,无论是http.listenandservet
还是http.ListenAndServeTLS
都不会开始使用我的service
实现。我想请他们。。。有什么方法可以解决这个问题吗?http.Server
的设计是否有效地阻止了我解决这个问题
Hacks welcome:即使我不在生产中使用它们,我也会学到一些知识。http.ListenAndServe*
方法将适用于嵌入式类型。另一种方法是:
type MyServer struct {
http.Server
// ...
}
func (s *MyServer) ListenAndServe() error {
// create listener
// s.Server.Serve(s.listener)
}
func (s *MyServer) ListenAndServeTLS() error {
// create listener
// s.Server.Serve(s.tlsListener)
}
如果我调用
MyServer.ListenAndServeTLS
,那么将使用http.Server.service
,而不是我提供的实现。我想捕获在ListenAndServeTLS
中创建的net.Listener
。然后也实现ListenAndServeTLS()
,类似于我的示例中的ListenAndServe()
。更新示例:)这正是我的问题:我不想实现它,因为它非常重要。我可以从中复制实现,但不知道这是否可以避免。不要试图变得聪明,你想要一个优雅的net.Listener
,所以提供一个net.Listener
。你不必在意谁在用它。