diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_upstream_source.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/nxt_upstream_source.h b/src/nxt_upstream_source.h new file mode 100644 index 00000000..706cb5c9 --- /dev/null +++ b/src/nxt_upstream_source.h @@ -0,0 +1,83 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NXT_UPSTREAM_SOURCE_H_INCLUDED_ +#define _NXT_UPSTREAM_SOURCE_H_INCLUDED_ + + +typedef struct { + uint32_t hash; + + unsigned value_len:23; + unsigned skip:1; + unsigned name_len:8; + + u_char *value_start; + u_char *name_start; +} nxt_name_value_t; + + +typedef struct { + nxt_list_t *list; + nxt_lvlhsh_t hash; + + uint16_t status; /* 16 bits */ + + nxt_off_t content_length; +} nxt_upstream_header_in_t; + + +typedef nxt_int_t (*nxt_upstream_name_value_handler_t)( + nxt_upstream_source_t *us, nxt_name_value_t *nv); + + +typedef struct { + nxt_upstream_name_value_handler_t handler; + + uint8_t len; + /* + * A name is inlined to test it with one memory access. + * The struct size is aligned to 32 bytes. + */ +#if (NXT_64BIT) + u_char name[23]; +#else + u_char name[27]; +#endif +} nxt_upstream_name_value_t; + + +struct nxt_upstream_source_s { + nxt_upstream_peer_t *peer; + + const nxt_upstream_state_t *state; + + void *protocol_source; + void *data; + nxt_work_queue_t *work_queue; + + nxt_buf_pool_t buffers; + + nxt_lvlhsh_t header_hash; + nxt_stream_source_t *stream; +}; + + +#define NXT_UPSTREAM_NAME_VALUE_MIN_SIZE \ + offsetof(nxt_http_upstream_header_t, name) + +#define nxt_upstream_name_value(s) sizeof(s) - 1, s + + +NXT_EXPORT nxt_int_t nxt_upstream_header_hash_add(nxt_mem_pool_t *mp, + nxt_lvlhsh_t *lh, const nxt_upstream_name_value_t *unv, nxt_uint_t n); +NXT_EXPORT nxt_int_t nxt_upstream_name_value_ignore(nxt_upstream_source_t *us, + nxt_name_value_t *nv); + +NXT_EXPORT extern const nxt_lvlhsh_proto_t nxt_upstream_header_hash_proto; + + +#endif /* _NXT_UPSTREAM_SOURCE_H_INCLUDED_ */ |