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