fix/oo-backoff#70
main
Устойчивость к 429 (openresty) на уровне библиотеки.
pacedTransport
NewClient
get project
OO_RATE_LIMIT
0
OO_BURST
Retry-After
*TransientError{Code, RetryAfter, Msg}
statusError
DoRetry
max(backoff, Retry-After)
OO_RETRY_BASE
OO_RETRY_MAX
OO_RETRY_ATTEMPTS
cooldownGate
OO_RATE_LIMIT=0
ratelimit.go
retry.go
TransientError
parseRetryAfter
client.go
http.go
request.go
auth.go
files_webdav.go
mails.go
storage_fallback.go
docs/rate-limiting.md
retry_test.go — Retry-After honoured, экспонента/cap, typed error с заголовка, e2e retry; ratelimit_test.go — burst pacing (счётчик+время), OO_RATE_LIMIT=0 off, cooldown after 429, context. Фейковый httptest сервер отдаёт 429 с Retry-After.
retry_test.go
ratelimit_test.go
httptest
gofmt -w ; go build ./... ; go test ./... ok github.com/eslider/go-onlyoffice 1.2s ok ... (all packages)
Retry-After: N
Ревью/мерж — за RE.
No dependencies set.
The note is not visible to the blocked user.
Что
Устойчивость к 429 (openresty) на уровне библиотеки.
pacedTransportвNewClientпейсит все HTTP-запросы (листинг, создание папок, upload,get project, auth, WebDAV). EnvOO_RATE_LIMIT(req/s, default 4;0= off),OO_BURST(default 1).Retry-After: типизированная*TransientError{Code, RetryAfter, Msg}из HTTP-слоя (всеstatusError-точки); секунды и HTTP-date парсятся.DoRetryждётmax(backoff, Retry-After).OO_RETRY_BASE(default 2s),OO_RETRY_MAX(default 2m),OO_RETRY_ATTEMPTS(default 7). Детерминированно, без jitter.cooldownGate) блокирует все вызовы на окно backoff; Retry-After открывает гейт даже для здоровых эндпоинтов.OO_RATE_LIMIT=0отключает пейсинг.Файлы
ratelimit.go(new) — token bucket, cooldown gate, env,pacedTransport.retry.go— exponential backoff,TransientError,parseRetryAfter, cooldown note.client.go—NewClientставит paced transport.http.go,request.go,auth.go,files_webdav.go,mails.go,storage_fallback.go— ошибки черезstatusErrorс Retry-After.docs/rate-limiting.md(new), README/AGENTS/CHANGELOG.Тесты
retry_test.go— Retry-After honoured, экспонента/cap, typed error с заголовка, e2e retry;ratelimit_test.go— burst pacing (счётчик+время),OO_RATE_LIMIT=0off, cooldown after 429, context. Фейковыйhttptestсервер отдаёт 429 сRetry-After.Acceptance
Retry-After: N→ ждём ≥NOO_RATE_LIMIT=0отключаетРевью/мерж — за RE.