From af0325ebbe868138c4649dccb90b4a51ac84df1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 15 Aug 2026 08:34:02 +0400 Subject: [PATCH] =?UTF-8?q?v0.1.35:=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=20=D0=A1=D0=BE=D0=BD=D0=BD=D0=B5=D1=82?= =?UTF-8?q?=D1=83=20=E2=80=94=20ReadHeaderTimeout=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20ReadTimeout,=20MaxHeaderBytes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/cmd/goaws.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/cmd/goaws.go b/app/cmd/goaws.go index a0f4546..1f7a8f2 100644 --- a/app/cmd/goaws.go +++ b/app/cmd/goaws.go @@ -140,13 +140,21 @@ func main() { // Metrics: gauge updater — пересчёт очередей/сообщений per tenant каждые 15 секунд metrics.StartGaugeUpdater(15*time.Second, quit) - // HTTP сервер с таймаутами + // HTTP сервер с таймаутами (рекомендации ревью Соннета, план v0.1.35): + // - ReadHeaderTimeout 10с — лимит ТОЛЬКО на чтение заголовков (slowloris). + // ReadTimeout НЕ ставим: он обрывал бы запросы с медленной/большой + // загрузкой тела (в т.ч. большие SendMessage) и ломал бы long-poll. + // - WriteTimeout 35с — ответ; чуть больше max WaitTimeSeconds (20с long-poll). + // - IdleTimeout 90с — keep-alive; больше интервала ретраев клиентских SDK. + // - MaxHeaderBytes 8192 — защита от гигантских заголовков + // (платформа режет >16KB, наш лимит строже). srv := &http.Server{ - Addr: "0.0.0.0:" + port, - Handler: r, - ReadTimeout: 30 * time.Second, - WriteTimeout: 35 * time.Second, // чуть больше чем max WaitTimeSeconds (20s) - IdleTimeout: 60 * time.Second, + Addr: "0.0.0.0:" + port, + Handler: r, + ReadHeaderTimeout: 10 * time.Second, + WriteTimeout: 35 * time.Second, + IdleTimeout: 90 * time.Second, + MaxHeaderBytes: 8192, } // Запуск в горутине для graceful shutdown