Documentation
¶
Overview ¶
Package httpcodec предоставляет высокопроизводительные инструменты для кодирования и декодирования HTTP-данных с нулевыми аллокациями и защитой периметра.
Index ¶
- type Codec
- func (c *Codec) Marshal(v any) ([]byte, error)
- 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) Unmarshal(data []byte, v any) error
- func (c *Codec) WriteJSON(w http.ResponseWriter, statusCode int, data any)
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), что позволяет свести нагрузку на Garbage Collector (GC) к абсолютному минимуму (0 B/op).
func New ¶
New создает и настраивает новый экземпляр Codec с фиксированным лимитом размера буферов.
Параметр maxBodySize определяет емкость выделяемых массивов байт в bufferPool и лимит сетевого middleware. Для стандартных REST API проектов рекомендуется передавать значения 4096 (4 КБ) или 8192 (8 КБ).
func (*Codec) Marshal ¶
Marshal является зеркальным методом для высокопроизводительной сериализации объектов.
Метод переводит структуру v в срез байт JSON. Обратите внимание, что данный метод аллоцирует новый срез байт в куче на каждый вызов, поэтому для отправки HTTP-ответов рекомендуется использовать метод Write(), работающий через sync.Pool буферов.
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.
func (*Codec) ReadJSON ¶
ReadJSON выполняет оптимизированный, строго типизированный парсинг тела JSON-запроса.
Метод повторно использует оперативную память из внутреннего пула sync.Pool через вызов ReadBytes, полностью исключая аллокации в куче на этапе сетевого ввода-вывода (I/O). Десериализация данных в целевой объект dst производится с помощью высокопроизводительного кодировщика 'goccy/go-json'.
Если входящий JSON поврежден, содержит невалидные типы данных или неизвестные поля, метод автоматически отправляет клиенту ошибку HTTP 400 Bad Request и прерывает обработку.
func (*Codec) Unmarshal ¶
Unmarshal является оберткой над высокопроизводительным движком десериализации.
Метод полностью оптимизирован под рантайм Go 1.26.1 и использует JIT-компиляцию библиотеки 'goccy/go-json'. Он осуществляет разбор сырого среза байт data и записывает результат в целевой объект v.
Использование этого метода вместо стандартного encoding/json позволяет снизить нагрузку на CPU за счет отказа от классической рефлексии в пользу сгенерированного на лету ассемблерного кода.
func (*Codec) WriteJSON ¶
func (c *Codec) WriteJSON(w http.ResponseWriter, statusCode int, data any)
WriteJSON выполняет высокопроизводительную потоковую сериализацию данных в JSON и их отправку в сетевой сокет без лишних аллокаций памяти в куче.
Метод извлекает переиспользуемый буфер *bytes.Buffer из внутреннего пула jsonPool, инициализирует потоковый Encoder библиотеки 'goccy/go-json' и кодирует данные. После успешной сериализации метод автоматически выставляет REST API заголовки Content-Type: application/json, отправляет статус-код и стримит байты в сеть. В конце операции буфер полностью сбрасывается (Reset) с сохранением его емкости (capacity) и возвращается обратно в пул.