Контекст логгера
typedef struct logger {
FILE *file;
logger_callback callback;
logger_log_level level;
void *attachment;
} logger;
file
Указатель на структуру FILE открытого логфайлаcallback
Указатель на коллбэк (если он ненулевой, тоfile
не используется)level
Уровень логгирования
Уровень логгирования
enum logger_log_level {
LOG_LEVEL_ERROR = 0,
LOG_LEVEL_WARN,
LOG_LEVEL_INFO,
LOG_LEVEL_DEBUG,
LOG_LEVEL_TRACE
};
Уровни соответствуют общепринятым.
Контекст HTTP-парсера
struct http_session {
void *attachment;
union {
struct http1_session http1;
struct http2_session http2;
}
};
attachment
- параметр для использования в коллбэках, переданный при инициализации парсера
Контекст парсера HTTP/1 содержит контекст единственного потока данных.
struct http1_session {
http_stream *stream;
};
Контекст парсера HTTP/2 содержит контекст настройки nghttp2-сессии и карту контекстов для каждого потока.
struct http2_session {
nghttp2_session session;
// int -> http_stream *
hash_t() stream_id_to_stream;
};
Контекст одного потока HTTP, содержит заголовки текущего запроса или ответа.
struct http_stream {
void *attachment;
// PRIVATE FIELDS
...
};
attachment
- параметр для использования в коллбэках, переданный при инициализации парсера
Тип парсера - HTTP-запрос, HTTP-ответ, HTTP/2
enum http_session_type {
HTTP_REQUEST,
HTTP_RESPONSE,
HTTP2
};
Открывает лог
logger *logger_open(const char *filename, logger_log_level_t log_level, logger_callback_t callback, void *attachment);
filename
- имя лог-файлаlog_level
- уровень логгированияcallback
- коллбэк логгированияattachment
- параметр коллбэка логгирования- возвращаемое значение - контекст логгера
Записывает сообщение в лог
void logger_log(logger *log, logger_log_level_t log_level, const char *fmt, ...);
log
- контекст логгераlog_level
- уровень логгированияfmt
- строка формата...
- параметры строки формата
Закрывает лог
logger_close(logger_t *ctx);
ctx
- контекст логгера
Инициализирует парсер
int init(logger *log, session_type type, session_callbacks *callbacks, void *attachment, session **p);
log
- контекст логгераtype
- Тип парсераcallbacks
- Коллбэкиattachment
- Параметр коллбэковp
- поинтер на переменную поинтера на контекстreturn value
- код ошибки
Передает на обработку полученные данные
int input(http_session *session, const char *buffer, int length);
session
- Контекст парсераbuffer
- Буфер с даннымиlength
- Размер буфераreturn value
- код ошибки
Передает на обработку значение заголовка HTTP2-Settings при апгрейде с HTTP/1.1
int input_settings(http_session *context, const char *base64_http2_settings, int length);
context
- Контекст парсераbase64_http2_settings
- Значение заголовка HTTP2-Settings при апгрейде с HTTP/1.1length
- Длина заголовкаreturn value
- код ошибки
Освобождает ресурсы парсера
int close(http_session *session);
id
- ID соединенияreturn value
- код ошибки
Сигнализирует о получении всех заголовков
void h1_headers(http_stream *stream, struct http_headers headers);
stream
- контекст потока (единственного)headers
- заголовки после распаковки
Сигнализирует о начале передачи данных
bool h1_data_started(http_stream *stream);
stream
- контекст потока (единственного)- возвращаемое значение - нужно ли применять zlib-декомпрессию данных потока
Сигнализирует о получении данных
void h1_data(http_stream *stream, const char *data, size_t length);
stream
- контекст потока (единственного)stream_id
- идентификатор потокаdata
- массив байт с даннымиlength
- длина массива байт с данными
Сигнализирует о завершении получения данных
void h1_data_finished(http_stream *stream, rst_stream_flag rst_stream);
stream
- контекст потока (единственного)rst_stream
- сигнал о том, что поток сброшен с помощью фрейма RST_STREAM, а не окончен с флагом END_STREAM
Сигнализирует о получении HTTP/2 фрейма
void h2_frame(http_stream *stream, unsigned int stream_id, enum h2_frame_type type,
struct frame_any frame);
stream
- контекст потокаstream_id
- идентификатор потокаtype
- тип фреймаframe
- структура фрейма
Сигнализирует о получении всех заголовков в данном потоке
void h2_headers(http_stream *stream, unsigned int stream_id, struct http_headers headers);
stream
- контекст потокаstream_id
- идентификатор потокаheaders
- заголовки после распаковки
Сигнализирует о начале передачи данных в данном потоке
bool h2_data_started(http_stream *stream, unsigned int stream_id);
stream
- контекст потокаstream_id
- идентификатор потока- возвращаемое значение - нужно ли применять zlib-декомпрессию данных потока
Сигнализирует о получении фрейма с данными в данном потоке
void h2_data(http_stream *stream, unsigned int stream_id, struct frame_data data);
stream
- контекст потокаstream_id
- идентификатор потокаdata
- структура фрейма с данными
Сигнализирует о завершении получения данных в данном потоке
void h2_data_finished(http_stream *stream, unsigned int stream_id, rst_stream_flag rst_stream);
stream
- контекст потокаstream_id
- идентификатор потокаrst_stream
- сигнал о том, что поток сброшен с помощью фрейма RST_STREAM, а не окончен с флагом END_STREAM
Создание, клонирование, модифицирование структур библиотеки.