1*0Sigor@sysoev.ru 2*0Sigor@sysoev.ru /* 3*0Sigor@sysoev.ru * Copyright (C) Igor Sysoev 4*0Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 5*0Sigor@sysoev.ru */ 6*0Sigor@sysoev.ru 7*0Sigor@sysoev.ru #ifndef _NXT_UPSTREAM_SOURCE_H_INCLUDED_ 8*0Sigor@sysoev.ru #define _NXT_UPSTREAM_SOURCE_H_INCLUDED_ 9*0Sigor@sysoev.ru 10*0Sigor@sysoev.ru 11*0Sigor@sysoev.ru typedef struct { 12*0Sigor@sysoev.ru uint32_t hash; 13*0Sigor@sysoev.ru 14*0Sigor@sysoev.ru unsigned value_len:23; 15*0Sigor@sysoev.ru unsigned skip:1; 16*0Sigor@sysoev.ru unsigned name_len:8; 17*0Sigor@sysoev.ru 18*0Sigor@sysoev.ru u_char *value_start; 19*0Sigor@sysoev.ru u_char *name_start; 20*0Sigor@sysoev.ru } nxt_name_value_t; 21*0Sigor@sysoev.ru 22*0Sigor@sysoev.ru 23*0Sigor@sysoev.ru typedef struct { 24*0Sigor@sysoev.ru nxt_list_t *list; 25*0Sigor@sysoev.ru nxt_lvlhsh_t hash; 26*0Sigor@sysoev.ru 27*0Sigor@sysoev.ru uint16_t status; /* 16 bits */ 28*0Sigor@sysoev.ru 29*0Sigor@sysoev.ru nxt_off_t content_length; 30*0Sigor@sysoev.ru } nxt_upstream_header_in_t; 31*0Sigor@sysoev.ru 32*0Sigor@sysoev.ru 33*0Sigor@sysoev.ru typedef nxt_int_t (*nxt_upstream_name_value_handler_t)( 34*0Sigor@sysoev.ru nxt_upstream_source_t *us, nxt_name_value_t *nv); 35*0Sigor@sysoev.ru 36*0Sigor@sysoev.ru 37*0Sigor@sysoev.ru typedef struct { 38*0Sigor@sysoev.ru nxt_upstream_name_value_handler_t handler; 39*0Sigor@sysoev.ru 40*0Sigor@sysoev.ru uint8_t len; 41*0Sigor@sysoev.ru /* 42*0Sigor@sysoev.ru * A name is inlined to test it with one memory access. 43*0Sigor@sysoev.ru * The struct size is aligned to 32 bytes. 44*0Sigor@sysoev.ru */ 45*0Sigor@sysoev.ru #if (NXT_64BIT) 46*0Sigor@sysoev.ru u_char name[23]; 47*0Sigor@sysoev.ru #else 48*0Sigor@sysoev.ru u_char name[27]; 49*0Sigor@sysoev.ru #endif 50*0Sigor@sysoev.ru } nxt_upstream_name_value_t; 51*0Sigor@sysoev.ru 52*0Sigor@sysoev.ru 53*0Sigor@sysoev.ru struct nxt_upstream_source_s { 54*0Sigor@sysoev.ru nxt_upstream_peer_t *peer; 55*0Sigor@sysoev.ru 56*0Sigor@sysoev.ru const nxt_upstream_state_t *state; 57*0Sigor@sysoev.ru 58*0Sigor@sysoev.ru void *protocol_source; 59*0Sigor@sysoev.ru void *data; 60*0Sigor@sysoev.ru nxt_work_queue_t *work_queue; 61*0Sigor@sysoev.ru 62*0Sigor@sysoev.ru nxt_buf_pool_t buffers; 63*0Sigor@sysoev.ru 64*0Sigor@sysoev.ru nxt_lvlhsh_t header_hash; 65*0Sigor@sysoev.ru nxt_stream_source_t *stream; 66*0Sigor@sysoev.ru }; 67*0Sigor@sysoev.ru 68*0Sigor@sysoev.ru 69*0Sigor@sysoev.ru #define NXT_UPSTREAM_NAME_VALUE_MIN_SIZE \ 70*0Sigor@sysoev.ru offsetof(nxt_http_upstream_header_t, name) 71*0Sigor@sysoev.ru 72*0Sigor@sysoev.ru #define nxt_upstream_name_value(s) sizeof(s) - 1, s 73*0Sigor@sysoev.ru 74*0Sigor@sysoev.ru 75*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_upstream_header_hash_add(nxt_mem_pool_t *mp, 76*0Sigor@sysoev.ru nxt_lvlhsh_t *lh, const nxt_upstream_name_value_t *unv, nxt_uint_t n); 77*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_upstream_name_value_ignore(nxt_upstream_source_t *us, 78*0Sigor@sysoev.ru nxt_name_value_t *nv); 79*0Sigor@sysoev.ru 80*0Sigor@sysoev.ru NXT_EXPORT extern const nxt_lvlhsh_proto_t nxt_upstream_header_hash_proto; 81*0Sigor@sysoev.ru 82*0Sigor@sysoev.ru 83*0Sigor@sysoev.ru #endif /* _NXT_UPSTREAM_SOURCE_H_INCLUDED_ */ 84