我想通过执行正常关闭以及我将在HTTP服务中共享的其他一些小工具来扩展http.Server
功能。目前我的代码或多或少地说:
type MyServer struct {
server *http.Server
// ...
}
func (s *MyServer) ListenAndServe() {
// Create listener and pass to s.server.Serve()
}
这可以很好,但需要手动公开http.Server
所有必需的方法和变量。
包装大多数方法不会是一个大问题,但我找不到一种合理的方式来公开http.Server.ListenAndServeTLS
的访问权限而不实际从the source复制实现。该方法的最后一行显示srv.Serve(tlsListener)
,我很乐意提供自己的Serve
方法,因此在将net.Listener
传递给http.Server.Serve
之前,可以修改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
的实现。而且我想问他们......有什么方法可以解决这个问题,或者{{1}}的设计是否有效地阻止我解决这个问题?
黑客欢迎:即使我不在制作中使用它们,我也会获得一些知识。
答案 0 :(得分:0)
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)
}