1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_HTTP_UPSTREAM_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev#include <ngx_event.h>
15e18a033bSKonstantin Ananyev#include <ngx_event_connect.h>
16e18a033bSKonstantin Ananyev#include <ngx_event_pipe.h>
17e18a033bSKonstantin Ananyev#include <ngx_http.h>
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyev
20e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_ERROR           0x00000002
21e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x00000004
22e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x00000008
23e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x00000010
24e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_502        0x00000020
25e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x00000040
26e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_504        0x00000080
27e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_403        0x00000100
28e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x00000200
29e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_HTTP_429        0x00000400
30e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_UPDATING        0x00000800
31e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x00001000
32e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x00002000
33e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT  0x00004000
34e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_NOLIVE          0x40000000
35e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_OFF             0x80000000
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FT_STATUS          (NGX_HTTP_UPSTREAM_FT_HTTP_500  \
38e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_502  \
39e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_503  \
40e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_504  \
41e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_403  \
42e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_404  \
43e18a033bSKonstantin Ananyev                                             |NGX_HTTP_UPSTREAM_FT_HTTP_429)
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_INVALID_HEADER     40
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyev
48e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT    0x00000002
49e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES     0x00000004
50e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_EXPIRES        0x00000008
51e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL  0x00000010
52e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE     0x00000020
53e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE  0x00000040
54e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING   0x00000080
55e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET     0x00000100
56e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_IGN_VARY           0x00000200
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyevtypedef struct {
60e18a033bSKonstantin Ananyev    ngx_uint_t                       status;
61e18a033bSKonstantin Ananyev    ngx_msec_t                       response_time;
62e18a033bSKonstantin Ananyev    ngx_msec_t                       connect_time;
63e18a033bSKonstantin Ananyev    ngx_msec_t                       header_time;
64e18a033bSKonstantin Ananyev    off_t                            response_length;
65e18a033bSKonstantin Ananyev    off_t                            bytes_received;
66e18a033bSKonstantin Ananyev
67e18a033bSKonstantin Ananyev    ngx_str_t                       *peer;
68e18a033bSKonstantin Ananyev} ngx_http_upstream_state_t;
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev
71e18a033bSKonstantin Ananyevtypedef struct {
72e18a033bSKonstantin Ananyev    ngx_hash_t                       headers_in_hash;
73e18a033bSKonstantin Ananyev    ngx_array_t                      upstreams;
74e18a033bSKonstantin Ananyev                                             /* ngx_http_upstream_srv_conf_t */
75e18a033bSKonstantin Ananyev} ngx_http_upstream_main_conf_t;
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyevtypedef struct ngx_http_upstream_srv_conf_s  ngx_http_upstream_srv_conf_t;
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf,
80e18a033bSKonstantin Ananyev    ngx_http_upstream_srv_conf_t *us);
81e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r,
82e18a033bSKonstantin Ananyev    ngx_http_upstream_srv_conf_t *us);
83e18a033bSKonstantin Ananyev
84e18a033bSKonstantin Ananyev
85e18a033bSKonstantin Ananyevtypedef struct {
86e18a033bSKonstantin Ananyev    ngx_http_upstream_init_pt        init_upstream;
87e18a033bSKonstantin Ananyev    ngx_http_upstream_init_peer_pt   init;
88e18a033bSKonstantin Ananyev    void                            *data;
89e18a033bSKonstantin Ananyev} ngx_http_upstream_peer_t;
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyevtypedef struct {
93e18a033bSKonstantin Ananyev    ngx_str_t                        name;
94e18a033bSKonstantin Ananyev    ngx_addr_t                      *addrs;
95e18a033bSKonstantin Ananyev    ngx_uint_t                       naddrs;
96e18a033bSKonstantin Ananyev    ngx_uint_t                       weight;
97e18a033bSKonstantin Ananyev    ngx_uint_t                       max_conns;
98e18a033bSKonstantin Ananyev    ngx_uint_t                       max_fails;
99e18a033bSKonstantin Ananyev    time_t                           fail_timeout;
100e18a033bSKonstantin Ananyev    ngx_msec_t                       slow_start;
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyev    unsigned                         down:1;
103e18a033bSKonstantin Ananyev    unsigned                         backup:1;
104e18a033bSKonstantin Ananyev
105e18a033bSKonstantin Ananyev    NGX_COMPAT_BEGIN(6)
106e18a033bSKonstantin Ananyev    NGX_COMPAT_END
107e18a033bSKonstantin Ananyev} ngx_http_upstream_server_t;
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyev
110e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_CREATE        0x0001
111e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_WEIGHT        0x0002
112e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_MAX_FAILS     0x0004
113e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT  0x0008
114e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_DOWN          0x0010
115e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_BACKUP        0x0020
116e18a033bSKonstantin Ananyev#define NGX_HTTP_UPSTREAM_MAX_CONNS     0x0100
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev
119e18a033bSKonstantin Ananyevstruct ngx_http_upstream_srv_conf_s {
120e18a033bSKonstantin Ananyev    ngx_http_upstream_peer_t         peer;
121e18a033bSKonstantin Ananyev    void                           **srv_conf;
122e18a033bSKonstantin Ananyev
123e18a033bSKonstantin Ananyev    ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyev    ngx_uint_t                       flags;
126e18a033bSKonstantin Ananyev    ngx_str_t                        host;
127e18a033bSKonstantin Ananyev    u_char                          *file_name;
128e18a033bSKonstantin Ananyev    ngx_uint_t                       line;
129e18a033bSKonstantin Ananyev    in_port_t                        port;
130e18a033bSKonstantin Ananyev    ngx_uint_t                       no_port;  /* unsigned no_port:1 */
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev#if (NGX_HTTP_UPSTREAM_ZONE)
133e18a033bSKonstantin Ananyev    ngx_shm_zone_t                  *shm_zone;
134e18a033bSKonstantin Ananyev#endif
135e18a033bSKonstantin Ananyev};
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev
138e18a033bSKonstantin Ananyevtypedef struct {
139e18a033bSKonstantin Ananyev    ngx_addr_t                      *addr;
140e18a033bSKonstantin Ananyev    ngx_http_complex_value_t        *value;
141e18a033bSKonstantin Ananyev#if (NGX_HAVE_TRANSPARENT_PROXY)
142e18a033bSKonstantin Ananyev    ngx_uint_t                       transparent; /* unsigned  transparent:1; */
143e18a033bSKonstantin Ananyev#endif
144e18a033bSKonstantin Ananyev} ngx_http_upstream_local_t;
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyevtypedef struct {
148e18a033bSKonstantin Ananyev    ngx_http_upstream_srv_conf_t    *upstream;
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev    ngx_msec_t                       connect_timeout;
151e18a033bSKonstantin Ananyev    ngx_msec_t                       send_timeout;
152e18a033bSKonstantin Ananyev    ngx_msec_t                       read_timeout;
153e18a033bSKonstantin Ananyev    ngx_msec_t                       next_upstream_timeout;
154e18a033bSKonstantin Ananyev
155e18a033bSKonstantin Ananyev    size_t                           send_lowat;
156e18a033bSKonstantin Ananyev    size_t                           buffer_size;
157e18a033bSKonstantin Ananyev    size_t                           limit_rate;
158e18a033bSKonstantin Ananyev
159e18a033bSKonstantin Ananyev    size_t                           busy_buffers_size;
160e18a033bSKonstantin Ananyev    size_t                           max_temp_file_size;
161e18a033bSKonstantin Ananyev    size_t                           temp_file_write_size;
162e18a033bSKonstantin Ananyev
163e18a033bSKonstantin Ananyev    size_t                           busy_buffers_size_conf;
164e18a033bSKonstantin Ananyev    size_t                           max_temp_file_size_conf;
165e18a033bSKonstantin Ananyev    size_t                           temp_file_write_size_conf;
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev    ngx_bufs_t                       bufs;
168e18a033bSKonstantin Ananyev
169e18a033bSKonstantin Ananyev    ngx_uint_t                       ignore_headers;
170e18a033bSKonstantin Ananyev    ngx_uint_t                       next_upstream;
171e18a033bSKonstantin Ananyev    ngx_uint_t                       store_access;
172e18a033bSKonstantin Ananyev    ngx_uint_t                       next_upstream_tries;
173e18a033bSKonstantin Ananyev    ngx_flag_t                       buffering;
174e18a033bSKonstantin Ananyev    ngx_flag_t                       request_buffering;
175e18a033bSKonstantin Ananyev    ngx_flag_t                       pass_request_headers;
176e18a033bSKonstantin Ananyev    ngx_flag_t                       pass_request_body;
177e18a033bSKonstantin Ananyev
178e18a033bSKonstantin Ananyev    ngx_flag_t                       ignore_client_abort;
179e18a033bSKonstantin Ananyev    ngx_flag_t                       intercept_errors;
180e18a033bSKonstantin Ananyev    ngx_flag_t                       cyclic_temp_file;
181e18a033bSKonstantin Ananyev    ngx_flag_t                       force_ranges;
182e18a033bSKonstantin Ananyev
183e18a033bSKonstantin Ananyev    ngx_path_t                      *temp_path;
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev    ngx_hash_t                       hide_headers_hash;
186e18a033bSKonstantin Ananyev    ngx_array_t                     *hide_headers;
187e18a033bSKonstantin Ananyev    ngx_array_t                     *pass_headers;
188e18a033bSKonstantin Ananyev
189e18a033bSKonstantin Ananyev    ngx_http_upstream_local_t       *local;
190e18a033bSKonstantin Ananyev
191e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
192e18a033bSKonstantin Ananyev    ngx_shm_zone_t                  *cache_zone;
193e18a033bSKonstantin Ananyev    ngx_http_complex_value_t        *cache_value;
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev    ngx_uint_t                       cache_min_uses;
196e18a033bSKonstantin Ananyev    ngx_uint_t                       cache_use_stale;
197e18a033bSKonstantin Ananyev    ngx_uint_t                       cache_methods;
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev    off_t                            cache_max_range_offset;
200e18a033bSKonstantin Ananyev
201e18a033bSKonstantin Ananyev    ngx_flag_t                       cache_lock;
202e18a033bSKonstantin Ananyev    ngx_msec_t                       cache_lock_timeout;
203e18a033bSKonstantin Ananyev    ngx_msec_t                       cache_lock_age;
204e18a033bSKonstantin Ananyev
205e18a033bSKonstantin Ananyev    ngx_flag_t                       cache_revalidate;
206e18a033bSKonstantin Ananyev    ngx_flag_t                       cache_convert_head;
207e18a033bSKonstantin Ananyev    ngx_flag_t                       cache_background_update;
208e18a033bSKonstantin Ananyev
209e18a033bSKonstantin Ananyev    ngx_array_t                     *cache_valid;
210e18a033bSKonstantin Ananyev    ngx_array_t                     *cache_bypass;
211e18a033bSKonstantin Ananyev    ngx_array_t                     *cache_purge;
212e18a033bSKonstantin Ananyev    ngx_array_t                     *no_cache;
213e18a033bSKonstantin Ananyev#endif
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyev    ngx_array_t                     *store_lengths;
216e18a033bSKonstantin Ananyev    ngx_array_t                     *store_values;
217e18a033bSKonstantin Ananyev
218e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
219e18a033bSKonstantin Ananyev    signed                           cache:2;
220e18a033bSKonstantin Ananyev#endif
221e18a033bSKonstantin Ananyev    signed                           store:2;
222e18a033bSKonstantin Ananyev    unsigned                         intercept_404:1;
223e18a033bSKonstantin Ananyev    unsigned                         change_buffering:1;
224e18a033bSKonstantin Ananyev
225e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL || NGX_COMPAT)
226e18a033bSKonstantin Ananyev    ngx_ssl_t                       *ssl;
227e18a033bSKonstantin Ananyev    ngx_flag_t                       ssl_session_reuse;
228e18a033bSKonstantin Ananyev
229e18a033bSKonstantin Ananyev    ngx_http_complex_value_t        *ssl_name;
230e18a033bSKonstantin Ananyev    ngx_flag_t                       ssl_server_name;
231e18a033bSKonstantin Ananyev    ngx_flag_t                       ssl_verify;
232e18a033bSKonstantin Ananyev#endif
233e18a033bSKonstantin Ananyev
234e18a033bSKonstantin Ananyev    ngx_str_t                        module;
235e18a033bSKonstantin Ananyev
236e18a033bSKonstantin Ananyev    NGX_COMPAT_BEGIN(2)
237e18a033bSKonstantin Ananyev    NGX_COMPAT_END
238e18a033bSKonstantin Ananyev} ngx_http_upstream_conf_t;
239e18a033bSKonstantin Ananyev
240e18a033bSKonstantin Ananyev
241e18a033bSKonstantin Ananyevtypedef struct {
242e18a033bSKonstantin Ananyev    ngx_str_t                        name;
243e18a033bSKonstantin Ananyev    ngx_http_header_handler_pt       handler;
244e18a033bSKonstantin Ananyev    ngx_uint_t                       offset;
245e18a033bSKonstantin Ananyev    ngx_http_header_handler_pt       copy_handler;
246e18a033bSKonstantin Ananyev    ngx_uint_t                       conf;
247e18a033bSKonstantin Ananyev    ngx_uint_t                       redirect;  /* unsigned   redirect:1; */
248e18a033bSKonstantin Ananyev} ngx_http_upstream_header_t;
249e18a033bSKonstantin Ananyev
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyevtypedef struct {
252e18a033bSKonstantin Ananyev    ngx_list_t                       headers;
253e18a033bSKonstantin Ananyev
254e18a033bSKonstantin Ananyev    ngx_uint_t                       status_n;
255e18a033bSKonstantin Ananyev    ngx_str_t                        status_line;
256e18a033bSKonstantin Ananyev
257e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *status;
258e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *date;
259e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *server;
260e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *connection;
261e18a033bSKonstantin Ananyev
262e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *expires;
263e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *etag;
264e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *x_accel_expires;
265e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *x_accel_redirect;
266e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *x_accel_limit_rate;
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *content_type;
269e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *content_length;
270e18a033bSKonstantin Ananyev
271e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *last_modified;
272e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *location;
273e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *accept_ranges;
274e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *www_authenticate;
275e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *transfer_encoding;
276e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *vary;
277e18a033bSKonstantin Ananyev
278e18a033bSKonstantin Ananyev#if (NGX_HTTP_GZIP)
279e18a033bSKonstantin Ananyev    ngx_table_elt_t                 *content_encoding;
280e18a033bSKonstantin Ananyev#endif
281e18a033bSKonstantin Ananyev
282e18a033bSKonstantin Ananyev    ngx_array_t                      cache_control;
283e18a033bSKonstantin Ananyev    ngx_array_t                      cookies;
284e18a033bSKonstantin Ananyev
285e18a033bSKonstantin Ananyev    off_t                            content_length_n;
286e18a033bSKonstantin Ananyev    time_t                           last_modified_time;
287e18a033bSKonstantin Ananyev
288e18a033bSKonstantin Ananyev    unsigned                         connection_close:1;
289e18a033bSKonstantin Ananyev    unsigned                         chunked:1;
290e18a033bSKonstantin Ananyev} ngx_http_upstream_headers_in_t;
291e18a033bSKonstantin Ananyev
292e18a033bSKonstantin Ananyev
293e18a033bSKonstantin Ananyevtypedef struct {
294e18a033bSKonstantin Ananyev    ngx_str_t                        host;
295e18a033bSKonstantin Ananyev    in_port_t                        port;
296e18a033bSKonstantin Ananyev    ngx_uint_t                       no_port; /* unsigned no_port:1 */
297e18a033bSKonstantin Ananyev
298e18a033bSKonstantin Ananyev    ngx_uint_t                       naddrs;
299e18a033bSKonstantin Ananyev    ngx_resolver_addr_t             *addrs;
300e18a033bSKonstantin Ananyev
301e18a033bSKonstantin Ananyev    struct sockaddr                 *sockaddr;
302e18a033bSKonstantin Ananyev    socklen_t                        socklen;
303e18a033bSKonstantin Ananyev    ngx_str_t                        name;
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev    ngx_resolver_ctx_t              *ctx;
306e18a033bSKonstantin Ananyev} ngx_http_upstream_resolved_t;
307e18a033bSKonstantin Ananyev
308e18a033bSKonstantin Ananyev
309e18a033bSKonstantin Ananyevtypedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r,
310e18a033bSKonstantin Ananyev    ngx_http_upstream_t *u);
311e18a033bSKonstantin Ananyev
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyevstruct ngx_http_upstream_s {
314e18a033bSKonstantin Ananyev    ngx_http_upstream_handler_pt     read_event_handler;
315e18a033bSKonstantin Ananyev    ngx_http_upstream_handler_pt     write_event_handler;
316e18a033bSKonstantin Ananyev
317e18a033bSKonstantin Ananyev    ngx_peer_connection_t            peer;
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyev    ngx_event_pipe_t                *pipe;
320e18a033bSKonstantin Ananyev
321e18a033bSKonstantin Ananyev    ngx_chain_t                     *request_bufs;
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyev    ngx_output_chain_ctx_t           output;
324e18a033bSKonstantin Ananyev    ngx_chain_writer_ctx_t           writer;
325e18a033bSKonstantin Ananyev
326e18a033bSKonstantin Ananyev    ngx_http_upstream_conf_t        *conf;
327e18a033bSKonstantin Ananyev    ngx_http_upstream_srv_conf_t    *upstream;
328e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
329e18a033bSKonstantin Ananyev    ngx_array_t                     *caches;
330e18a033bSKonstantin Ananyev#endif
331e18a033bSKonstantin Ananyev
332e18a033bSKonstantin Ananyev    ngx_http_upstream_headers_in_t   headers_in;
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyev    ngx_http_upstream_resolved_t    *resolved;
335e18a033bSKonstantin Ananyev
336e18a033bSKonstantin Ananyev    ngx_buf_t                        from_client;
337e18a033bSKonstantin Ananyev
338e18a033bSKonstantin Ananyev    ngx_buf_t                        buffer;
339e18a033bSKonstantin Ananyev    off_t                            length;
340e18a033bSKonstantin Ananyev
341e18a033bSKonstantin Ananyev    ngx_chain_t                     *out_bufs;
342e18a033bSKonstantin Ananyev    ngx_chain_t                     *busy_bufs;
343e18a033bSKonstantin Ananyev    ngx_chain_t                     *free_bufs;
344e18a033bSKonstantin Ananyev
345e18a033bSKonstantin Ananyev    ngx_int_t                      (*input_filter_init)(void *data);
346e18a033bSKonstantin Ananyev    ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);
347e18a033bSKonstantin Ananyev    void                            *input_filter_ctx;
348e18a033bSKonstantin Ananyev
349e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
350e18a033bSKonstantin Ananyev    ngx_int_t                      (*create_key)(ngx_http_request_t *r);
351e18a033bSKonstantin Ananyev#endif
352e18a033bSKonstantin Ananyev    ngx_int_t                      (*create_request)(ngx_http_request_t *r);
353e18a033bSKonstantin Ananyev    ngx_int_t                      (*reinit_request)(ngx_http_request_t *r);
354e18a033bSKonstantin Ananyev    ngx_int_t                      (*process_header)(ngx_http_request_t *r);
355e18a033bSKonstantin Ananyev    void                           (*abort_request)(ngx_http_request_t *r);
356e18a033bSKonstantin Ananyev    void                           (*finalize_request)(ngx_http_request_t *r,
357e18a033bSKonstantin Ananyev                                         ngx_int_t rc);
358e18a033bSKonstantin Ananyev    ngx_int_t                      (*rewrite_redirect)(ngx_http_request_t *r,
359e18a033bSKonstantin Ananyev                                         ngx_table_elt_t *h, size_t prefix);
360e18a033bSKonstantin Ananyev    ngx_int_t                      (*rewrite_cookie)(ngx_http_request_t *r,
361e18a033bSKonstantin Ananyev                                         ngx_table_elt_t *h);
362e18a033bSKonstantin Ananyev
363e18a033bSKonstantin Ananyev    ngx_msec_t                       timeout;
364e18a033bSKonstantin Ananyev
365e18a033bSKonstantin Ananyev    ngx_http_upstream_state_t       *state;
366e18a033bSKonstantin Ananyev
367e18a033bSKonstantin Ananyev    ngx_str_t                        method;
368e18a033bSKonstantin Ananyev    ngx_str_t                        schema;
369e18a033bSKonstantin Ananyev    ngx_str_t                        uri;
370e18a033bSKonstantin Ananyev
371e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL || NGX_COMPAT)
372e18a033bSKonstantin Ananyev    ngx_str_t                        ssl_name;
373e18a033bSKonstantin Ananyev#endif
374e18a033bSKonstantin Ananyev
375e18a033bSKonstantin Ananyev    ngx_http_cleanup_pt             *cleanup;
376e18a033bSKonstantin Ananyev
377e18a033bSKonstantin Ananyev    unsigned                         store:1;
378e18a033bSKonstantin Ananyev    unsigned                         cacheable:1;
379e18a033bSKonstantin Ananyev    unsigned                         accel:1;
380e18a033bSKonstantin Ananyev    unsigned                         ssl:1;
381e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
382e18a033bSKonstantin Ananyev    unsigned                         cache_status:3;
383e18a033bSKonstantin Ananyev#endif
384e18a033bSKonstantin Ananyev
385e18a033bSKonstantin Ananyev    unsigned                         buffering:1;
386e18a033bSKonstantin Ananyev    unsigned                         keepalive:1;
387e18a033bSKonstantin Ananyev    unsigned                         upgrade:1;
388e18a033bSKonstantin Ananyev
389e18a033bSKonstantin Ananyev    unsigned                         request_sent:1;
390e18a033bSKonstantin Ananyev    unsigned                         request_body_sent:1;
391e18a033bSKonstantin Ananyev    unsigned                         header_sent:1;
392e18a033bSKonstantin Ananyev};
393e18a033bSKonstantin Ananyev
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyevtypedef struct {
396e18a033bSKonstantin Ananyev    ngx_uint_t                      status;
397e18a033bSKonstantin Ananyev    ngx_uint_t                      mask;
398e18a033bSKonstantin Ananyev} ngx_http_upstream_next_t;
399e18a033bSKonstantin Ananyev
400e18a033bSKonstantin Ananyev
401e18a033bSKonstantin Ananyevtypedef struct {
402e18a033bSKonstantin Ananyev    ngx_str_t   key;
403e18a033bSKonstantin Ananyev    ngx_str_t   value;
404e18a033bSKonstantin Ananyev    ngx_uint_t  skip_empty;
405e18a033bSKonstantin Ananyev} ngx_http_upstream_param_t;
406e18a033bSKonstantin Ananyev
407e18a033bSKonstantin Ananyev
408e18a033bSKonstantin Ananyevngx_int_t ngx_http_upstream_create(ngx_http_request_t *r);
409e18a033bSKonstantin Ananyevvoid ngx_http_upstream_init(ngx_http_request_t *r);
410e18a033bSKonstantin Ananyevngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf,
411e18a033bSKonstantin Ananyev    ngx_url_t *u, ngx_uint_t flags);
412