upstream nginx-0.7.31
[nginx.git] / nginx / src / http / ngx_http_upstream.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_
8 #define _NGX_HTTP_UPSTREAM_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13 #include <ngx_event.h>
14 #include <ngx_event_connect.h>
15 #include <ngx_event_pipe.h>
16 #include <ngx_http.h>
17
18
19 #define NGX_HTTP_UPSTREAM_FT_ERROR           0x00000002
20 #define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x00000004
21 #define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x00000008
22 #define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x00000010
23 #define NGX_HTTP_UPSTREAM_FT_HTTP_502        0x00000020
24 #define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x00000040
25 #define NGX_HTTP_UPSTREAM_FT_HTTP_504        0x00000080
26 #define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x00000100
27 #define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x00000200
28 #define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x00000400
29 #define NGX_HTTP_UPSTREAM_FT_NOLIVE          0x40000000
30 #define NGX_HTTP_UPSTREAM_FT_OFF             0x80000000
31
32 #define NGX_HTTP_UPSTREAM_FT_STATUS          (NGX_HTTP_UPSTREAM_FT_HTTP_500  \
33                                              |NGX_HTTP_UPSTREAM_FT_HTTP_502  \
34                                              |NGX_HTTP_UPSTREAM_FT_HTTP_503  \
35                                              |NGX_HTTP_UPSTREAM_FT_HTTP_504  \
36                                              |NGX_HTTP_UPSTREAM_FT_HTTP_404)
37
38 #define NGX_HTTP_UPSTREAM_INVALID_HEADER     40
39
40
41 typedef struct {
42     ngx_msec_t                      bl_time;
43     ngx_uint_t                      bl_state;
44
45     ngx_uint_t                      status;
46     time_t                          response_sec;
47     ngx_uint_t                      response_msec;
48     off_t                           response_length;
49
50     ngx_str_t                      *peer;
51 } ngx_http_upstream_state_t;
52
53
54 typedef struct {
55     ngx_hash_t                      headers_in_hash;
56     ngx_array_t                     upstreams;
57                                              /* ngx_http_upstream_srv_conf_t */
58 } ngx_http_upstream_main_conf_t;
59
60 typedef struct ngx_http_upstream_srv_conf_s  ngx_http_upstream_srv_conf_t;
61
62 typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf,
63     ngx_http_upstream_srv_conf_t *us);
64 typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r,
65     ngx_http_upstream_srv_conf_t *us);
66
67
68 typedef struct {
69     ngx_http_upstream_init_pt       init_upstream;
70     ngx_http_upstream_init_peer_pt  init;
71     void                           *data;
72 } ngx_http_upstream_peer_t;
73
74
75 typedef struct {
76     ngx_peer_addr_t                *addrs;
77     ngx_uint_t                      naddrs;
78     ngx_uint_t                      weight;
79     ngx_uint_t                      max_fails;
80     time_t                          fail_timeout;
81
82     unsigned                        down:1;
83     unsigned                        backup:1;
84 } ngx_http_upstream_server_t;
85
86
87 #define NGX_HTTP_UPSTREAM_CREATE        0x0001
88 #define NGX_HTTP_UPSTREAM_WEIGHT        0x0002
89 #define NGX_HTTP_UPSTREAM_MAX_FAILS     0x0004
90 #define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT  0x0008
91 #define NGX_HTTP_UPSTREAM_DOWN          0x0010
92 #define NGX_HTTP_UPSTREAM_BACKUP        0x0020
93
94
95 struct ngx_http_upstream_srv_conf_s {
96     ngx_http_upstream_peer_t        peer;
97     void                          **srv_conf;
98
99     ngx_array_t                    *servers;   /* ngx_http_upstream_server_t */
100
101     ngx_uint_t                      flags;
102     ngx_str_t                       host;
103     u_char                         *file_name;
104     ngx_uint_t                      line;
105     in_port_t                       port;
106     in_port_t                       default_port;
107 };
108
109
110 typedef struct {
111     ngx_http_upstream_srv_conf_t   *upstream;
112
113     ngx_msec_t                      connect_timeout;
114     ngx_msec_t                      send_timeout;
115     ngx_msec_t                      read_timeout;
116     ngx_msec_t                      timeout;
117
118     size_t                          send_lowat;
119     size_t                          buffer_size;
120
121     size_t                          busy_buffers_size;
122     size_t                          max_temp_file_size;
123     size_t                          temp_file_write_size;
124
125     size_t                          busy_buffers_size_conf;
126     size_t                          max_temp_file_size_conf;
127     size_t                          temp_file_write_size_conf;
128
129     ngx_uint_t                      next_upstream;
130     ngx_uint_t                      store_access;
131
132     ngx_bufs_t                      bufs;
133
134     ngx_flag_t                      buffering;
135     ngx_flag_t                      pass_request_headers;
136     ngx_flag_t                      pass_request_body;
137
138     ngx_flag_t                      ignore_client_abort;
139     ngx_flag_t                      intercept_errors;
140     ngx_flag_t                      cyclic_temp_file;
141
142     ngx_path_t                     *temp_path;
143
144     ngx_hash_t                      hide_headers_hash;
145     ngx_array_t                    *hide_headers;
146     ngx_array_t                    *pass_headers;
147
148     ngx_array_t                    *store_lengths;
149     ngx_array_t                    *store_values;
150
151     signed                          store:2;
152     unsigned                        intercept_404:1;
153     unsigned                        change_buffering:1;
154
155 #if (NGX_HTTP_SSL)
156     ngx_ssl_t                      *ssl;
157     ngx_flag_t                      ssl_session_reuse;
158 #endif
159
160 } ngx_http_upstream_conf_t;
161
162
163 typedef struct {
164     ngx_str_t                       name;
165     ngx_http_header_handler_pt      handler;
166     ngx_uint_t                      offset;
167     ngx_http_header_handler_pt      copy_handler;
168     ngx_uint_t                      conf;
169     ngx_uint_t                      redirect;  /* unsigned   redirect:1; */
170 } ngx_http_upstream_header_t;
171
172
173 typedef struct {
174     ngx_list_t                      headers;
175
176     ngx_uint_t                      status_n;
177     ngx_str_t                       status_line;
178
179     ngx_table_elt_t                *status;
180     ngx_table_elt_t                *date;
181     ngx_table_elt_t                *server;
182     ngx_table_elt_t                *connection;
183
184     ngx_table_elt_t                *expires;
185     ngx_table_elt_t                *etag;
186     ngx_table_elt_t                *x_accel_expires;
187     ngx_table_elt_t                *x_accel_redirect;
188     ngx_table_elt_t                *x_accel_limit_rate;
189
190     ngx_table_elt_t                *content_type;
191     ngx_table_elt_t                *content_length;
192
193     ngx_table_elt_t                *last_modified;
194     ngx_table_elt_t                *location;
195     ngx_table_elt_t                *accept_ranges;
196     ngx_table_elt_t                *www_authenticate;
197
198 #if (NGX_HTTP_GZIP)
199     ngx_table_elt_t                *content_encoding;
200 #endif
201
202     off_t                           content_length_n;
203
204     ngx_array_t                     cache_control;
205 } ngx_http_upstream_headers_in_t;
206
207
208 typedef struct {
209     ngx_str_t                       host;
210     in_port_t                       port;
211     ngx_uint_t                      no_port; /* unsigned  no_port:1 */
212
213     ngx_uint_t                      naddrs;
214     in_addr_t                      *addrs;
215
216     struct sockaddr                *sockaddr;
217     socklen_t                       socklen;
218
219     ngx_resolver_ctx_t             *ctx;
220 } ngx_http_upstream_resolved_t;
221
222
223 typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r,
224     ngx_http_upstream_t *u);
225
226
227 struct ngx_http_upstream_s {
228     ngx_http_upstream_handler_pt    read_event_handler;
229     ngx_http_upstream_handler_pt    write_event_handler;
230
231     ngx_peer_connection_t           peer;
232
233     ngx_event_pipe_t               *pipe;
234
235     ngx_chain_t                    *request_bufs;
236
237     ngx_output_chain_ctx_t          output;
238     ngx_chain_writer_ctx_t          writer;
239
240     ngx_http_upstream_conf_t       *conf;
241
242     ngx_http_upstream_headers_in_t  headers_in;
243
244     ngx_http_upstream_resolved_t   *resolved;
245
246     ngx_buf_t                       buffer;
247     size_t                          length;
248
249     ngx_chain_t                    *out_bufs;
250     ngx_chain_t                    *busy_bufs;
251     ngx_chain_t                    *free_bufs;
252
253     ngx_int_t                     (*input_filter_init)(void *data);
254     ngx_int_t                     (*input_filter)(void *data, ssize_t bytes);
255     void                           *input_filter_ctx;
256
257     ngx_int_t                     (*create_request)(ngx_http_request_t *r);
258     ngx_int_t                     (*reinit_request)(ngx_http_request_t *r);
259     ngx_int_t                     (*process_header)(ngx_http_request_t *r);
260     void                          (*abort_request)(ngx_http_request_t *r);
261     void                          (*finalize_request)(ngx_http_request_t *r,
262                                         ngx_int_t rc);
263     ngx_int_t                     (*rewrite_redirect)(ngx_http_request_t *r,
264                                         ngx_table_elt_t *h, size_t prefix);
265
266     ngx_msec_t                      timeout;
267
268     ngx_http_upstream_state_t      *state;
269
270     ngx_str_t                       method;
271     ngx_str_t                       schema;
272     ngx_str_t                       uri;
273
274     ngx_http_cleanup_pt            *cleanup;
275
276     unsigned                        store:1;
277     unsigned                        cacheable:1;
278     unsigned                        accel:1;
279     unsigned                        ssl:1;
280
281     unsigned                        buffering:1;
282
283     unsigned                        request_sent:1;
284     unsigned                        header_sent:1;
285 };
286
287
288 typedef struct {
289     ngx_uint_t                      status;
290     ngx_uint_t                      mask;
291 } ngx_http_upstream_next_t;
292
293
294 ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r,
295     ngx_http_variable_value_t *v, uintptr_t data);
296
297 void ngx_http_upstream_init(ngx_http_request_t *r);
298 ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf,
299     ngx_url_t *u, ngx_uint_t flags);
300 ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,
301     ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,
302     ngx_str_t *default_hide_headers, ngx_hash_init_t *hash);
303
304
305 #define ngx_http_conf_upstream_srv_conf(uscf, module)                         \
306     uscf->srv_conf[module.ctx_index]
307
308
309 extern ngx_module_t  ngx_http_upstream_module;
310
311
312 #endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */