我想通过执行优雅的关机和其他一些小工具来扩展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.ListenAndServe
和http.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)
}