亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 http.server 訪問上下文

使用 http.server 訪問上下文

Go
慕哥9229398 2021-10-18 14:26:41
為了測試我正在編寫的服務器,我希望能夠在測試框架中啟動和停止它。為此,我希望可以將上下文包與 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 函數返回。


查看完整回答
反對 回復 2021-10-18
  • 1 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號