message-header-parser.h [plain text]
#ifndef MESSAGE_HEADER_PARSER_H
#define MESSAGE_HEADER_PARSER_H
#define IS_LWSP(c) \
((c) == ' ' || (c) == '\t')
struct message_size;
struct message_header_parser_ctx;
enum message_header_parser_flags {
MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP = 0x01,
MESSAGE_HEADER_PARSER_FLAG_DROP_CR = 0x02,
MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE = 0x04
};
struct message_header_line {
const char *name;
size_t name_len;
const unsigned char *value;
size_t value_len;
const unsigned char *full_value;
size_t full_value_len;
const unsigned char *middle;
size_t middle_len;
uoff_t name_offset, full_value_offset;
unsigned int continues:1;
unsigned int continued:1;
unsigned int eoh:1;
unsigned int no_newline:1;
unsigned int crlf_newline:1;
unsigned int use_full_value:1;
};
typedef void message_header_callback_t(struct message_header_line *hdr,
void *context);
struct message_header_parser_ctx *
message_parse_header_init(struct istream *input, struct message_size *hdr_size,
enum message_header_parser_flags flags);
void message_parse_header_deinit(struct message_header_parser_ctx **ctx);
int message_parse_header_next(struct message_header_parser_ctx *ctx,
struct message_header_line **hdr_r);
bool message_parse_header_has_nuls(const struct message_header_parser_ctx *ctx)
ATTR_PURE;
void message_parse_header(struct istream *input, struct message_size *hdr_size,
enum message_header_parser_flags flags,
message_header_callback_t *callback, void *context);
#ifdef CONTEXT_TYPE_SAFETY
# define message_parse_header(input, hdr_size, flags, callback, context) \
({(void)(1 ? 0 : callback((struct message_header_line *)0, context)); \
message_parse_header(input, hdr_size, flags, \
(message_header_callback_t *)callback, context); })
#else
# define message_parse_header(input, hdr_size, flags, callback, context) \
message_parse_header(input, hdr_size, flags, \
(message_header_callback_t *)callback, context)
#endif
#endif