1 回答

TA貢獻1817條經驗 獲得超14個贊
根據我的理解,您面臨的問題是服務器超時突然關閉底層 tcp conn 而沒有編寫正確的 http 響應,同時,當 firefox 檢測到 conn 突然關閉時,它似乎決定重試 N 次,可能是因為它假設它遇到連接問題。
我相信解決方案是使用http.Handler來控制處理程序處理持續時間,并在超時到期時返回正確的 HTTP 響應。
服務器超時應該更長,并用于防止異常的客戶端行為,而不是處理程序的緩慢。
標準 HTTP 包為此目的提供了TimeoutHandler函數。
package main
import (
? ? "fmt"
? ? "net/http"
? ? "time"
)
func main() {
? ? slowHandler := func(w http.ResponseWriter, r *http.Request) {
? ? ? ? defer r.Body.Close()
? ? ? ? fmt.Printf("Hello, you've requested: %s\n", r.URL.Path)
? ? ? ? time.Sleep(time.Second * 2)
? ? ? ? fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
? ? }
? ? http.HandleFunc("/", slowHandler)
? ? var handler http.Handler = http.DefaultServeMux
? ? handler = http.TimeoutHandler(handler, time.Second, "processing timeout")
? ? s := http.Server{
? ? ? ? Addr:? ? ":8080",
? ? ? ? Handler: handler,
? ? ? ? // ReadTimeout:? 1 * time.Second,
? ? ? ? // WriteTimeout: 1 * time.Second,
? ? }
? ? s.ListenAndServe()
}
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報