Vì http.Server mặc định có mọi timeout bằng 0, nghĩa là không giới hạn.
Một client chậm (hoặc cố tình giữ kết nối) có thể chiếm goroutine và file descriptor vô hạn định — dạng tấn công Slowloris.
go
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadHeaderTimeout: 5 * time.Second, // chặn Slowloris
ReadTimeout: 15 * time.Second, // toàn bộ request kể cả body
WriteTimeout: 30 * time.Second, // tính từ khi đọc xong header
IdleTimeout: 60 * time.Second, // keep-alive rảnh
MaxHeaderBytes: 1 << 20,
}
log.Fatal(srv.ListenAndServe())Điểm hay bị hỏi thêm:
- WriteTimeout bao trùm cả thời gian handler xử lý, nên endpoint tải file lớn / streaming cần server riêng hoặc http.ResponseController để nới hạn cho từng request.
- Timeout ở tầng server là hard deadline trên connection, khác context của request — muốn dừng sớm công việc bên trong vẫn phải tôn trọng r.Context().
- Với client, http.DefaultClient cũng không có timeout; luôn tự tạo &http.Client{Timeout: ...} khi gọi service ngoài.