Skip to content

Конфигурация

Config

go
type Config struct {
    Timeouts   *TimeoutConfig
    Connection *ConnectionConfig
    Security   *SecurityConfig
    Retry      *RetryConfig
    Middleware *MiddlewareConfig
}

Основная структура конфигурации. Получите безопасные значения по умолчанию через DefaultConfig().

Подконфигурации как указатели

Начиная с v1.5.1 все пять подконфигураций являются типами-указателями. DefaultConfig() и все функции предустановок (SecureConfig, PerformanceConfig и др.) автоматически инициализируют эти указатели непустыми структурами, поэтому обращения к полям вида cfg.Timeouts.Request, cfg.Security.AllowPrivateIPs и т. п. можно использовать напрямую. При ручном конструировании литерала Config{} значения нужно присваивать в виде &httpc.TimeoutConfig{...}, а перед использованием убедиться, что указатель не равен nil.

go
cfg := httpc.DefaultConfig()
cfg.Timeouts.Request = 60 * time.Second
cfg.Retry.MaxRetries = 5
client, err := httpc.New(cfg)

TimeoutConfig

go
type TimeoutConfig struct {
    Request        time.Duration // Общий таймаут запроса (включая повторы), по умолчанию 180s
    Dial           time.Duration // Таймаут TCP-соединения, по умолчанию 10s
    TLSHandshake   time.Duration // Таймаут TLS-рукопожатия, по умолчанию 10s
    ResponseHeader time.Duration // Таймаут ожидания заголовков ответа, по умолчанию 0 (отключено, зависит от контекста)
    IdleConn       time.Duration // Время удержания простаивающих соединений, по умолчанию 90s
}
ПолеЗначение по умолчаниюМаксимум
Request180s30min
Dial10s30min
TLSHandshake10s30min
ResponseHeader030min
IdleConn90s30min

Значение 0 означает отсутствие таймаута (не рекомендуется для продакшена).

Дизайн ResponseHeader

ResponseHeader по умолчанию равен 0 (отключен), при этом используется TimeoutConfig.Request или WithTimeout() как единственный механизм таймаута, что обеспечивает полный контроль WithTimeout() над длительностью запроса. Этот дизайн подходит для AI API и long-polling, где требуется увеличенное время ответа. Устанавливайте положительное значение только при необходимости жёсткого ограничения транспортного уровня (например, для защиты от атак Slowloris), но учтите, что это переопределит WithTimeout.

ConnectionConfig

go
type ConnectionConfig struct {
    MaxIdleConns           int           // Глобальное максимальное число простаивающих соединений, по умолчанию 50
    MaxConnsPerHost        int           // Максимум соединений на хост, по умолчанию 10
    ProxyURL               string        // Адрес прокси, например "http://proxy:8080"
    EnableSystemProxy      bool          // Автообнаружение системного прокси, по умолчанию false
    EnableHTTP2            bool          // Включить HTTP/2, по умолчанию true
    EnableCookies          bool          // Включить управление Cookie, по умолчанию false
    EnableDoH              bool          // Включить DNS-over-HTTPS, по умолчанию false
    DoHCacheTTL            time.Duration // TTL кэша DoH, по умолчанию 5min
    MaxResponseHeaderBytes int64         // Максимальный размер заголовков ответа в байтах, по умолчанию 0 (используется стандартное значение Go 10MB)
}

DNS-over-HTTPS

Включение DoH снижает задержку разрешения DNS и предотвращает перехват DNS:

go
cfg := httpc.DefaultConfig()
cfg.Connection.EnableDoH = true
cfg.Connection.DoHCacheTTL = 5 * time.Minute

Провайдеры DoH по умолчанию (по приоритету): Cloudflare → Google → AliDNS. Подробнее см. Пул соединений и прокси.

SecurityConfig

go
type SecurityConfig struct {
    TLSConfig               *tls.Config    // Пользовательская конфигурация TLS
    MinTLSVersion           uint16                // Минимальная версия TLS, по умолчанию TLS 1.2
    MaxTLSVersion           uint16                // Максимальная версия TLS, по умолчанию TLS 1.3
    InsecureSkipVerify      bool                  // Пропуск проверки сертификата (только для тестов)
    MaxResponseBodySize     int64                 // Лимит размера тела ответа, по умолчанию 10MB
    MaxRequestBodySize      int64                 // Лимит размера тела запроса, по умолчанию 0 (без ограничения размера тела запроса; в отличие от MaxResponseBodySize автоматического отката нет)
    MaxDecompressedBodySize int64                 // Лимит размера после распаковки, по умолчанию 100MB
    AllowPrivateIPs         bool                  // Разрешить приватные IP, по умолчанию false
    SSRFExemptCIDRs         []string              // Исключения CIDR для SSRF
    ValidateURL             bool                  // Валидация URL, по умолчанию true
    ValidateHeaders         bool                  // Валидация заголовков запроса, по умолчанию true
    StrictContentLength     bool                  // Строгий Content-Length, по умолчанию true
    CookieSecurity          *CookieSecurityConfig // Проверка безопасности Cookie
    CertificatePinner       CertificatePinner     // Пиннинг сертификатов (SPKI-хэш/публичный ключ), по умолчанию nil (отключено)
    RedirectWhitelist       []string              // Белый список доменов для перенаправлений
}

