為了測試我正在編寫的服務器,我希望能夠在測試框架中啟動和停止它。為此,我希望可以將上下文包與 http.Server 結構集成。我希望能夠在調用Done函數并且ctx.Done()通道返回某些內容時停止服務器。我想做的就是修改http.Server.Serve() 方法,接受一個 context.Context 并檢查它是否完成,在 for 循環的每次迭代中,如下所示:func (srv *server) Serve(ctx context.Context, l net.Listener) error { defer l.Close() var tempDelay time.Duration // how long to sleep on accept failure for { select { case <-ctx.Done(): return nil default: } ... rest is same as original但是,如果我想在 for 循環中添加該檢查,我將不得不重寫很多方法,因為此方法調用其他私有方法(如 http.server.srv),而后者又調用其他私有方法。 ...我還注意到,當偵聽器上的 Accept() 方法返回錯誤時,for 循環將停止。但是,我似乎無法找到一種方法,讓偵聽器在不訪問其私有方法的情況下從其接受方法輸出錯誤。如果我必須復制和粘貼一半的 http 庫只是為了讓服務器停止使用上下文包,那么我似乎在做一些非常愚蠢和錯誤的事情。我知道有很多解決方案可以支持 ServeHTTP 函數的上下文取消,但這不是我要討論的內容。我想將上下文傳遞給整個服務器,而不僅僅是每個傳入的請求。這是不可能的嗎?
1 回答

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
使用httptest.Server創建一個可以在測試中啟動和停止的服務器。
如果你直接使用http.Server,你可以通過關閉net.Listener來打破 Serve 循環。當 net.Listener 關閉時,任何被阻塞的 Accept 操作都會被解除阻塞并返回錯誤。如果 Accept 返回永久錯誤,則 Serve 函數返回。
- 1 回答
- 0 關注
- 203 瀏覽
添加回答
舉報
0/150
提交
取消