0.135.1

Security

  • **DNS-rebinding / TOCTOU — закрыт на основном LLM-пути **: OpenAICompatProvider и AnthropicProvider теперь инжектят option.WithHTTPClient(safeHTTPClientForSpec(spec)) в SDK-клиент. Transport выполняет dial-time IP re-check, блокируя обращения к private/loopback/cloud-metadata диапазонам независимо от config-time валидации api_base. Это единственный runtime SSRF guard на chat-пути (MakeProvider не валидирует api_base).
  • FetchContextWindow — safe-клиент: сигнатура изменена — принимает spec *ProviderSpec вместо client *http.Client, внутри строит safe-клиент через safeHTTPClientForSpec(spec). Handler FetchContext дополнительно валидирует api_base через ResolveAndValidateAPIBase (HTTP 400 при SSRF-отклонении).
  • runDiagnostics — safe-клиент: использует safeHTTPClientForSpec(spec) (local specs → loopback-whitelisted). SafeHTTPClient per-hop redirect validation сохранена без override.

Changed

  • NewAnthropicProvider: добавлен параметр spec *ProviderSpec (для выбора safe-клиента). Factory обновлён.
  • AdvancedHandler: удалено поле client *http.Client и параметр NewAdvancedHandler(s, nil) (стало неиспользуемым после перевода FetchContextWindow на spec-based safe-клиент).
  • FetchContext: порядок проверок — IsContextWindowUnsupported (HTTP 200 + error=“unsupported”) → ResolveAndValidateAPIBase (HTTP 400 + ssrf_rejected) → FetchContextWindow (HTTP 502 при fetch_failed).

Added

  • Публичный helper providers.IsContextWindowUnsupported(providerName) — проверка без построения spec; используется в handler для short-circuit до SSRF-валидации.
  • Тесты (internal/providers/ssrf_chat_test.go, 5 шт.): e2e DNS-rebinding — Chat/ChatStream блокируются на dial для приватных IP (169.254.169.254, 10.0.0.1, 192.168.1.1), TOCTOU invariant (после прохождения ValidateURL для публичного IP dial на приватный всё равно блокируется), structural guard (http.DefaultClient poison — провайдер не использует default клиент). diagnostics_test.go (5 шт.): diagnosticSpec (3 ветви), runDiagnostics для local-spec loopback (ok) и nil-spec loopback (SSRF block).
  • Docstring-контракт в NewOpenAICompatProvider/NewAnthropicProvider: явно зафиксировано, что chat-path не валидирует api_base на config-time, dial-time IP re-check — единственный runtime guard.