2014-12-02 13 views
0

我想通過執行正常關機和其他一些小工具來擴展http.Server的功能,這些小工具將在我的HTTP服務中共享。目前,我的代碼表示,或多或少:捕獲net.Listener傳遞給http.Server.Serve

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

我通過把簡單的開始鉛筆我的包裝:

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的設計有效地阻止我解決這個問題嗎?

受歡迎的文件:即使我不在生產中使用它們,我也會獲得一些知識。

+0

不要試圖聰明,你想要一個優雅的'net.Listener',所以提供'net.Listener'。你不需要關心誰使用它。 – Wessie 2014-12-03 01:17:18

回答

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

如果我調用'MyServer.ListenAndServeTLS',那麼將使用'http.Server.Serve',而不是我提供的實現。我想要捕獲'ListenAndServeTLS'中創建的'net.Listener'。 – tomasz 2014-12-02 17:22:58

+0

然後在我的例子中實現'ListenAndServeTLS()'類似於'ListenAndServe()'。開啓示例:) – seong 2014-12-02 17:24:22

+0

這完全是**我的問題:我不想實現它,因爲它不重要。我可以從[原始http實施](http://golang.org/src/pkg/net/http/server.go?s=54154:54222#L1813)複製實施,但想知道是否可以避免這種情況。 – tomasz 2014-12-02 17:27:18

相關問題