捕获网络.侦听器传递给 http.服务器服务



我想通过执行优雅的关机和其他一些小工具来扩展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.Serve(tlsListener),我很想提供我自己的Serve方法,因此在将其传递给http.Server.Serve之前可以修改net.Listener

我开始用铅笔写我的包装纸,简单地说:

type MyServer struct {
    http.Server
}
func (s *MyServer) Serve(l net.Listener) {
    // Wrap l with MyListener, pass to s.Server.Serve()
}

显然http.ListenAndServehttp.ListenAndServeTLS都不会开始使用我的Serve实现。我想请他们...有什么方法可以解决这个问题,或者http.Server的设计是否有效地阻止了我解决这个问题?

欢迎黑客:即使我不在生产中使用它们,我也会获得一些知识。

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)
}

最新更新