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