xref: /unit/src/nxt_http_parse.h (revision 480:11b28d6fc462)
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 
11 typedef enum {
12     NXT_HTTP_PARSE_INVALID = 1,
13     NXT_HTTP_PARSE_TOO_LARGE_FIELD,
14 } nxt_http_parse_error_t;
15 
16 
17 typedef struct nxt_http_request_parse_s  nxt_http_request_parse_t;
18 typedef struct nxt_http_field_s          nxt_http_field_t;
19 typedef struct nxt_http_fields_hash_s    nxt_http_fields_hash_t;
20 
21 
22 typedef union {
23     u_char                    str[8];
24     uint64_t                  ui64;
25 } nxt_http_ver_t;
26 
27 
28 struct nxt_http_request_parse_s {
29     nxt_int_t                 (*handler)(nxt_http_request_parse_t *rp,
30                                          u_char **pos, u_char *end);
31 
32     size_t                    offset;
33 
34     nxt_str_t                 method;
35 
36     u_char                    *target_start;
37     u_char                    *target_end;
38     u_char                    *exten_start;
39     u_char                    *args_start;
40 
41     nxt_str_t                 path;
42     nxt_str_t                 args;
43     nxt_str_t                 exten;
44 
45     nxt_http_ver_t            version;
46 
47     nxt_list_t                *fields;
48     nxt_mp_t                  *mem_pool;
49 
50     nxt_str_t                 field_name;
51     nxt_str_t                 field_value;
52 
53     uint32_t                  field_hash;
54 
55     /* target with "/." */
56     unsigned                  complex_target:1;
57     /* target with "%" */
58     unsigned                  quoted_target:1;
59     /* target with " " */
60     unsigned                  space_in_target:1;
61     /* target with "+" */
62     unsigned                  plus_in_target:1;
63 };
64 
65 
66 typedef nxt_int_t (*nxt_http_field_handler_t)(void *ctx,
67                                               nxt_http_field_t *field,
68                                               uintptr_t data);
69 
70 
71 typedef struct {
72     nxt_str_t                 name;
73     nxt_http_field_handler_t  handler;
74     uintptr_t                 data;
75 } nxt_http_field_proc_t;
76 
77 
78 struct nxt_http_field_s {
79     uint16_t                  hash;
80     uint8_t                   skip;             /* 1 bit */
81     uint8_t                   name_length;
82     uint32_t                  value_length;
83     u_char                    *name;
84     u_char                    *value;
85 };
86 
87 
88 nxt_int_t nxt_http_parse_request_init(nxt_http_request_parse_t *rp,
89     nxt_mp_t *mp);
90 nxt_int_t nxt_http_parse_request(nxt_http_request_parse_t *rp,
91     nxt_buf_mem_t *b);
92 nxt_int_t nxt_http_parse_fields(nxt_http_request_parse_t *rp,
93     nxt_buf_mem_t *b);
94 
95 nxt_int_t nxt_http_fields_hash(nxt_lvlhsh_t *hash, nxt_mp_t *mp,
96     nxt_http_field_proc_t items[], nxt_uint_t count);
97 nxt_uint_t nxt_http_fields_hash_collisions(nxt_lvlhsh_t *hash, nxt_mp_t *mp,
98     nxt_http_field_proc_t items[], nxt_uint_t count, nxt_bool_t level);
99 nxt_int_t nxt_http_fields_process(nxt_list_t *fields, nxt_lvlhsh_t *hash,
100     void *ctx);
101 
102 
103 #endif /* _NXT_HTTP_PARSER_H_INCLUDED_ */
104