В моем понимании проблема, с которой вы сталкиваетесь, заключается в том, что тайм-ауты сервера резко закрывают базовый TCP-коннект без записи правильного HTTP-ответа. Между тем, когда firefox обнаруживает внезапно закрытый коннект, кажется, что он решает повторить попытку 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()
}