Пиннинг сертификатов (CertificatePinner)

CertificatePinner включает пиннинг сертификатов: TLS-рукопожатие отклоняется, если сервер не предоставил закреплённый ключ/сертификат, что защищает от атак типа «человек посередине» даже при компрометации доверенного УЦ. По умолчанию nil (отключено). Создаётся следующими конструкторами:

КонструкторОписание
NewSPKIHashPinner(hashes ...string) (CertificatePinner, error)Создаётся из одного или нескольких base64-кодированных SPKI SHA-256-хэшей (наиболее распространён, поддерживает ротацию ключей)
NewPublicKeyPinner(publicKeys ...[]byte) (CertificatePinner, error)Создаётся из DER-кодированных публичных ключей PKIX (внутренне вычисляется SHA-256)
NewCertificatePinnerChain(pinners ...CertificatePinner) CertificatePinnerОбъединяет несколько pinner; принимается, если проходит хотя бы один
go
pinner, err := httpc.NewSPKIHashPinner(
    "YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2fuihg=", // Текущий ключ
    "C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHFr8M=", // Резервный ключ (ротация)
)
if err != nil {
    log.Fatal(err)
}

cfg := httpc.DefaultConfig()
cfg.Security.CertificatePinner = pinner
client, err := httpc.New(cfg)

Стоимость поддержки

