HTTP parser: reduced memory consumption of header fields list.

This commit is contained in:
Valentin Bartenev
2017-06-20 22:32:13 +03:00
parent 1a22195830
commit accb489492
4 changed files with 164 additions and 158 deletions

View File

@@ -9,58 +9,57 @@
typedef struct nxt_http_request_parse_s nxt_http_request_parse_t;
typedef struct nxt_http_field_s nxt_http_field_t;
typedef struct nxt_http_fields_hash_s nxt_http_fields_hash_t;
typedef union {
u_char str[8];
uint64_t ui64;
u_char str[8];
uint64_t ui64;
} nxt_http_ver_t;
typedef struct {
union {
uint8_t str[32];
uint64_t ui64[4];
} key;
nxt_str_t name;
nxt_str_t value;
} nxt_http_field_t;
struct nxt_http_request_parse_s {
nxt_int_t (*handler)(nxt_http_request_parse_t *rp,
u_char **pos, u_char *end);
nxt_int_t (*handler)(nxt_http_request_parse_t *rp,
u_char **pos, u_char *end);
size_t offset;
size_t offset;
nxt_str_t method;
nxt_str_t method;
u_char *target_start;
u_char *target_end;
u_char *exten_start;
u_char *args_start;
u_char *target_start;
u_char *target_end;
u_char *exten_start;
u_char *args_start;
nxt_http_ver_t version;
nxt_http_ver_t version;
nxt_http_field_t field;
nxt_list_t *fields;
union {
uint8_t str[32];
uint64_t ui64[4];
} field_key;
nxt_str_t field_name;
nxt_str_t field_value;
nxt_http_fields_hash_t *fields_hash;
nxt_list_t *fields;
/* target with "/." */
unsigned complex_target:1;
unsigned complex_target:1;
/* target with "%" */
unsigned quoted_target:1;
unsigned quoted_target:1;
/* target with " " */
unsigned space_in_target:1;
unsigned space_in_target:1;
/* target with "+" */
unsigned plus_in_target:1;
unsigned plus_in_target:1;
};
typedef nxt_int_t (*nxt_http_field_handler_t)(void *ctx,
nxt_http_field_t *field,
uintptr_t data, nxt_log_t *log);
nxt_log_t *log);
typedef struct {
@@ -70,6 +69,14 @@ typedef struct {
} nxt_http_fields_hash_entry_t;
struct nxt_http_field_s {
nxt_str_t name;
nxt_str_t value;
nxt_http_field_handler_t handler;
uintptr_t data;
};
nxt_inline nxt_int_t
nxt_http_parse_request_init(nxt_http_request_parse_t *rp, nxt_mp_t *mp)
{
@@ -87,11 +94,8 @@ nxt_int_t nxt_http_parse_request(nxt_http_request_parse_t *rp,
nxt_http_fields_hash_t *nxt_http_fields_hash_create(
nxt_http_fields_hash_entry_t *entries, nxt_mp_t *mp);
nxt_http_fields_hash_entry_t *nxt_http_fields_hash_lookup(
nxt_http_fields_hash_t *hash, nxt_http_field_t *field);
nxt_int_t nxt_http_fields_process(nxt_list_t *fields,
nxt_http_fields_hash_t *hash, void *ctx, nxt_log_t *log);
nxt_int_t nxt_http_fields_process(nxt_list_t *fields, void *ctx,
nxt_log_t *log);
#endif /* _NXT_HTTP_PARSER_H_INCLUDED_ */