Я работаю над приложением Go, которое имеет веб-сервер. Я пытался добавить таймауты и столкнулся с проблемой. Вот пример кода, который я сделал, чтобы воспроизвести его, потому что публикация реального кода была бы невозможна:
package main
import (
"fmt"
"html/template"
"net/http"
"time"
)
var layout *template.Template
func main() {
router := http.NewServeMux()
server := &http.Server{
Addr: ":8888",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 1 * time.Second,
IdleTimeout: 15 * time.Second,
}
router.HandleFunc("/", home)
var err error
layout, err = template.ParseFiles("./layout.html")
if err != nil {
fmt.Printf("Error1: %+v\n", err)
}
server.ListenAndServe()
}
func home(w http.ResponseWriter, r *http.Request) {
fmt.Println("responding")
err := layout.Execute(w, template.HTML(`World`))
if err != nil {
fmt.Printf("Error2: %+v\n", err)
}
time.Sleep(5 * time.Second)
}
layout.html: Hello {{.}}!
Когда я запускаю егои посетите 127.0.0.1:8888, браузер продолжает загружаться, и home()
, который запускает тайм-аут, запускается снова, и он делает это 10 раз, прежде чем останавливается, и браузер показывает ошибку сброса соединения.
Я ожидал, что по истечении времени ожидания функция будет немедленно завершена, соединение будет закрыто, а браузер прекратит загрузку и выдаст ошибку.
Как мне этого добиться?