Пиннинг сертификатов требует синхронного обновления закреплённых значений при смене серверного сертификата (например, при продлении Let's Encrypt). Рекомендуется закреплять несколько хэшей (текущий + резервный) и завести механизм обновления, чтобы ротация ключей не приводила к разрыву соединений.

Защита от SSRF

AllowPrivateIPs по умолчанию false, блокирует подключение к приватным/зарезервированным IP (127.0.0.1, 10.x, 192.168.x и др.). Устанавливайте true только при подключении к внутренним сервисам.

Пример исключений SSRF

go
cfg := httpc.DefaultConfig()
cfg.Security.SSRFExemptCIDRs = []string{
    "10.0.0.0/8",       // Внутренний VPC
    "100.64.0.0/10",    // Tailscale
}

RetryConfig

go
type RetryConfig struct {
    MaxRetries    int           // Максимальное число повторных попыток, по умолчанию 3
    Delay         time.Duration // Начальная задержка повтора, по умолчанию 1s
    BackoffFactor float64       // Множитель экспоненциальной задержки, по умолчанию 2.0
    EnableJitter  bool          // Включить джиттер, по умолчанию true
    MaxRetryDelay time.Duration // Максимальный предел задержки повтора, по умолчанию 30s
    CustomPolicy  RetryPolicy   // Пользовательская стратегия повторов
}
ПолеЗначение по умолчаниюДиапазон
MaxRetries30-10
Delay1s0-30min
BackoffFactor2.01.0-10.0
MaxRetryDelay30s0-30min

Формула задержки повтора: min(Delay * BackoffFactor^attempt + jitter, MaxRetryDelay)

MiddlewareConfig

go
type MiddlewareConfig struct {
    Middlewares     []MiddlewareFunc // Список промежуточного ПО
    UserAgent       string           // User-Agent, по умолчанию "httpc/1.0"
    Headers         map[string]string // Заголовки по умолчанию
    FollowRedirects bool             // Следовать перенаправлениям, по умолчанию true
    MaxRedirects    int              // Максимальное число перенаправлений, по умолчанию 10
}

Предустановки конфигурации

DefaultConfig

go
func DefaultConfig() *Config

Безопасная конфигурация по умолчанию. Защита SSRF включена по умолчанию.

SecureConfig

go
func SecureConfig() *Config

Конфигурация с приоритетом безопасности. Более короткие таймауты, отключены автоматические перенаправления, строгая защита SSRF.

ПараметрЗначение
Таймаут Request15s
Таймаут Dial5s
Таймаут TLSHandshake5s
Таймаут ResponseHeader10s (защита от Slowloris)
Таймаут IdleConn30s
MaxIdleConns20
MaxConnsPerHost5
MaxResponseBodySize5MB
MaxRetries1
Delay2s
EnableJittertrue
FollowRedirectsfalse

PerformanceConfig

go
func PerformanceConfig() *Config

Конфигурация для высокой пропускной способности. Увеличенный пул соединений, более длинные таймауты, с сохранением проверок безопасности.

TIP

PerformanceConfig сохраняет включёнными ValidateURL и ValidateHeaders для обеспечения безопасности. Если в доверенной среде требуется максимальная производительность, можно вручную отключить: cfg.Security.ValidateURL = false, но учитывайте риски безопасности (инъекции, SSRF).

ПараметрЗначение
Таймаут Request60s
Таймаут Dial15s
Таймаут TLSHandshake15s
Таймаут ResponseHeader0 (отключено, используется таймаут Request)
Таймаут IdleConn120s
MaxIdleConns100
MaxConnsPerHost20
EnableCookiestrue
MaxResponseBodySize50MB
StrictContentLengthfalse
ValidateURLtrue
ValidateHeaderstrue
Delay500ms
BackoffFactor1.5
EnableJittertrue

TestingConfig

go
func TestingConfig() *Config

Конфигурация для тестовой среды. Отключены проверки безопасности, короткие таймауты.

ПараметрЗначение
Таймаут Dial5s
Таймаут TLSHandshake5s
Таймаут ResponseHeader0 (отключено, используется таймаут Request)
Таймаут IdleConn30s
MaxIdleConns10
MaxConnsPerHost5
EnableHTTP2false
EnableCookiestrue
InsecureSkipVerifytrue
AllowPrivateIPstrue
ValidateURLfalse
ValidateHeadersfalse
MaxRetries1
Delay100ms
EnableJitterfalse
UserAgenthttpc-test/1.0

DANGER

Эта конфигурация отключает проверку TLS и защиту SSRF, используйте только для тестов. Использование вне тестовой среды вызовет предупреждение безопасности (см. Вывод предупреждений безопасности).

MinimalConfig

go
func MinimalConfig() *Config

Лёгкая конфигурация. Отключены повторные попытки и перенаправления, минимальный пул соединений.

ПараметрЗначение
Таймаут Dial5s
Таймаут TLSHandshake5s
Таймаут ResponseHeader0 (отключено, используется таймаут Request)
Таймаут IdleConn30s
MaxIdleConns10
MaxConnsPerHost2
MaxResponseBodySize1MB
MaxRetries0
Delay0
BackoffFactor1.0
EnableJitterfalse
FollowRedirectsfalse

Вывод предупреждений безопасности

SetSecurityWarnOutput

go
func SetSecurityWarnOutput(w io.Writer)

Перенаправляет цель вывода предупреждений безопасности. При использовании TestingConfig() или установке SecurityConfig.InsecureSkipVerify (Config.Security) в true, httpc печатает в этот writer предупреждения уровня [SECURITY WARNING] (не более одного на каждое предупреждение на процесс). По умолчанию вывод направляется в os.Stderr; передача io.Discard полностью подавляет предупреждения, что удобно для тестов или тихого запуска в заведомо безопасных внутренних сценариях.

go
// Подавить предупреждения безопасности в тестах
httpc.SetSecurityWarnOutput(io.Discard)
cfg := httpc.TestingConfig()

Область действия

Эта настройка — глобальное состояние уровня процесса, влияющее на все впоследствии создаваемые клиенты. Предупреждения TestingConfig и InsecureSkipVerify учитываются независимо (не влияют на срабатывание друг друга), но используют общий writer вывода.

Валидация

ValidateConfig

go
func ValidateConfig(cfg *Config) error

Проверяет корректность конфигурации. New() вызывает автоматически, также можно вызывать явно.

go
cfg := httpc.DefaultConfig()
cfg.Retry.MaxRetries = 100 // вне диапазона

if err := httpc.ValidateConfig(cfg); err != nil {
    log.Fatal(err) // invalid retry configuration: Retry.MaxRetries must be 0-10, got 100
}

Config.String

go
func (c *Config) String() string

Возвращает безопасное строковое представление. Учётные данные ProxyURL маскируются, TLSConfig отображается как <configured> или <default>, Headers не выводятся.

go
cfg := httpc.DefaultConfig()
fmt.Println(cfg.String())
// Config{Timeouts:{Request: 3m0s, ...}, Security:{TLSConfig: <default>, ...}}

CookieSecurityConfig

go
type CookieSecurityConfig struct {
    RequireSecure                bool
    RequireHttpOnly              bool
    RequireSameSite              string
    AllowSameSiteNone            bool
    RequireSecureForSameSiteNone bool
}

Конфигурация проверки атрибутов безопасности Cookie.

ПолеТипОписание
RequireSecureboolТребовать установки атрибута Secure
RequireHttpOnlyboolТребовать установки атрибута HttpOnly
RequireSameSitestringТребуемое значение SameSite, например "Strict", "Lax"; пустая строка — без проверки
AllowSameSiteNoneboolРазрешить ли SameSite=None
RequireSecureForSameSiteNoneboolТребовать атрибут Secure при SameSite=None (по умолчанию true)

DefaultCookieSecurityConfig

go
func DefaultCookieSecurityConfig() *CookieSecurityConfig

Конфигурация безопасности Cookie по умолчанию. Не требует атрибутов Secure/HttpOnly/SameSite, но принудительно требует Secure для Cookie с SameSite=None.

StrictCookieSecurityConfig

go
func StrictCookieSecurityConfig() *CookieSecurityConfig

Строгая конфигурация безопасности Cookie. Требует Secure, HttpOnly и SameSite=Strict.

go
cfg := httpc.DefaultConfig()
cfg.Security.CookieSecurity = httpc.StrictCookieSecurityConfig()