捕获net.Listener传递给http.Server.Serve

时间:2014-12-02 17:11:51

标签: go wrapper httpserver

我想通过执行正常关闭以及我将在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.ListenAndServeTLSServe都不会开始使用http.Server的实现。而且我想问他们......有什么方法可以解决这个问题,或者{{1}}的设计是否有效地阻止我解决这个问题?

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

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