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