nxt_http_parse.h (16:c382e548cbb6) nxt_http_parse.h (60:b80bfbd9bddc)
1
2/*
3 * Copyright (C) NGINX, Inc.
4 * Copyright (C) Valentin V. Bartenev
5 */
6
7#ifndef _NXT_HTTP_PARSER_H_INCLUDED_
8#define _NXT_HTTP_PARSER_H_INCLUDED_
9
10
11typedef struct nxt_http_request_parse_s nxt_http_request_parse_t;
12typedef struct nxt_http_fields_hash_s nxt_http_fields_hash_t;
13
1
2/*
3 * Copyright (C) NGINX, Inc.
4 * Copyright (C) Valentin V. Bartenev
5 */
6
7#ifndef _NXT_HTTP_PARSER_H_INCLUDED_
8#define _NXT_HTTP_PARSER_H_INCLUDED_
9
10
11typedef struct nxt_http_request_parse_s nxt_http_request_parse_t;
12typedef struct nxt_http_fields_hash_s nxt_http_fields_hash_t;
13
14typedef nxt_int_t (*nxt_http_field_handler_t)(void *ctx, nxt_str_t *name,
15 nxt_str_t *value, uintptr_t data);
16
14
17
18typedef union {
15typedef union {
19 u_char str[8];
20 uint64_t ui64;
16 u_char str[8];
17 uint64_t ui64;
21} nxt_http_ver_t;
22
23
18} nxt_http_ver_t;
19
20
24struct nxt_http_request_parse_s {
25 nxt_int_t (*handler)(nxt_http_request_parse_t *rp,
26 u_char **pos, u_char *end);
21typedef struct {
22 union {
23 uint8_t str[32];
24 uint64_t ui64[4];
25 } key;
27
26
28 size_t offset;
27 nxt_str_t name;
28 nxt_str_t value;
29} nxt_http_field_t;
29
30
30 nxt_str_t method;
31
31
32 u_char *target_start;
33 u_char *target_end;
34 u_char *exten_start;
35 u_char *args_start;
32struct nxt_http_request_parse_s {
33 nxt_int_t (*handler)(nxt_http_request_parse_t *rp,
34 u_char **pos, u_char *end);
36
35
37 nxt_http_ver_t version;
36 size_t offset;
38
37
39 union {
40 uint8_t str[32];
41 uint64_t ui64[4];
42 } field_name_key;
38 nxt_str_t method;
43
39
44 nxt_str_t field_name;
45 nxt_str_t field_value;
40 u_char *target_start;
41 u_char *target_end;
42 u_char *exten_start;
43 u_char *args_start;
46
44
47 nxt_http_fields_hash_t *hash;
48 void *ctx;
45 nxt_http_ver_t version;
49
46
47 nxt_http_field_t field;
48 nxt_list_t *fields;
49
50 /* target with "/." */
50 /* target with "/." */
51 unsigned complex_target:1;
51 unsigned complex_target:1;
52 /* target with "%" */
52 /* target with "%" */
53 unsigned quoted_target:1;
53 unsigned quoted_target:1;
54 /* target with " " */
54 /* target with " " */
55 unsigned space_in_target:1;
55 unsigned space_in_target:1;
56 /* target with "+" */
56 /* target with "+" */
57 unsigned plus_in_target:1;
57 unsigned plus_in_target:1;
58};
59
60
58};
59
60
61typedef nxt_int_t (*nxt_http_field_handler_t)(void *ctx,
62 nxt_http_field_t *field,
63 uintptr_t data, nxt_log_t *log);
64
65
61typedef struct {
62 nxt_str_t name;
63 nxt_http_field_handler_t handler;
64 uintptr_t data;
66typedef struct {
67 nxt_str_t name;
68 nxt_http_field_handler_t handler;
69 uintptr_t data;
65} nxt_http_fields_t;
70} nxt_http_fields_hash_entry_t;
66
67
71
72
73nxt_inline nxt_int_t
74nxt_http_parse_request_init(nxt_http_request_parse_t *rp, nxt_mem_pool_t *mp)
75{
76 rp->fields = nxt_list_create(mp, 8, sizeof(nxt_http_field_t));
77 if (nxt_slow_path(rp->fields == NULL)){
78 return NXT_ERROR;
79 }
80
81 return NXT_OK;
82}
83
84
68nxt_int_t nxt_http_parse_request(nxt_http_request_parse_t *rp,
69 nxt_buf_mem_t *b);
85nxt_int_t nxt_http_parse_request(nxt_http_request_parse_t *rp,
86 nxt_buf_mem_t *b);
70nxt_http_fields_hash_t *nxt_http_fields_hash(nxt_http_fields_t *fields,
71 nxt_mem_pool_t *mp);
72
87
88nxt_http_fields_hash_t *nxt_http_fields_hash_create(
89 nxt_http_fields_hash_entry_t *entries, nxt_mem_pool_t *mp);
90nxt_http_fields_hash_entry_t *nxt_http_fields_hash_lookup(
91 nxt_http_fields_hash_t *hash, nxt_http_field_t *field);
73
92
93nxt_int_t nxt_http_fields_process(nxt_list_t *fields,
94 nxt_http_fields_hash_t *hash, void *ctx, nxt_log_t *log);
95
96
74#endif /* _NXT_HTTP_PARSER_H_INCLUDED_ */
97#endif /* _NXT_HTTP_PARSER_H_INCLUDED_ */