10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #ifndef _NXT_UPSTREAM_SOURCE_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_UPSTREAM_SOURCE_H_INCLUDED_
90Sigor@sysoev.ru 
100Sigor@sysoev.ru 
110Sigor@sysoev.ru typedef struct {
120Sigor@sysoev.ru     uint32_t                           hash;
130Sigor@sysoev.ru 
140Sigor@sysoev.ru     unsigned                           value_len:23;
150Sigor@sysoev.ru     unsigned                           skip:1;
160Sigor@sysoev.ru     unsigned                           name_len:8;
170Sigor@sysoev.ru 
180Sigor@sysoev.ru     u_char                             *value_start;
190Sigor@sysoev.ru     u_char                             *name_start;
200Sigor@sysoev.ru } nxt_name_value_t;
210Sigor@sysoev.ru 
220Sigor@sysoev.ru 
230Sigor@sysoev.ru typedef struct {
240Sigor@sysoev.ru     nxt_list_t                         *list;
250Sigor@sysoev.ru     nxt_lvlhsh_t                       hash;
260Sigor@sysoev.ru 
270Sigor@sysoev.ru     uint16_t                           status;    /* 16 bits */
280Sigor@sysoev.ru 
290Sigor@sysoev.ru     nxt_off_t                          content_length;
300Sigor@sysoev.ru } nxt_upstream_header_in_t;
310Sigor@sysoev.ru 
320Sigor@sysoev.ru 
330Sigor@sysoev.ru typedef nxt_int_t (*nxt_upstream_name_value_handler_t)(
340Sigor@sysoev.ru     nxt_upstream_source_t *us, nxt_name_value_t *nv);
350Sigor@sysoev.ru 
360Sigor@sysoev.ru 
370Sigor@sysoev.ru typedef struct {
380Sigor@sysoev.ru     nxt_upstream_name_value_handler_t  handler;
390Sigor@sysoev.ru 
400Sigor@sysoev.ru     uint8_t                            len;
410Sigor@sysoev.ru     /*
420Sigor@sysoev.ru      * A name is inlined to test it with one memory access.
430Sigor@sysoev.ru      * The struct size is aligned to 32 bytes.
440Sigor@sysoev.ru      */
450Sigor@sysoev.ru #if (NXT_64BIT)
460Sigor@sysoev.ru     u_char                             name[23];
470Sigor@sysoev.ru #else
480Sigor@sysoev.ru     u_char                             name[27];
490Sigor@sysoev.ru #endif
500Sigor@sysoev.ru } nxt_upstream_name_value_t;
510Sigor@sysoev.ru 
520Sigor@sysoev.ru 
530Sigor@sysoev.ru struct nxt_upstream_source_s {
540Sigor@sysoev.ru     nxt_upstream_peer_t                *peer;
550Sigor@sysoev.ru 
560Sigor@sysoev.ru     const nxt_upstream_state_t         *state;
570Sigor@sysoev.ru 
580Sigor@sysoev.ru     void                               *protocol_source;
590Sigor@sysoev.ru     void                               *data;
600Sigor@sysoev.ru     nxt_work_queue_t                   *work_queue;
610Sigor@sysoev.ru 
620Sigor@sysoev.ru     nxt_buf_pool_t                     buffers;
630Sigor@sysoev.ru 
640Sigor@sysoev.ru     nxt_lvlhsh_t                       header_hash;
650Sigor@sysoev.ru     nxt_stream_source_t                *stream;
660Sigor@sysoev.ru };
670Sigor@sysoev.ru 
680Sigor@sysoev.ru 
690Sigor@sysoev.ru #define NXT_UPSTREAM_NAME_VALUE_MIN_SIZE                                      \
700Sigor@sysoev.ru     offsetof(nxt_http_upstream_header_t, name)
710Sigor@sysoev.ru 
720Sigor@sysoev.ru #define nxt_upstream_name_value(s)   sizeof(s) - 1, s
730Sigor@sysoev.ru 
740Sigor@sysoev.ru 
75*65Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_upstream_header_hash_add(nxt_mp_t *mp,
760Sigor@sysoev.ru     nxt_lvlhsh_t *lh, const nxt_upstream_name_value_t *unv, nxt_uint_t n);
770Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_upstream_name_value_ignore(nxt_upstream_source_t *us,
780Sigor@sysoev.ru     nxt_name_value_t *nv);
790Sigor@sysoev.ru 
800Sigor@sysoev.ru NXT_EXPORT extern const nxt_lvlhsh_proto_t  nxt_upstream_header_hash_proto;
810Sigor@sysoev.ru 
820Sigor@sysoev.ru 
830Sigor@sysoev.ru #endif /* _NXT_UPSTREAM_SOURCE_H_INCLUDED_ */
84