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