Documentation
¶
Overview ¶
Package httpcodec предоставляет высокопроизводительные инструменты для кодирования и декодирования HTTP-данных с нулевыми аллокациями и защитой периметра.
Index ¶
- type Codec
- func (c *Codec) Middleware() func(http.Handler) http.Handler
- func (c *Codec) ReadBytes(w http.ResponseWriter, r *http.Request, processor func(payload []byte) bool) bool
- func (c *Codec) ReadJSON(w http.ResponseWriter, r *http.Request, dst any) bool
- func (c *Codec) WriteJSON(w http.ResponseWriter, statusCode int, data any)
- type Option
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Codec ¶
type Codec struct {
// contains filtered or unexported fields
}
Codec объединяет высокопроизводительные и потокобезопасные инструменты для симметричного кодирования и декодирования HTTP-данных.
Структура инкапсулирует лимиты сетевого периметра и управляет двумя независимыми пулами переиспользования памяти (sync.Pool). Это позволяет минимизировать аллокации в куче (heap) и свести нагрузку на Garbage Collector (GC) к абсолютному минимуму (0 B/op).
func (*Codec) Middleware ¶
Middleware возвращает стандартный перехватчик (http.Handler middleware), который аппаратно ограничивает размер тела входящего запроса на уровне TCP-сокета.
Метод полностью оптимизирован под рантайм Go 1.26.1 и использует лимит maxBodySize, заданный при инициализации кодека через конструктор New(). Для модифицирующих методов (POST, PUT, PATCH) поток r.Body оборачивается в http.MaxBytesReader.
Это гарантирует автоматическую синхронизацию лимитов сетевого периметра и пулов памяти, предотвращая атаки класса Slowloris DoS и переполнение буферов.
func (*Codec) ReadBytes ¶
func (c *Codec) ReadBytes(w http.ResponseWriter, r *http.Request, processor func(payload []byte) bool) bool
ReadBytes выполняет оптимизированное чтение тела HTTP-запроса в виде сырых байт с использованием переиспользуемых буферов памяти из sync.Pool.
Метод полностью спроектирован под требования Highload-систем:
- Исключает аллокации в куче (heap) на этапе сетевого ввода-вывода (0 B/op).
- Принудительно зануляет память буфера через встроенную функцию clear(), гарантируя изоляцию данных и защиту от утечек (Data Bleed) между запросами клиентов.
- Полностью совместим с поведением постоянных соединений (Keep-Alive) и протоколом HTTP/2.
- Содержит автономный защитный контур DoS-защиты, который при превышении лимита maxBodySize безопасно вычитывает оставшийся хвост мусора в io.Discard (в пределах лимита maxTrashRead), что позволяет сохранить сокет чистым и переиспользовать TCP-соединение без TLS-хендшейков.
Если тело запроса пустое, повреждено или превышает допустимый размер, метод автоматически отправляет клиенту соответствующий HTTP-статус (400 или 413) и возвращает false. В случае успешного чтения управление передается в функцию-коллбэк processor.
func (*Codec) ReadJSON ¶
ReadJSON выполняет оптимизированный, строго типизированный парсинг тела JSON-запроса.
Метод повторно использует оперативную память из внутреннего пула sync.Pool через вызов ReadBytes, полностью исключая аллокации в куче на этапе сетевого ввода-вывода (I/O). Десериализация данных в целевой объект dst производится с помощью высокопроизводительного кодировщика 'goccy/go-json'.
Если входящий JSON поврежден, содержит невалидные типы данных или неизвестные поля, метод автоматически отправляет клиенту ошибку HTTP 400 Bad Request и прерывает обработку.
type Option ¶ added in v0.0.2
type Option func(*Codec)
Option определяет сигнатуру функции для гибкого конфигурирования Кодека.
func WithInitJSONBufferCap ¶ added in v0.0.2
WithInitJSONBufferCap настраивает начальную емкость (pre-allocated capacity) для каждого нового bytes.Buffer, создаваемого внутри пула jsonPool.
func WithMaxJSONBufferCap ¶ added in v0.0.2
WithMaxJSONBufferCap задает верхнюю границу емкости буфера ответа. Если буфер при маршалинге раздуется сильнее этого лимита, он утилизируется GC (защита от OOM).
func WithMaxTrashRead ¶ added in v0.0.2
WithMaxTrashRead настраивает лимит вычитки «мусора» в пустоту для спасения Keep-Alive. Позволяет сохранить прогретое соединение, если клиент слегка превысил maxBodySize.