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