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_ */
|