annotate src/http/ngx_http_upstream.c @ 4138:70e1ee2307f9

Fix of separate pool for upstream connections (r4117). Pool may not be created if connection was created but rejected in connect() call. Make sure to check if it is here before trying to destroy it.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 20 Sep 2011 10:00:46 +0000
parents 0c30976f5bfa
children 114e3a7c3b8d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
12 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
13 static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
14 ngx_http_upstream_t *u);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
15 static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
16 ngx_http_upstream_t *u);
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
17 static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
18 ngx_http_variable_value_t *v, uintptr_t data);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
19 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
20
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
21 static void ngx_http_upstream_init_request(ngx_http_request_t *r);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
22 static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
23 static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
24 static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
25 static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
26 ngx_event_t *ev);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 static void ngx_http_upstream_connect(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
28 ngx_http_upstream_t *u);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
29 static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
30 ngx_http_upstream_t *u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 static void ngx_http_upstream_send_request(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
32 ngx_http_upstream_t *u);
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
33 static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
34 ngx_http_upstream_t *u);
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
35 static void ngx_http_upstream_process_header(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
36 ngx_http_upstream_t *u);
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
37 static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r,
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
38 ngx_http_upstream_t *u);
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
39 static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r,
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
40 ngx_http_upstream_t *u);
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
41 static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
42 static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
43 ngx_http_upstream_t *u);
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
44 static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
45 ngx_http_upstream_t *u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 static void ngx_http_upstream_send_response(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
47 ngx_http_upstream_t *u);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
48 static void
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
49 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
50 static void
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
51 ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
52 ngx_http_upstream_t *u);
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
53 static void
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
54 ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
55 ngx_uint_t do_write);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
56 static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
57 static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
58 ssize_t bytes);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
59 static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
60 static void ngx_http_upstream_process_upstream(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
61 ngx_http_upstream_t *u);
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
62 static void ngx_http_upstream_process_request(ngx_http_request_t *r);
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
63 static void ngx_http_upstream_store(ngx_http_request_t *r,
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
64 ngx_http_upstream_t *u);
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
65 static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
66 ngx_http_upstream_t *u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 static void ngx_http_upstream_next(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
68 ngx_http_upstream_t *u, ngx_uint_t ft_type);
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
69 static void ngx_http_upstream_cleanup(void *data);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
71 ngx_http_upstream_t *u, ngx_int_t rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
73 static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
74 ngx_table_elt_t *h, ngx_uint_t offset);
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
75 static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
76 ngx_table_elt_t *h, ngx_uint_t offset);
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
77 static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
78 ngx_table_elt_t *h, ngx_uint_t offset);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
79 static ngx_int_t
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
80 ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
81 ngx_table_elt_t *h, ngx_uint_t offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
82 static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
83 ngx_table_elt_t *h, ngx_uint_t offset);
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
84 static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r,
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
85 ngx_table_elt_t *h, ngx_uint_t offset);
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
86 static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
87 ngx_table_elt_t *h, ngx_uint_t offset);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
88 static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
89 ngx_table_elt_t *h, ngx_uint_t offset);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
90 static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
91 ngx_table_elt_t *h, ngx_uint_t offset);
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
92 static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
93 ngx_table_elt_t *h, ngx_uint_t offset);
4124
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
94 static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r,
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
95 ngx_table_elt_t *h, ngx_uint_t offset);
4123
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
96 static ngx_int_t
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
97 ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
98 ngx_table_elt_t *h, ngx_uint_t offset);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
99 static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
100 ngx_table_elt_t *h, ngx_uint_t offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
101 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
102 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
103 ngx_table_elt_t *h, ngx_uint_t offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
104 static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
105 ngx_table_elt_t *h, ngx_uint_t offset);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
106 static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
107 ngx_table_elt_t *h, ngx_uint_t offset);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
108 static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
109 ngx_table_elt_t *h, ngx_uint_t offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
110 static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
111 ngx_table_elt_t *h, ngx_uint_t offset);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
112 static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
113 ngx_table_elt_t *h, ngx_uint_t offset);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
114
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
115 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
116 static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
117 ngx_table_elt_t *h, ngx_uint_t offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
118 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
119
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
120 static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
121 static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
122 ngx_http_variable_value_t *v, uintptr_t data);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
123 static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
124 ngx_http_variable_value_t *v, uintptr_t data);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
125 static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
126 ngx_http_variable_value_t *v, uintptr_t data);
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
127 static ngx_int_t ngx_http_upstream_response_length_variable(
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
128 ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
129
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
130 static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
131 static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
132 void *conf);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
133
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
134 static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
135 static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
136
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
137 #if (NGX_HTTP_SSL)
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
138 static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
139 ngx_http_upstream_t *u, ngx_connection_t *c);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
140 static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
141 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
142
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
143
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
144 ngx_http_upstream_header_t ngx_http_upstream_headers_in[] = {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
145
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
146 { ngx_string("Status"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
147 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
148 offsetof(ngx_http_upstream_headers_in_t, status),
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
149 ngx_http_upstream_copy_header_line, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
150
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
151 { ngx_string("Content-Type"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
152 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
153 offsetof(ngx_http_upstream_headers_in_t, content_type),
673
b80f94fa2197 nginx-0.3.58-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 671
diff changeset
154 ngx_http_upstream_copy_content_type, 0, 1 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
155
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
156 { ngx_string("Content-Length"),
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
157 ngx_http_upstream_process_content_length,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
158 offsetof(ngx_http_upstream_headers_in_t, content_length),
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
159 ngx_http_upstream_ignore_header_line, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
160
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
161 { ngx_string("Date"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
162 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
163 offsetof(ngx_http_upstream_headers_in_t, date),
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
164 ngx_http_upstream_copy_header_line,
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
165 offsetof(ngx_http_headers_out_t, date), 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
166
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
167 { ngx_string("Last-Modified"),
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
168 ngx_http_upstream_process_header_line,
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
169 offsetof(ngx_http_upstream_headers_in_t, last_modified),
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
170 ngx_http_upstream_copy_last_modified, 0, 0 },
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
171
3037
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
172 { ngx_string("ETag"),
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
173 ngx_http_upstream_process_header_line,
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
174 offsetof(ngx_http_upstream_headers_in_t, etag),
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
175 ngx_http_upstream_copy_header_line,
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
176 offsetof(ngx_http_headers_out_t, etag), 0 },
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
177
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
178 { ngx_string("Server"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
179 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
180 offsetof(ngx_http_upstream_headers_in_t, server),
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
181 ngx_http_upstream_copy_header_line,
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
182 offsetof(ngx_http_headers_out_t, server), 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
183
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
184 { ngx_string("WWW-Authenticate"),
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
185 ngx_http_upstream_process_header_line,
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
186 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
187 ngx_http_upstream_copy_header_line, 0, 0 },
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
188
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
189 { ngx_string("Location"),
2140
dce5ddef5af9 if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
190 ngx_http_upstream_process_header_line,
dce5ddef5af9 if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
191 offsetof(ngx_http_upstream_headers_in_t, location),
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
192 ngx_http_upstream_rewrite_location, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
193
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
194 { ngx_string("Refresh"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
195 ngx_http_upstream_ignore_header_line, 0,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
196 ngx_http_upstream_rewrite_refresh, 0, 0 },
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
197
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
198 { ngx_string("Set-Cookie"),
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
199 ngx_http_upstream_process_set_cookie, 0,
531
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
200 ngx_http_upstream_copy_header_line, 0, 1 },
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
201
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
202 { ngx_string("Content-Disposition"),
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
203 ngx_http_upstream_ignore_header_line, 0,
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
204 ngx_http_upstream_copy_header_line, 0, 1 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
205
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
206 { ngx_string("Cache-Control"),
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
207 ngx_http_upstream_process_cache_control, 0,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
208 ngx_http_upstream_copy_multi_header_lines,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
209 offsetof(ngx_http_headers_out_t, cache_control), 1 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
210
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
211 { ngx_string("Expires"),
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
212 ngx_http_upstream_process_expires, 0,
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
213 ngx_http_upstream_copy_header_line,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
214 offsetof(ngx_http_headers_out_t, expires), 1 },
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
215
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
216 { ngx_string("Accept-Ranges"),
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
217 ngx_http_upstream_process_header_line,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
218 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
219 ngx_http_upstream_copy_allow_ranges,
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
220 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
221
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
222 { ngx_string("Connection"),
4124
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
223 ngx_http_upstream_process_connection, 0,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
224 ngx_http_upstream_ignore_header_line, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
225
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
226 { ngx_string("Keep-Alive"),
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
227 ngx_http_upstream_ignore_header_line, 0,
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
228 ngx_http_upstream_ignore_header_line, 0, 0 },
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
229
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
230 { ngx_string("X-Powered-By"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
231 ngx_http_upstream_ignore_header_line, 0,
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
232 ngx_http_upstream_copy_header_line, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
233
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
234 { ngx_string("X-Accel-Expires"),
2664
f903114355d4 zero field
Igor Sysoev <igor@sysoev.ru>
parents: 2663
diff changeset
235 ngx_http_upstream_process_accel_expires, 0,
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
236 ngx_http_upstream_copy_header_line, 0, 0 },
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
237
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
238 { ngx_string("X-Accel-Redirect"),
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
239 ngx_http_upstream_process_header_line,
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
240 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),
3003
b630e7d095b3 allow to proxy_pass_header/fastcgi_pass_header "X-Accel-Redirect",
Igor Sysoev <igor@sysoev.ru>
parents: 2971
diff changeset
241 ngx_http_upstream_copy_header_line, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
242
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
243 { ngx_string("X-Accel-Limit-Rate"),
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
244 ngx_http_upstream_process_limit_rate, 0,
3003
b630e7d095b3 allow to proxy_pass_header/fastcgi_pass_header "X-Accel-Redirect",
Igor Sysoev <igor@sysoev.ru>
parents: 2971
diff changeset
245 ngx_http_upstream_copy_header_line, 0, 0 },
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
246
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
247 { ngx_string("X-Accel-Buffering"),
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
248 ngx_http_upstream_process_buffering, 0,
3003
b630e7d095b3 allow to proxy_pass_header/fastcgi_pass_header "X-Accel-Redirect",
Igor Sysoev <igor@sysoev.ru>
parents: 2971
diff changeset
249 ngx_http_upstream_copy_header_line, 0, 0 },
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
250
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
251 { ngx_string("X-Accel-Charset"),
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
252 ngx_http_upstream_process_charset, 0,
3003
b630e7d095b3 allow to proxy_pass_header/fastcgi_pass_header "X-Accel-Redirect",
Igor Sysoev <igor@sysoev.ru>
parents: 2971
diff changeset
253 ngx_http_upstream_copy_header_line, 0, 0 },
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
254
4123
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
255 { ngx_string("Transfer-Encoding"),
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
256 ngx_http_upstream_process_transfer_encoding, 0,
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
257 ngx_http_upstream_ignore_header_line, 0, 0 },
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
258
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
259 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
260 { ngx_string("Content-Encoding"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
261 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
262 offsetof(ngx_http_upstream_headers_in_t, content_encoding),
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
263 ngx_http_upstream_copy_content_encoding, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
264 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
265
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
266 { ngx_null_string, NULL, 0, NULL, 0, 0 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
267 };
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
270 static ngx_command_t ngx_http_upstream_commands[] = {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
271
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
272 { ngx_string("upstream"),
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
273 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
274 ngx_http_upstream,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
275 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
276 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
277 NULL },
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
278
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
279 { ngx_string("server"),
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
280 NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
281 ngx_http_upstream_server,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
282 NGX_HTTP_SRV_CONF_OFFSET,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
283 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
284 NULL },
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
285
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
286 ngx_null_command
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
287 };
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
288
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
289
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
290 static ngx_http_module_t ngx_http_upstream_module_ctx = {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
291 ngx_http_upstream_add_variables, /* preconfiguration */
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
292 NULL, /* postconfiguration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
293
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
294 ngx_http_upstream_create_main_conf, /* create main configuration */
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
295 ngx_http_upstream_init_main_conf, /* init main configuration */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 NULL, /* create server configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 NULL, /* merge server configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 NULL, /* create location configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 NULL /* merge location configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 };
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
303
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 ngx_module_t ngx_http_upstream_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
306 NGX_MODULE_V1,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 &ngx_http_upstream_module_ctx, /* module context */
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
308 ngx_http_upstream_commands, /* module directives */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
310 NULL, /* init master */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
312 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
313 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
314 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
315 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
316 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
317 NGX_MODULE_V1_PADDING
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 };
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
321 static ngx_http_variable_t ngx_http_upstream_vars[] = {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
322
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
323 { ngx_string("upstream_addr"), NULL,
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
324 ngx_http_upstream_addr_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
325 NGX_HTTP_VAR_NOCACHEABLE, 0 },
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
326
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
327 { ngx_string("upstream_status"), NULL,
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
328 ngx_http_upstream_status_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
329 NGX_HTTP_VAR_NOCACHEABLE, 0 },
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
330
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
331 { ngx_string("upstream_response_time"), NULL,
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
332 ngx_http_upstream_response_time_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
333 NGX_HTTP_VAR_NOCACHEABLE, 0 },
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
334
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
335 { ngx_string("upstream_response_length"), NULL,
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
336 ngx_http_upstream_response_length_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
337 NGX_HTTP_VAR_NOCACHEABLE, 0 },
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
338
2957
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
339 #if (NGX_HTTP_CACHE)
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
340
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
341 { ngx_string("upstream_cache_status"), NULL,
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
342 ngx_http_upstream_cache_status, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
343 NGX_HTTP_VAR_NOCACHEABLE, 0 },
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
344
2957
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
345 #endif
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
346
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
347 { ngx_null_string, NULL, NULL, 0, 0, 0 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
348 };
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
349
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
350
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
351 static ngx_http_upstream_next_t ngx_http_upstream_next_errors[] = {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
352 { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
353 { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
354 { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
355 { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
356 { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
357 { 0, 0 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
358 };
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
359
2875
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
360
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
361 ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[] = {
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
362 { ngx_string("GET"), NGX_HTTP_GET},
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
363 { ngx_string("HEAD"), NGX_HTTP_HEAD },
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
364 { ngx_string("POST"), NGX_HTTP_POST },
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
365 { ngx_null_string, 0 }
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
366 };
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
367
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
368
3667
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
369 ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[] = {
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
370 { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT },
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
371 { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
372 { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES },
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
373 { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL },
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
374 { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE },
3667
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
375 { ngx_null_string, 0 }
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
376 };
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
377
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
378
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
379 ngx_int_t
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
380 ngx_http_upstream_create(ngx_http_request_t *r)
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
381 {
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
382 ngx_http_upstream_t *u;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
383
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
384 u = r->upstream;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
385
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
386 if (u && u->cleanup) {
3112
5ddc9458e4bb increase request counter before an upstream cleanup because the cleanup
Igor Sysoev <igor@sysoev.ru>
parents: 3083
diff changeset
387 r->main->count++;
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
388 ngx_http_upstream_cleanup(r);
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
389 }
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
390
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
391 u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
392 if (u == NULL) {
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
393 return NGX_ERROR;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
394 }
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
395
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
396 r->upstream = u;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
397
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
398 u->peer.log = r->connection->log;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
399 u->peer.log_error = NGX_ERROR_ERR;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
400 #if (NGX_THREADS)
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
401 u->peer.lock = &r->connection->lock;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
402 #endif
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
403
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
404 #if (NGX_HTTP_CACHE)
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
405 r->cache = NULL;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
406 #endif
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
407
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
408 u->headers_in.content_length_n = -1;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
409
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
410 return NGX_OK;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
411 }
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
412
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
413
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
414 void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
415 ngx_http_upstream_init(ngx_http_request_t *r)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
417 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 c = r->connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 "http init upstream, client timer: %d", c->read->timer_set);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 if (c->read->timer_set) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 ngx_del_timer(c->read);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 if (!c->write->active) {
531
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
431 if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
432 == NGX_ERROR)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
440 ngx_http_upstream_init_request(r);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
441 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
442
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
443
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
444 static void
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
445 ngx_http_upstream_init_request(ngx_http_request_t *r)
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
446 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
447 ngx_str_t *host;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
448 ngx_uint_t i;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
449 ngx_resolver_ctx_t *ctx, temp;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
450 ngx_http_cleanup_t *cln;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
451 ngx_http_upstream_t *u;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
452 ngx_http_core_loc_conf_t *clcf;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
453 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
454 ngx_http_upstream_main_conf_t *umcf;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
455
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
456 if (r->aio) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
457 return;
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
458 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
459
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
460 u = r->upstream;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
461
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
462 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
463
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
464 if (u->conf->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
465 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
466
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
467 rc = ngx_http_upstream_cache(r, u);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
468
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
469 if (rc == NGX_BUSY) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
470 r->write_event_handler = ngx_http_upstream_init_request;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
471 return;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
472 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
473
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
474 r->write_event_handler = ngx_http_request_empty_handler;
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
475
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
476 if (rc == NGX_DONE) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
477 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
478 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
479
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
480 if (rc != NGX_DECLINED) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
481 ngx_http_finalize_request(r, rc);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
482 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
483 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
484 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
485
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
486 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
487
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
488 u->store = (u->conf->store || u->conf->store_lengths);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
489
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
490 if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
491 r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
492 r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
493 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
494
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
495 if (r->request_body) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
496 u->request_bufs = r->request_body->bufs;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
497 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
498
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
499 if (u->create_request(r) != NGX_OK) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
504 u->peer.local = u->conf->local;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
505
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
506 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507
3053
0d253659da12 directio_alignment
Igor Sysoev <igor@sysoev.ru>
parents: 3052
diff changeset
508 u->output.alignment = clcf->directio_alignment;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 u->output.pool = r->pool;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 u->output.bufs.num = 1;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
511 u->output.bufs.size = clcf->client_body_buffer_size;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 u->output.output_filter = ngx_chain_writer;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 u->output.filter_ctx = &u->writer;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 u->writer.pool = r->pool;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
517 if (r->upstream_states == NULL) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
518
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
519 r->upstream_states = ngx_array_create(r->pool, 1,
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
520 sizeof(ngx_http_upstream_state_t));
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
521 if (r->upstream_states == NULL) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
522 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
523 return;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
524 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
525
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
526 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
527
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
528 u->state = ngx_array_push(r->upstream_states);
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
529 if (u->state == NULL) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
530 ngx_http_upstream_finalize_request(r, u,
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
531 NGX_HTTP_INTERNAL_SERVER_ERROR);
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
532 return;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
533 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
534
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
535 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
538 cln = ngx_http_cleanup_add(r, 0);
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
539 if (cln == NULL) {
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
540 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
541 return;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
542 }
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
543
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
544 cln->handler = ngx_http_upstream_cleanup;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
545 cln->data = r;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
546 u->cleanup = &cln->handler;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
547
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
548 if (u->resolved == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
549
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
550 uscf = u->conf->upstream;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
551
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
552 } else {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
553
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
554 if (u->resolved->sockaddr) {
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
555
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
556 if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
557 != NGX_OK)
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
558 {
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
559 ngx_http_upstream_finalize_request(r, u,
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
560 NGX_HTTP_INTERNAL_SERVER_ERROR);
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
561 return;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
562 }
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
563
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
564 ngx_http_upstream_connect(r, u);
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
565
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
566 return;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
567 }
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
568
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
569 host = &u->resolved->host;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
570
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
571 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
572
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
573 uscfp = umcf->upstreams.elts;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
574
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
575 for (i = 0; i < umcf->upstreams.nelts; i++) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
576
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
577 uscf = uscfp[i];
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
578
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
579 if (uscf->host.len == host->len
2285
c77f4710595c fix r1913
Igor Sysoev <igor@sysoev.ru>
parents: 2268
diff changeset
580 && ((uscf->port == 0 && u->resolved->no_port)
1912
68b426b43c31 fix r1903
Igor Sysoev <igor@sysoev.ru>
parents: 1908
diff changeset
581 || uscf->port == u->resolved->port)
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
582 && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
583 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
584 goto found;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
585 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
586 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
587
3879
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
588 if (u->resolved->port == 0) {
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
589 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
590 "no port in upstream \"%V\"", host);
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
591 ngx_http_upstream_finalize_request(r, u,
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
592 NGX_HTTP_INTERNAL_SERVER_ERROR);
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
593 return;
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
594 }
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
595
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
596 temp.name = *host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
597
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
598 ctx = ngx_resolve_start(clcf->resolver, &temp);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
599 if (ctx == NULL) {
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
600 ngx_http_upstream_finalize_request(r, u,
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
601 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
602 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
603 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
604
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
605 if (ctx == NGX_NO_RESOLVER) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
606 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
607 "no resolver defined to resolve %V", host);
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
608
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
609 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
610 return;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
611 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
612
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
613 ctx->name = *host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
614 ctx->type = NGX_RESOLVE_A;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
615 ctx->handler = ngx_http_upstream_resolve_handler;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
616 ctx->data = r;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
617 ctx->timeout = clcf->resolver_timeout;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
618
1959
4f16186f5603 quick resolving handles u->resolved->ctx by itself
Igor Sysoev <igor@sysoev.ru>
parents: 1958
diff changeset
619 u->resolved->ctx = ctx;
4f16186f5603 quick resolving handles u->resolved->ctx by itself
Igor Sysoev <igor@sysoev.ru>
parents: 1958
diff changeset
620
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
621 if (ngx_resolve_name(ctx) != NGX_OK) {
1959
4f16186f5603 quick resolving handles u->resolved->ctx by itself
Igor Sysoev <igor@sysoev.ru>
parents: 1958
diff changeset
622 u->resolved->ctx = NULL;
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
623 ngx_http_upstream_finalize_request(r, u,
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
624 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
625 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
626 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
627
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
628 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
629 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
630
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
631 found:
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
632
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
633 if (uscf->peer.init(r, uscf) != NGX_OK) {
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
634 ngx_http_upstream_finalize_request(r, u,
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
635 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
636 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
637 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
638
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 ngx_http_upstream_connect(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
643 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
644
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
645 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
646 ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
647 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
648 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
649 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
650
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
651 c = r->cache;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
652
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
653 if (c == NULL) {
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
654
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
655 if (!(r->method & u->conf->cache_methods)) {
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
656 return NGX_DECLINED;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
657 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
658
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
659 if (r->method & NGX_HTTP_HEAD) {
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
660 u->method = ngx_http_core_get_method;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
661 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
662
3698
d11227f0107f rename ngx_http_file_cache_create() to ngx_http_file_cache_new()
Igor Sysoev <igor@sysoev.ru>
parents: 3697
diff changeset
663 if (ngx_http_file_cache_new(r) != NGX_OK) {
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
664 return NGX_ERROR;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
665 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
666
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
667 if (u->create_key(r) != NGX_OK) {
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
668 return NGX_ERROR;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
669 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
670
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
671 /* TODO: add keys */
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
672
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
673 ngx_http_file_cache_create_key(r);
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
674
3976
215fe9223419 update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents: 3963
diff changeset
675 if (r->cache->header_start + 256 >= u->conf->buffer_size) {
3944
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
676 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
3976
215fe9223419 update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents: 3963
diff changeset
677 "%V_buffer_size %uz is not enough for cache key, "
215fe9223419 update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents: 3963
diff changeset
678 "it should increased at least to %uz",
215fe9223419 update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents: 3963
diff changeset
679 &u->conf->module, u->conf->buffer_size,
215fe9223419 update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents: 3963
diff changeset
680 ngx_align(r->cache->header_start + 256, 1024));
3944
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
681
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
682 r->cache = NULL;
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
683 return NGX_DECLINED;
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
684 }
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
685
3917
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
686 switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
687
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
688 case NGX_ERROR:
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
689 return NGX_ERROR;
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
690
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
691 case NGX_DECLINED:
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
692 u->cache_status = NGX_HTTP_CACHE_BYPASS;
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
693 return NGX_DECLINED;
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
694
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
695 default: /* NGX_OK */
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
696 break;
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
697 }
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
698
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
699 u->cacheable = 1;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
700
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3692
diff changeset
701 c = r->cache;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3692
diff changeset
702
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
703 c->min_uses = u->conf->cache_min_uses;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
704 c->body_start = u->conf->buffer_size;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
705 c->file_cache = u->conf->cache->data;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
706
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
707 u->cache_status = NGX_HTTP_CACHE_MISS;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
708 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
709
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
710 rc = ngx_http_file_cache_open(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
711
2926
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
712 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
713 "http upstream cache: %i", rc);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
714
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
715 switch (rc) {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
716
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
717 case NGX_HTTP_CACHE_UPDATING:
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
718
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
719 if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
720 u->cache_status = rc;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
721 rc = NGX_OK;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
722
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
723 } else {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
724 rc = NGX_HTTP_CACHE_STALE;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
725 }
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
726
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
727 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
728
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
729 case NGX_OK:
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
730 u->cache_status = NGX_HTTP_CACHE_HIT;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
731 }
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
732
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
733 switch (rc) {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
734
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
735 case NGX_OK:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
736
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
737 rc = ngx_http_upstream_cache_send(r, u);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
738
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
739 if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
740 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
741 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
742
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
743 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
744
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
745 case NGX_HTTP_CACHE_STALE:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
746
2665
4d627567c324 fix r2664: ..._cache_valid did not work for stale responses
Igor Sysoev <igor@sysoev.ru>
parents: 2664
diff changeset
747 c->valid_sec = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
748 u->buffer.start = NULL;
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
749 u->cache_status = NGX_HTTP_CACHE_EXPIRED;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
750
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
751 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
752
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
753 case NGX_DECLINED:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
754
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
755 if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
756 u->buffer.start = NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
757
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
758 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
759 u->buffer.pos = u->buffer.start + c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
760 u->buffer.last = u->buffer.pos;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
761 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
762
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
763 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
764
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
765 case NGX_HTTP_CACHE_SCARCE:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
766
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
767 u->cacheable = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
768
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
769 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
770
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
771 case NGX_AGAIN:
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
772
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
773 return NGX_BUSY;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
774
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
775 case NGX_ERROR:
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
776
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
777 return NGX_ERROR;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
778
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
779 default:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
780
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
781 /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
782
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
783 u->cache_status = NGX_HTTP_CACHE_HIT;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
784
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
785 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
786 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
787
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
788 r->cached = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
789
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
790 return NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
791 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
792
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
793
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
794 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
795 ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
796 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
797 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
798 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
799
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
800 r->cached = 1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
801 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
802
3369
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
803 if (c->header_start == c->body_start) {
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
804 r->http_version = NGX_HTTP_VERSION_9;
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
805 return ngx_http_cache_send(r);
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
806 }
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
807
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
808 /* TODO: cache stack */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
809
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
810 u->buffer = *c->buf;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
811 u->buffer.pos += c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
812
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
813 ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
814 u->headers_in.content_length_n = -1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
815
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
816 if (ngx_list_init(&u->headers_in.headers, r->pool, 8,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
817 sizeof(ngx_table_elt_t))
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
818 != NGX_OK)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
819 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
820 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
821 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
822
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
823 rc = u->process_header(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
824
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
825 if (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
826
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
827 if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
828 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
829 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
830
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
831 return ngx_http_cache_send(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
832 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
833
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
834 if (rc == NGX_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
835 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
836 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
837
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
838 /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
839
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
840 /* TODO: delete file */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
841
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
842 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
843 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
844
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
845 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
846
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
847
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
848 static void
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
849 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
850 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
851 ngx_http_request_t *r;
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
852 ngx_http_upstream_t *u;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
853 ngx_http_upstream_resolved_t *ur;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
854
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
855 r = ctx->data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
856
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
857 u = r->upstream;
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
858 ur = u->resolved;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
859
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
860 if (ctx->state) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
861 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
862 "%V could not be resolved (%i: %s)",
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
863 &ctx->name, ctx->state,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
864 ngx_resolver_strerror(ctx->state));
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
865
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
866 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
867 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
868 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
869
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
870 ur->naddrs = ctx->naddrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
871 ur->addrs = ctx->addrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
872
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
873 #if (NGX_DEBUG)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
874 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
875 in_addr_t addr;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
876 ngx_uint_t i;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
877
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
878 for (i = 0; i < ctx->naddrs; i++) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
879 addr = ntohl(ur->addrs[i]);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
880
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
881 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
882 "name was resolved to %ud.%ud.%ud.%ud",
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
883 (addr >> 24) & 0xff, (addr >> 16) & 0xff,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
884 (addr >> 8) & 0xff, addr & 0xff);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
885 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
886 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
887 #endif
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
888
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
889 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
890 ngx_http_upstream_finalize_request(r, u,
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
891 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
892 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
893 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
894
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
895 ngx_resolve_name_done(ctx);
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
896 ur->ctx = NULL;
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
897
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
898 ngx_http_upstream_connect(r, u);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
899 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
900
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
901
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
902 static void
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
903 ngx_http_upstream_handler(ngx_event_t *ev)
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
904 {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
905 ngx_connection_t *c;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
906 ngx_http_request_t *r;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
907 ngx_http_log_ctx_t *ctx;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
908 ngx_http_upstream_t *u;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
909
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
910 c = ev->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
911 r = c->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
912
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
913 u = r->upstream;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
914 c = r->connection;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
915
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
916 ctx = c->log->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
917 ctx->current_request = r;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
918
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
919 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
920 "http upstream request: \"%V?%V\"", &r->uri, &r->args);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
921
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
922 if (ev->write) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
923 u->write_event_handler(r, u);
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
924
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
925 } else {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
926 u->read_event_handler(r, u);
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
927 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
928
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
929 ngx_http_run_posted_requests(c);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
930 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
931
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
932
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
933 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
934 ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
935 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
936 ngx_http_upstream_check_broken_connection(r, r->connection->read);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
937 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
938
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
939
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
940 static void
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
941 ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
942 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
943 ngx_http_upstream_check_broken_connection(r, r->connection->write);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
944 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
945
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
946
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
947 static void
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
948 ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
949 ngx_event_t *ev)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
950 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
951 int n;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
952 char buf[1];
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
953 ngx_err_t err;
2807
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
954 ngx_int_t event;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955 ngx_connection_t *c;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
956 ngx_http_upstream_t *u;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
958 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
959 "http upstream check client, write event:%d, \"%V\"",
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
960 ev->write, &r->uri);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
962 c = r->connection;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
963 u = r->upstream;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
964
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
965 if (c->error) {
2807
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
966 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
967
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
968 event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
969
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
970 if (ngx_del_event(ev, event, 0) != NGX_OK) {
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
971 ngx_http_upstream_finalize_request(r, u,
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
972 NGX_HTTP_INTERNAL_SERVER_ERROR);
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
973 return;
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
974 }
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
975 }
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
976
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
977 if (!u->cacheable) {
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
978 ngx_http_upstream_finalize_request(r, u,
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
979 NGX_HTTP_CLIENT_CLOSED_REQUEST);
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
980 }
2807
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
981
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
982 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
983 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
984
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
985 #if (NGX_HAVE_KQUEUE)
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
986
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
987 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
988
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
989 if (!ev->pending_eof) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
993 ev->eof = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
994 c->error = 1;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996 if (ev->kq_errno) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997 ev->error = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
998 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
999
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
1000 if (!u->cacheable && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1001 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1002 "kevent() reported that client closed prematurely "
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
1003 "connection, so upstream connection is closed too");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1007 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010 "kevent() reported that client closed "
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1011 "prematurely connection");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1012
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013 if (u->peer.connection == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1014 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1023 n = recv(c->fd, buf, 1, MSG_PEEK);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1025 err = ngx_socket_errno;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026
1109
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1027 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1028 "http upstream recv(): %d", n);
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1029
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030 if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1033
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1034 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
2807
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1035
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1036 event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1037
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1038 if (ngx_del_event(ev, event, 0) != NGX_OK) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1041 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1044
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045 if (n > 0) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1049 if (n == -1) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1050 if (err == NGX_EAGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1054 ev->error = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1056 } else { /* n == 0 */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057 err = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1058 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1059
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
1060 ev->eof = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
1061 c->error = 1;
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
1062
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
1063 if (!u->cacheable && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1064 ngx_log_error(NGX_LOG_INFO, ev->log, err,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1065 "client closed prematurely connection, "
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1066 "so upstream connection is closed too");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1067 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1068 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1069 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1070 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1071
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1072 ngx_log_error(NGX_LOG_INFO, ev->log, err,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1073 "client closed prematurely connection");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1074
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1075 if (u->peer.connection == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1076 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1078 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1080
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1081
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1082 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1083 ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1084 {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1085 ngx_int_t rc;
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1086 ngx_time_t *tp;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1087 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1088
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1089 r->connection->log->action = "connecting to upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1090
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1091 r->connection->single_connection = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1092
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1093 if (u->state && u->state->response_sec) {
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1094 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1095 u->state->response_sec = tp->sec - u->state->response_sec;
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1096 u->state->response_msec = tp->msec - u->state->response_msec;
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1097 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1098
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1099 u->state = ngx_array_push(r->upstream_states);
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1100 if (u->state == NULL) {
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1101 ngx_http_upstream_finalize_request(r, u,
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1102 NGX_HTTP_INTERNAL_SERVER_ERROR);
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1103 return;
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1104 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1105
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1106 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1107
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1108 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1109 u->state->response_sec = tp->sec;
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1110 u->state->response_msec = tp->msec;
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1111
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112 rc = ngx_event_connect_peer(&u->peer);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 "http upstream connect: %i", rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117 if (rc == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1118 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1119 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122
1707
f3188f6eae1f $upstream_addr did not contain last address, the bug was introduced in r1659
Igor Sysoev <igor@sysoev.ru>
parents: 1706
diff changeset
1123 u->state->peer = u->peer.name;
f3188f6eae1f $upstream_addr did not contain last address, the bug was introduced in r1659
Igor Sysoev <igor@sysoev.ru>
parents: 1706
diff changeset
1124
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1125 if (rc == NGX_BUSY) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1126 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
1127 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
1128 return;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1129 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1130
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
1131 if (rc == NGX_DECLINED) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1136 /* rc == NGX_OK || rc == NGX_AGAIN */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1137
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138 c = u->peer.connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 c->data = r;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1141
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1142 c->write->handler = ngx_http_upstream_handler;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1143 c->read->handler = ngx_http_upstream_handler;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1144
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1145 u->write_event_handler = ngx_http_upstream_send_request_handler;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1146 u->read_event_handler = ngx_http_upstream_process_header;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147
1397
6c25a49e548a upstream sendfile bit was overridden by r->connection->sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
1148 c->sendfile &= r->connection->sendfile;
1958
3e9e4581fbba fix peer sendfile capability
Igor Sysoev <igor@sysoev.ru>
parents: 1947
diff changeset
1149 u->output.sendfile = c->sendfile;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150
4116
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1151 if (c->pool == NULL) {
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1152
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1153 /* we need separate pool here to be able to cache SSL connections */
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1154
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1155 c->pool = ngx_create_pool(128, r->connection->log);
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1156 if (c->pool == NULL) {
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1157 ngx_http_upstream_finalize_request(r, u,
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1158 NGX_HTTP_INTERNAL_SERVER_ERROR);
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1159 return;
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1160 }
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1161 }
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1162
2847
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1163 c->log = r->connection->log;
4116
9baf12ea5ca1 Upstream: separate pool for peer connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4115
diff changeset
1164 c->pool->log = c->log;
2847
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1165 c->read->log = c->log;
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1166 c->write->log = c->log;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1168 /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1169
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1170 u->writer.out = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1171 u->writer.last = &u->writer.out;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1172 u->writer.connection = c;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1173 u->writer.limit = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1174
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1175 if (u->request_sent) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1176 if (ngx_http_upstream_reinit(r, u) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1177 ngx_http_upstream_finalize_request(r, u,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1178 NGX_HTTP_INTERNAL_SERVER_ERROR);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1179 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1180 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1181 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1182
1064
7c84c877f2d7 fix segfault when client_body_in_file_only is on, the body is not passed
Igor Sysoev <igor@sysoev.ru>
parents: 1063
diff changeset
1183 if (r->request_body
7c84c877f2d7 fix segfault when client_body_in_file_only is on, the body is not passed
Igor Sysoev <igor@sysoev.ru>
parents: 1063
diff changeset
1184 && r->request_body->buf
7c84c877f2d7 fix segfault when client_body_in_file_only is on, the body is not passed
Igor Sysoev <igor@sysoev.ru>
parents: 1063
diff changeset
1185 && r->request_body->temp_file
7c84c877f2d7 fix segfault when client_body_in_file_only is on, the body is not passed
Igor Sysoev <igor@sysoev.ru>
parents: 1063
diff changeset
1186 && r == r->main)
7c84c877f2d7 fix segfault when client_body_in_file_only is on, the body is not passed
Igor Sysoev <igor@sysoev.ru>
parents: 1063
diff changeset
1187 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1188 /*
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1189 * the r->request_body->buf can be reused for one request only,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1190 * the subrequests should allocate their own temporay bufs
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1191 */
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1192
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1193 u->output.free = ngx_alloc_chain_link(r->pool);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1194 if (u->output.free == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1195 ngx_http_upstream_finalize_request(r, u,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1196 NGX_HTTP_INTERNAL_SERVER_ERROR);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1197 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1198 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1199
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1200 u->output.free->buf = r->request_body->buf;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1201 u->output.free->next = NULL;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1202 u->output.allocated = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1203
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1204 r->request_body->buf->pos = r->request_body->buf->start;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1205 r->request_body->buf->last = r->request_body->buf->start;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1206 r->request_body->buf->tag = u->output.tag;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1207 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1208
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1209 u->request_sent = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1210
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1211 if (rc == NGX_AGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1212 ngx_add_timer(c->write, u->conf->connect_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1213 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1214 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1215
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1216 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1217
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
1218 if (u->ssl && c->ssl == NULL) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1219 ngx_http_upstream_ssl_init_connection(r, u, c);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1220 return;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1221 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1222
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1223 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1224
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1225 ngx_http_upstream_send_request(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1226 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1227
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1228
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1229 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1230
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1231 static void
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1232 ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1233 ngx_http_upstream_t *u, ngx_connection_t *c)
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1234 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
1235 ngx_int_t rc;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1236
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1237 if (ngx_ssl_create_connection(u->conf->ssl, c,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1238 NGX_SSL_BUFFER|NGX_SSL_CLIENT)
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2463
diff changeset
1239 != NGX_OK)
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1240 {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1241 ngx_http_upstream_finalize_request(r, u,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1242 NGX_HTTP_INTERNAL_SERVER_ERROR);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1243 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1244 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1245
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1246 c->sendfile = 0;
619
7a16e281c01f nginx-0.3.31-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 615
diff changeset
1247 u->output.sendfile = 0;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1248
2184
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1249 if (u->conf->ssl_session_reuse) {
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1250 if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1251 ngx_http_upstream_finalize_request(r, u,
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1252 NGX_HTTP_INTERNAL_SERVER_ERROR);
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1253 return;
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1254 }
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1255 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1256
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
1257 r->connection->log->action = "SSL handshaking to upstream";
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
1258
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1259 rc = ngx_ssl_handshake(c);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1260
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1261 if (rc == NGX_AGAIN) {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1262 c->ssl->handler = ngx_http_upstream_ssl_handshake;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1263 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1264 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1265
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1266 ngx_http_upstream_ssl_handshake(c);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1267 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1268
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1269
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1270 static void
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1271 ngx_http_upstream_ssl_handshake(ngx_connection_t *c)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1272 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1273 ngx_http_request_t *r;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1274 ngx_http_upstream_t *u;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1275
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1276 r = c->data;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1277 u = r->upstream;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1278
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1279 if (c->ssl->handshaked) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1280
2184
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1281 if (u->conf->ssl_session_reuse) {
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1282 u->peer.save_session(&u->peer, u->peer.data);
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1283 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
1284
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1285 c->write->handler = ngx_http_upstream_handler;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1286 c->read->handler = ngx_http_upstream_handler;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1287
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1288 ngx_http_upstream_send_request(r, u);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1289
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1290 return;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1291 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1292
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1293 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1294
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1295 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1296
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1297 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1298
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1299
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1300 static ngx_int_t
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1301 ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1302 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1303 ngx_chain_t *cl;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1304
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1305 if (u->reinit_request(r) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1306 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1307 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1308
4120
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
1309 u->keepalive = 0;
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
1310
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1311 ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
1312 u->headers_in.content_length_n = -1;
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1313
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1314 if (ngx_list_init(&u->headers_in.headers, r->pool, 8,
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1315 sizeof(ngx_table_elt_t))
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1316 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1317 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1318 return NGX_ERROR;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1319 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1320
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1321 /* reinit the request chain */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1322
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1323 for (cl = u->request_bufs; cl; cl = cl->next) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1324 cl->buf->pos = cl->buf->start;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1325 cl->buf->file_pos = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1326 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1327
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1328 /* reinit the subrequest's ngx_output_chain() context */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1329
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1330 if (r->request_body && r->request_body->temp_file
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
1331 && r != r->main && u->output.buf)
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1332 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1333 u->output.free = ngx_alloc_chain_link(r->pool);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1334 if (u->output.free == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1335 return NGX_ERROR;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1336 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1337
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1338 u->output.free->buf = u->output.buf;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1339 u->output.free->next = NULL;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1340
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1341 u->output.buf->pos = u->output.buf->start;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1342 u->output.buf->last = u->output.buf->start;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1343 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1344
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1345 u->output.buf = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1346 u->output.in = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1347 u->output.busy = NULL;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1348
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1349 /* reinit u->buffer */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1350
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1351 u->buffer.pos = u->buffer.start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1352
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1353 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1354
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1355 if (r->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1356 u->buffer.pos += r->cache->header_start;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1357 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1358
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1359 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1360
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1361 u->buffer.last = u->buffer.pos;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1362
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1363 return NGX_OK;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1364 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1365
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1366
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1367 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1368 ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1369 {
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1370 ngx_int_t rc;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1371 ngx_connection_t *c;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1372
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1373 c = u->peer.connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1374
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1375 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1376 "http upstream send request");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1377
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1378 if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1379 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1380 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1381 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1382
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1383 c->log->action = "sending request to upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1384
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1385 rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1386
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1387 u->request_sent = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1388
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1389 if (rc == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1390 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1391 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1392 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1393
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1394 if (c->write->timer_set) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1395 ngx_del_timer(c->write);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1396 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1397
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1398 if (rc == NGX_AGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1399 ngx_add_timer(c->write, u->conf->send_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1400
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1401 if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1402 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1403 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1404 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1405 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1406
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1407 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1408 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1409
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1410 /* rc == NGX_OK */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1411
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1412 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1413 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1414 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1415 ngx_tcp_push_n " failed");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1416 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1417 NGX_HTTP_INTERNAL_SERVER_ERROR);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1418 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1419 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1420
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1421 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1422 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1423
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1424 ngx_add_timer(c->read, u->conf->read_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1425
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1426 #if 1
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1427 if (c->read->ready) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1428
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1429 /* post aio operation */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1430
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1431 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1432 * TODO comment
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1433 * although we can post aio operation just in the end
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1434 * of ngx_http_upstream_connect() CHECK IT !!!
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1435 * it's better to do here because we postpone header buffer allocation
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1436 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1437
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1438 ngx_http_upstream_process_header(r, u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1439 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1440 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1441 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1442
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1443 u->write_event_handler = ngx_http_upstream_dummy_handler;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1444
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1445 if (ngx_handle_write_event(c->write, 0) != NGX_OK) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1446 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1447 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1448 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1449 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1450 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1451
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1452
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1453 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1454 ngx_http_upstream_send_request_handler(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1455 ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1456 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1457 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1458
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1459 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1460
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1461 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1462 "http upstream send request handler");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1463
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1464 if (c->write->timedout) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1465 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1466 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1467 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1468
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1469 #if (NGX_HTTP_SSL)
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1470
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
1471 if (u->ssl && c->ssl == NULL) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1472 ngx_http_upstream_ssl_init_connection(r, u, c);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1473 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1474 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1475
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1476 #endif
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1477
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1478 if (u->header_sent) {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1479 u->write_event_handler = ngx_http_upstream_dummy_handler;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1480
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1481 (void) ngx_handle_write_event(c->write, 0);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1482
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1483 return;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1484 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1485
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1486 ngx_http_upstream_send_request(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1487 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1488
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1489
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1490 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1491 ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1492 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1493 ssize_t n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1494 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1495 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1496
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1497 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1498
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1499 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1500 "http upstream process header");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1501
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1502 c->log->action = "reading response header from upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1503
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1504 if (c->read->timedout) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1505 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1506 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1507 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1508
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1509 if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1510 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1511 return;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1512 }
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1513
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1514 if (u->buffer.start == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1515 u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1516 if (u->buffer.start == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1517 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1518 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1519 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1520 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1521
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1522 u->buffer.pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1523 u->buffer.last = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1524 u->buffer.end = u->buffer.start + u->conf->buffer_size;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1525 u->buffer.temporary = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1526
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1527 u->buffer.tag = u->output.tag;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1528
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1529 if (ngx_list_init(&u->headers_in.headers, r->pool, 8,
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1530 sizeof(ngx_table_elt_t))
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1531 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1532 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1533 ngx_http_upstream_finalize_request(r, u,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1534 NGX_HTTP_INTERNAL_SERVER_ERROR);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1535 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1536 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1537
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1538 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1539
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1540 if (r->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1541 u->buffer.pos += r->cache->header_start;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1542 u->buffer.last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1543 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1544 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1545 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1546
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1547 for ( ;; ) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1548
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1549 n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1550
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1551 if (n == NGX_AGAIN) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1552 #if 0
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1553 ngx_add_timer(rev, u->read_timeout);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1554 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1555
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1556 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1557 ngx_http_upstream_finalize_request(r, u,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1558 NGX_HTTP_INTERNAL_SERVER_ERROR);
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1559 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1560 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1561
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1562 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1563 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1564
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1565 if (n == 0) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1566 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1567 "upstream prematurely closed connection");
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1568 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1569
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1570 if (n == NGX_ERROR || n == 0) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1571 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1572 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1573 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1574
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1575 u->buffer.last += n;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1576
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1577 #if 0
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1578 u->valid_header_in = 0;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1579
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1580 u->peer.cached = 0;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1581 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1582
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1583 rc = u->process_header(r);
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1584
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1585 if (rc == NGX_AGAIN) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1586
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1587 if (u->buffer.pos == u->buffer.end) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1588 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1589 "upstream sent too big header");
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1590
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1591 ngx_http_upstream_next(r, u,
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1592 NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1593 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1594 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1595
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1596 continue;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1597 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1598
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1599 break;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1600 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1601
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1602 if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1603 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1604 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1605 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1606
1699
976db8c6fb64 return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
1607 if (rc == NGX_ERROR) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1608 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1609 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1610 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1611 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1612
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1613 /* rc == NGX_OK */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1614
3401
9e7926763f87 allow to handle 301/302 in error_page
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
1615 if (u->headers_in.status_n > NGX_HTTP_SPECIAL_RESPONSE) {
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1616
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1617 if (r->subrequest_in_memory) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1618 u->buffer.last = u->buffer.pos;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1619 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1620
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1621 if (ngx_http_upstream_test_next(r, u) == NGX_OK) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1622 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1623 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1624
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1625 if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1626 return;
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1627 }
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1628 }
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1629
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1630 if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
1631 return;
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
1632 }
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
1633
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1634 if (!r->subrequest_in_memory) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1635 ngx_http_upstream_send_response(r, u);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1636 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1637 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1638
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1639 /* subrequest content in memory */
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1640
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1641 if (u->input_filter == NULL) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1642 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1643 u->input_filter = ngx_http_upstream_non_buffered_filter;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1644 u->input_filter_ctx = r;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1645 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1646
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1647 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1648 ngx_http_upstream_finalize_request(r, u,
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1649 NGX_HTTP_INTERNAL_SERVER_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1650 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1651 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1652
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1653 n = u->buffer.last - u->buffer.pos;
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1654
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1655 if (n) {
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1656 u->buffer.last -= n;
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1657
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1658 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1659
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1660 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1661 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1662 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1663 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1664
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1665 if (u->length == 0) {
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1666 ngx_http_upstream_finalize_request(r, u, 0);
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1667 return;
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1668 }
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1669 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1670
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1671 u->read_event_handler = ngx_http_upstream_process_body_in_memory;
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1672
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1673 ngx_http_upstream_process_body_in_memory(r, u);
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1674 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1675
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1676
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1677 static ngx_int_t
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1678 ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1679 {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1680 ngx_uint_t status;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1681 ngx_http_upstream_next_t *un;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1682
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1683 status = u->headers_in.status_n;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1684
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1685 for (un = ngx_http_upstream_next_errors; un->status; un++) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1686
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1687 if (status != un->status) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1688 continue;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1689 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1690
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1691 if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1692 ngx_http_upstream_next(r, u, un->mask);
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1693 return NGX_OK;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1694 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1695
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1696 #if (NGX_HTTP_CACHE)
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1697
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1698 if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1699 && (u->conf->cache_use_stale & un->mask))
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1700 {
2824
d106509491b5 fix building --without-http-cache
Igor Sysoev <igor@sysoev.ru>
parents: 2807
diff changeset
1701 ngx_int_t rc;
2805
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1702
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1703 rc = u->reinit_request(r);
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1704
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1705 if (rc == NGX_OK) {
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1706 u->cache_status = NGX_HTTP_CACHE_STALE;
2805
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1707 rc = ngx_http_upstream_cache_send(r, u);
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1708 }
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1709
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1710 ngx_http_upstream_finalize_request(r, u, rc);
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1711 return NGX_OK;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1712 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1713
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1714 #endif
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1715 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1716
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1717 return NGX_DECLINED;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1718 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1719
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1720
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1721 static ngx_int_t
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1722 ngx_http_upstream_intercept_errors(ngx_http_request_t *r,
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1723 ngx_http_upstream_t *u)
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1724 {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1725 ngx_int_t status;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1726 ngx_uint_t i;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1727 ngx_table_elt_t *h;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1728 ngx_http_err_page_t *err_page;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1729 ngx_http_core_loc_conf_t *clcf;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1730
2441
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1731 status = u->headers_in.status_n;
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1732
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1733 if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1734 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1735 return NGX_OK;
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1736 }
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1737
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1738 if (!u->conf->intercept_errors) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1739 return NGX_DECLINED;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1740 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1741
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1742 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1743
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1744 if (clcf->error_pages == NULL) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1745 return NGX_DECLINED;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1746 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1747
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1748 err_page = clcf->error_pages->elts;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1749 for (i = 0; i < clcf->error_pages->nelts; i++) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1750
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1751 if (err_page[i].status == status) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1752
2953
aa12525236da fix segfault if there is error_page 401, proxy_intercept_errors is on
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
1753 if (status == NGX_HTTP_UNAUTHORIZED
aa12525236da fix segfault if there is error_page 401, proxy_intercept_errors is on
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
1754 && u->headers_in.www_authenticate)
aa12525236da fix segfault if there is error_page 401, proxy_intercept_errors is on
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
1755 {
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1756 h = ngx_list_push(&r->headers_out.headers);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1757
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1758 if (h == NULL) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1759 ngx_http_upstream_finalize_request(r, u,
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1760 NGX_HTTP_INTERNAL_SERVER_ERROR);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1761 return NGX_OK;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1762 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1763
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1764 *h = *u->headers_in.www_authenticate;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1765
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1766 r->headers_out.www_authenticate = h;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1767 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1768
3706
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1769 #if (NGX_HTTP_CACHE)
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1770
3709
64777690c697 fix r3707: cache node should be freed be a response is not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3708
diff changeset
1771 if (r->cache) {
3706
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1772 time_t valid;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1773
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1774 valid = ngx_http_file_cache_valid(u->conf->cache_valid, status);
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1775
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1776 if (valid) {
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1777 r->cache->valid_sec = ngx_time() + valid;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1778 r->cache->error = status;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1779 }
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1780
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
1781 ngx_http_file_cache_free(r->cache, u->pipe->temp_file);
3706
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1782 }
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1783 #endif
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1784 ngx_http_upstream_finalize_request(r, u, status);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1785
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1786 return NGX_OK;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1787 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1788 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1789
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1790 return NGX_DECLINED;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1791 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1792
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1793
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1794 static ngx_int_t
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1795 ngx_http_upstream_test_connect(ngx_connection_t *c)
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1796 {
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1797 int err;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1798 socklen_t len;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1799
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1800 #if (NGX_HAVE_KQUEUE)
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1801
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1802 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1803 if (c->write->pending_eof) {
1469
0a269c464eaf connection error should be logged with "connecting to upstream" action,
Igor Sysoev <igor@sysoev.ru>
parents: 1468
diff changeset
1804 c->log->action = "connecting to upstream";
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1805 (void) ngx_connection_error(c, c->write->kq_errno,
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1806 "kevent() reported that connect() failed");
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1807 return NGX_ERROR;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1808 }
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1809
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1810 } else
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1811 #endif
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1812 {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1813 err = 0;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1814 len = sizeof(int);
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1815
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1816 /*
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1817 * BSDs and Linux return 0 and set a pending error in err
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1818 * Solaris returns -1 and sets errno
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1819 */
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1820
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1821 if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1822 == -1)
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1823 {
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1824 err = ngx_errno;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1825 }
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1826
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1827 if (err) {
1469
0a269c464eaf connection error should be logged with "connecting to upstream" action,
Igor Sysoev <igor@sysoev.ru>
parents: 1468
diff changeset
1828 c->log->action = "connecting to upstream";
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1829 (void) ngx_connection_error(c, err, "connect() failed");
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1830 return NGX_ERROR;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1831 }
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1832 }
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1833
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1834 return NGX_OK;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1835 }
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1836
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1837
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1838 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1839 ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1840 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1841 ngx_str_t *uri, args;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1842 ngx_uint_t i, flags;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1843 ngx_list_part_t *part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1844 ngx_table_elt_t *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1845 ngx_http_upstream_header_t *hh;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1846 ngx_http_upstream_main_conf_t *umcf;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1847
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1848 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1849
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
1850 if (u->headers_in.x_accel_redirect
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
1851 && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
1852 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1853 ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1854
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1855 part = &u->headers_in.headers.part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1856 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1857
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1858 for (i = 0; /* void */; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1859
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1860 if (i >= part->nelts) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1861 if (part->next == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1862 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1863 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1864
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1865 part = part->next;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1866 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1867 i = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1868 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1869
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1870 hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1871 h[i].lowcase_key, h[i].key.len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1872
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1873 if (hh && hh->redirect) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1874 if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1875 ngx_http_finalize_request(r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1876 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1877 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1878 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1879 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1880 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1881
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1882 uri = &u->headers_in.x_accel_redirect->value;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3515
diff changeset
1883 ngx_str_null(&args);
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3120
diff changeset
1884 flags = NGX_HTTP_LOG_UNSAFE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1885
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1886 if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1887 ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1888 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1889 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1890
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1891 if (r->method != NGX_HTTP_HEAD) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1892 r->method = NGX_HTTP_GET;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1893 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1894
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1895 r->valid_unparsed_uri = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1896
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1897 ngx_http_internal_redirect(r, uri, &args);
3120
40b8b398dbbc fix request counter for X-Accel-Redirect, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3112
diff changeset
1898 ngx_http_finalize_request(r, NGX_DONE);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1899 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1900 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1901
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1902 part = &u->headers_in.headers.part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1903 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1904
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1905 for (i = 0; /* void */; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1906
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1907 if (i >= part->nelts) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1908 if (part->next == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1909 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1910 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1911
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1912 part = part->next;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1913 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1914 i = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1915 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1916
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1917 if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1918 h[i].lowcase_key, h[i].key.len))
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1919 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1920 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1921 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1922
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1923 hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1924 h[i].lowcase_key, h[i].key.len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1925
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1926 if (hh) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1927 if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1928 ngx_http_upstream_finalize_request(r, u,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1929 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1930 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1931 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1932
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1933 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1934 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1935
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1936 if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1937 ngx_http_upstream_finalize_request(r, u,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1938 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1939 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1940 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1941 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1942
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1943 if (r->headers_out.server && r->headers_out.server->value.data == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1944 r->headers_out.server->hash = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1945 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1946
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1947 if (r->headers_out.date && r->headers_out.date->value.data == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1948 r->headers_out.date->hash = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1949 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1950
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1951 r->headers_out.status = u->headers_in.status_n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1952 r->headers_out.status_line = u->headers_in.status_line;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1953
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
1954 r->headers_out.content_length_n = u->headers_in.content_length_n;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
1955
4118
dbddec65fdab Upstream: r->upstream->length type change to off_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4117
diff changeset
1956 u->length = u->headers_in.content_length_n;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1957
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1958 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1959 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1960
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1961
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1962 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1963 ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1964 ngx_http_upstream_t *u)
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1965 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1966 size_t size;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1967 ssize_t n;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1968 ngx_buf_t *b;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1969 ngx_event_t *rev;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1970 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1971
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1972 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1973 rev = c->read;
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1974
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1975 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1976 "http upstream process body on memory");
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1977
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1978 if (rev->timedout) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1979 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1980 ngx_http_upstream_finalize_request(r, u, NGX_ETIMEDOUT);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1981 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1982 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1983
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1984 b = &u->buffer;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1985
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1986 for ( ;; ) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1987
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1988 size = b->end - b->last;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1989
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1990 if (size == 0) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1991 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
3708
c1385a3b8093 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3706
diff changeset
1992 "upstream buffer is too small to read response");
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1993 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1994 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1995 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1996
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1997 n = c->recv(c, b->last, size);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1998
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1999 if (n == NGX_AGAIN) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2000 break;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2001 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2002
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2003 if (n == 0 || n == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2004 ngx_http_upstream_finalize_request(r, u, n);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2005 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2006 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2007
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2008 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2009
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2010 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2011 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2012 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2013 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2014
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2015 if (!rev->ready) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2016 break;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2017 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2018 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2019
4120
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2020 if (u->length == 0) {
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2021 ngx_http_upstream_finalize_request(r, u, 0);
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2022 return;
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2023 }
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2024
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2025 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2026 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2027 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2028 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2029
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2030 if (rev->active) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2031 ngx_add_timer(rev, u->conf->read_timeout);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2032
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2033 } else if (rev->timer_set) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2034 ngx_del_timer(rev);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2035 }
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2036 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2037
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2038
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2039 static void
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2040 ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2041 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2042 int tcp_nodelay;
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2043 ssize_t n;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2044 ngx_int_t rc;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2045 ngx_event_pipe_t *p;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2046 ngx_connection_t *c;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2047 ngx_http_core_loc_conf_t *clcf;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2048
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2049 rc = ngx_http_send_header(r);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2050
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2051 if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 483
diff changeset
2052 ngx_http_upstream_finalize_request(r, u, rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2053 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2054 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2055
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2056 c = r->connection;
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2057
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2058 if (r->header_only) {
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2059
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2060 if (u->cacheable || u->store) {
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2061
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2062 if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2063 ngx_connection_error(c, ngx_socket_errno,
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2064 ngx_shutdown_socket_n " failed");
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2065 }
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2066
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2067 r->read_event_handler = ngx_http_request_empty_handler;
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2068 r->write_event_handler = ngx_http_request_empty_handler;
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2069 c->error = 1;
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2070
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2071 } else {
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2072 ngx_http_upstream_finalize_request(r, u, rc);
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2073 return;
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2074 }
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2075 }
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2076
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2077 u->header_sent = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2078
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
2079 if (r->request_body && r->request_body->temp_file) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2080 ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2081 r->request_body->temp_file->file.fd = NGX_INVALID_FILE;
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2082 }
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2083
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2084 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2085
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
2086 if (!u->buffering) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2087
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2088 if (u->input_filter == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2089 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2090 u->input_filter = ngx_http_upstream_non_buffered_filter;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2091 u->input_filter_ctx = r;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2092 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2093
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2094 u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2095 r->write_event_handler =
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2096 ngx_http_upstream_process_non_buffered_downstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2097
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2098 r->limit_rate = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2099
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2100 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2101 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2102 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2103 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2104
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2105 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2106 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2107
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2108 tcp_nodelay = 1;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2109
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2110 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2111 (const void *) &tcp_nodelay, sizeof(int)) == -1)
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2112 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2113 ngx_connection_error(c, ngx_socket_errno,
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2114 "setsockopt(TCP_NODELAY) failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2115 ngx_http_upstream_finalize_request(r, u, 0);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2116 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2117 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2118
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2119 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2120 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2121
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2122 n = u->buffer.last - u->buffer.pos;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2123
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2124 if (n) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2125 u->buffer.last = u->buffer.pos;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2126
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2127 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2128
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2129 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2130 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2131 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2132 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2133
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2134 ngx_http_upstream_process_non_buffered_downstream(r);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2135
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2136 } else {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2137 u->buffer.pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2138 u->buffer.last = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2139
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2140 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2141 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2142 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2143 }
1468
491e5059ea19 read EOF of header only responses in non-buffered proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1397
diff changeset
2144
4120
42135dd1f0ea Upstream: keepalive flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4119
diff changeset
2145 if (u->peer.connection->read->ready || u->length == 0) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2146 ngx_http_upstream_process_non_buffered_upstream(r, u);
1468
491e5059ea19 read EOF of header only responses in non-buffered proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1397
diff changeset
2147 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2148 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2149
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2150 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2151 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2152
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2153 /* TODO: preallocate event_pipe bufs, look "Content-Length" */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2154
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2155 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2156
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2157 if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2158 ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2159 r->cache->file.fd = NGX_INVALID_FILE;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2160 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2161
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2162 switch (ngx_http_test_predicates(r, u->conf->no_cache)) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2163
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2164 case NGX_ERROR:
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2165 ngx_http_upstream_finalize_request(r, u, 0);
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2166 return;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2167
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2168 case NGX_DECLINED:
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2169 u->cacheable = 0;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2170 break;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2171
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2172 default: /* NGX_OK */
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2173
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2174 if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2175
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2176 r->cache->min_uses = u->conf->cache_min_uses;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2177 r->cache->body_start = u->conf->buffer_size;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2178 r->cache->file_cache = u->conf->cache->data;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2179
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2180 if (ngx_http_file_cache_create(r) != NGX_OK) {
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2181 ngx_http_upstream_finalize_request(r, u, 0);
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2182 return;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2183 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2184
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2185 u->cacheable = 1;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2186 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2187
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2188 break;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2189 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2190
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2191 if (u->cacheable) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2192 time_t now, valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2193
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2194 now = ngx_time();
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2195
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2196 valid = r->cache->valid_sec;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2197
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2198 if (valid == 0) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2199 valid = ngx_http_file_cache_valid(u->conf->cache_valid,
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2200 u->headers_in.status_n);
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2201 if (valid) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2202 r->cache->valid_sec = now + valid;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2203 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2204 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2205
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2206 if (valid) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2207 r->cache->last_modified = r->headers_out.last_modified_time;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2208 r->cache->date = now;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2209 r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2210
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2211 ngx_http_file_cache_set_header(r, u->buffer.start);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2212
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2213 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2214 u->cacheable = 0;
2703
3b6afa999c2f support 304 for cacheable responses
Igor Sysoev <igor@sysoev.ru>
parents: 2701
diff changeset
2215 r->headers_out.last_modified_time = -1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2216 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2217 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2218
2690
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2219 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2220 "http cacheable: %d", u->cacheable);
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2221
3083
ffe8bfb38184 clean cache updating state if a response has uncacheable code or
Igor Sysoev <igor@sysoev.ru>
parents: 3056
diff changeset
2222 if (u->cacheable == 0 && r->cache) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
2223 ngx_http_file_cache_free(r->cache, u->pipe->temp_file);
3083
ffe8bfb38184 clean cache updating state if a response has uncacheable code or
Igor Sysoev <igor@sysoev.ru>
parents: 3056
diff changeset
2224 }
ffe8bfb38184 clean cache updating state if a response has uncacheable code or
Igor Sysoev <igor@sysoev.ru>
parents: 3056
diff changeset
2225
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2226 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2227
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2228 p = u->pipe;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2229
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2230 p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2231 p->output_ctx = r;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2232 p->tag = u->output.tag;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2233 p->bufs = u->conf->bufs;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2234 p->busy_size = u->conf->busy_buffers_size;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2235 p->upstream = u->peer.connection;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2236 p->downstream = c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2237 p->pool = r->pool;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2238 p->log = c->log;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2239
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2240 p->cacheable = u->cacheable || u->store;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2241
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2242 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2243 if (p->temp_file == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2244 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2245 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2246 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2247
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2248 p->temp_file->file.fd = NGX_INVALID_FILE;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2249 p->temp_file->file.log = c->log;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2250 p->temp_file->path = u->conf->temp_path;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2251 p->temp_file->pool = r->pool;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2252
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2253 if (p->cacheable) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2254 p->temp_file->persistent = 1;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2255
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2256 } else {
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
2257 p->temp_file->log_level = NGX_LOG_WARN;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2258 p->temp_file->warn = "an upstream response is buffered "
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2259 "to a temporary file";
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2260 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2261
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2262 p->max_temp_file_size = u->conf->max_temp_file_size;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2263 p->temp_file_write_size = u->conf->temp_file_write_size;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2264
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2265 p->preread_bufs = ngx_alloc_chain_link(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2266 if (p->preread_bufs == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2267 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2268 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2269 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2270
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2271 p->preread_bufs->buf = &u->buffer;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2272 p->preread_bufs->next = NULL;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2273 u->buffer.recycled = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2274
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2275 p->preread_size = u->buffer.last - u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2276
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2277 if (u->cacheable) {
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2278
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2279 p->buf_to_file = ngx_calloc_buf(r->pool);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2280 if (p->buf_to_file == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2281 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2282 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2283 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2284
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2285 p->buf_to_file->pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2286 p->buf_to_file->last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2287 p->buf_to_file->temporary = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2288 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2289
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2290 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2291 /* the posted aio operation may currupt a shadow buffer */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2292 p->single_buf = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2293 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2294
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2295 /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2296 p->free_bufs = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2297
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2298 /*
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2299 * event_pipe would do u->buffer.last += p->preread_size
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2300 * as though these bytes were read
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2301 */
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2302 u->buffer.last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2303
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2304 if (u->conf->cyclic_temp_file) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2305
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2306 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2307 * we need to disable the use of sendfile() if we use cyclic temp file
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2308 * because the writing a new data may interfere with sendfile()
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2309 * that uses the same kernel file pages (at least on FreeBSD)
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2310 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2311
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2312 p->cyclic_temp_file = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2313 c->sendfile = 0;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2314
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2315 } else {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2316 p->cyclic_temp_file = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2317 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2318
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2319 p->read_timeout = u->conf->read_timeout;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2320 p->send_timeout = clcf->send_timeout;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2321 p->send_lowat = clcf->send_lowat;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2322
4119
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2323 p->length = -1;
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2324
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2325 if (u->input_filter_init
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2326 && u->input_filter_init(p->input_ctx) != NGX_OK)
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2327 {
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2328 ngx_http_upstream_finalize_request(r, u, 0);
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2329 return;
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2330 }
b66712cde67d Upstream: pipe length and input_filter_init in buffered mode.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
2331
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2332 u->read_event_handler = ngx_http_upstream_process_upstream;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2333 r->write_event_handler = ngx_http_upstream_process_downstream;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2334
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2335 ngx_http_upstream_process_upstream(r, u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2336 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2337
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2338
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2339 static void
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2340 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2341 {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2342 ngx_event_t *wev;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2343 ngx_connection_t *c;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2344 ngx_http_upstream_t *u;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2345
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2346 c = r->connection;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2347 u = r->upstream;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2348 wev = c->write;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2349
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2350 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2351 "http upstream process non buffered downstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2352
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2353 c->log->action = "sending to client";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2354
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2355 if (wev->timedout) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2356 c->timedout = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2357 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
3963
10fbb8f02a45 finalizing with rc == 0 in unbuffered proxy mode caused nginx to wait
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
2358 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2359 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2360 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2361
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2362 ngx_http_upstream_process_non_buffered_request(r, 1);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2363 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2364
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2365
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2366 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2367 ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2368 ngx_http_upstream_t *u)
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2369 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2370 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2371
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2372 c = u->peer.connection;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2373
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2374 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2375 "http upstream process non buffered upstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2376
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2377 c->log->action = "reading upstream";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2378
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2379 if (c->read->timedout) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2380 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2381 ngx_http_upstream_finalize_request(r, u, 0);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2382 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2383 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2384
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2385 ngx_http_upstream_process_non_buffered_request(r, 0);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2386 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2387
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2388
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2389 static void
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2390 ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2391 ngx_uint_t do_write)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2392 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2393 size_t size;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2394 ssize_t n;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2395 ngx_buf_t *b;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2396 ngx_int_t rc;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2397 ngx_connection_t *downstream, *upstream;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2398 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2399 ngx_http_core_loc_conf_t *clcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2400
756
d904b5cb3bba fix building introduced by previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 755
diff changeset
2401 u = r->upstream;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2402 downstream = r->connection;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2403 upstream = u->peer.connection;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2404
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2405 b = &u->buffer;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2406
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2407 do_write = do_write || u->length == 0;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2408
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2409 for ( ;; ) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2410
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2411 if (do_write) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2412
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2413 if (u->out_bufs || u->busy_bufs) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2414 rc = ngx_http_output_filter(r, u->out_bufs);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2415
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2416 if (rc == NGX_ERROR) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2417 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2418 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2419 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2420
4114
5db098f97e0e API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3976
diff changeset
2421 ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2422 &u->out_bufs, u->output.tag);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2423 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2424
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2425 if (u->busy_bufs == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2426
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2427 if (u->length == 0
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2428 || upstream->read->eof
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2429 || upstream->read->error)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2430 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2431 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2432 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2433 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2434
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2435 b->pos = b->start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2436 b->last = b->start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2437 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2438 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2439
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2440 size = b->end - b->last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2441
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2442 if (size && upstream->read->ready) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2443
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2444 n = upstream->recv(upstream, b->last, size);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2445
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2446 if (n == NGX_AGAIN) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2447 break;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2448 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2449
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2450 if (n > 0) {
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2451 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2452
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2453 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2454 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2455 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2456 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2457 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2458
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2459 do_write = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2460
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2461 continue;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2462 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2463
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2464 break;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2465 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2466
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2467 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2468
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2469 if (downstream->data == r) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2470 if (ngx_handle_write_event(downstream->write, clcf->send_lowat)
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
2471 != NGX_OK)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2472 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2473 ngx_http_upstream_finalize_request(r, u, 0);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2474 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2475 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2476 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2477
1063
e2a6ecc5a3ae a non-active client connection must not closed after send timeout
Igor Sysoev <igor@sysoev.ru>
parents: 1031
diff changeset
2478 if (downstream->write->active && !downstream->write->ready) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2479 ngx_add_timer(downstream->write, clcf->send_timeout);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2480
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2481 } else if (downstream->write->timer_set) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2482 ngx_del_timer(downstream->write);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2483 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2484
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
2485 if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2486 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2487 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2488 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2489
1063
e2a6ecc5a3ae a non-active client connection must not closed after send timeout
Igor Sysoev <igor@sysoev.ru>
parents: 1031
diff changeset
2490 if (upstream->read->active && !upstream->read->ready) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2491 ngx_add_timer(upstream->read, u->conf->read_timeout);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2492
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2493 } else if (upstream->read->timer_set) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2494 ngx_del_timer(upstream->read);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2495 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2496 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2497
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2498
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2499 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2500 ngx_http_upstream_non_buffered_filter_init(void *data)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2501 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2502 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2503 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2504
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2505
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2506 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2507 ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2508 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2509 ngx_http_request_t *r = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2510
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2511 ngx_buf_t *b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2512 ngx_chain_t *cl, **ll;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2513 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2514
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2515 u = r->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2516
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2517 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2518 ll = &cl->next;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2519 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2520
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2521 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2522 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2523 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2524 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2525
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2526 *ll = cl;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2527
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2528 cl->buf->flush = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2529 cl->buf->memory = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2530
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2531 b = &u->buffer;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2532
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2533 cl->buf->pos = b->last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2534 b->last += bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2535 cl->buf->last = b->last;
1908
f2953601ed3c fix memory leak in long-lived non buffered connections
Igor Sysoev <igor@sysoev.ru>
parents: 1902
diff changeset
2536 cl->buf->tag = u->output.tag;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2537
4118
dbddec65fdab Upstream: r->upstream->length type change to off_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4117
diff changeset
2538 if (u->length == -1) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2539 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2540 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2541
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2542 u->length -= bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2543
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2544 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2545 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2546
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2547
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2548 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2549 ngx_http_upstream_process_downstream(ngx_http_request_t *r)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2550 {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2551 ngx_event_t *wev;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2552 ngx_connection_t *c;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2553 ngx_event_pipe_t *p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2554 ngx_http_upstream_t *u;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2555
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2556 c = r->connection;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2557 u = r->upstream;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2558 p = u->pipe;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2559 wev = c->write;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2560
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2561 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2562 "http upstream process downstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2563
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2564 c->log->action = "sending to client";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2565
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2566 if (wev->timedout) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2567
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2568 if (wev->delayed) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2569
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2570 wev->timedout = 0;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2571 wev->delayed = 0;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2572
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2573 if (!wev->ready) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2574 ngx_add_timer(wev, p->send_timeout);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2575
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2576 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2577 ngx_http_upstream_finalize_request(r, u, 0);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2578 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2579
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2580 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2581 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2582
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2583 if (ngx_event_pipe(p, wev->write) == NGX_ABORT) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2584 ngx_http_upstream_finalize_request(r, u, 0);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2585 return;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2586 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2587
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2588 } else {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2589 p->downstream_error = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2590 c->timedout = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2591 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2592 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2593
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2594 } else {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2595
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2596 if (wev->delayed) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2597
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2598 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2599 "http downstream delayed");
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2600
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2601 if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
2602 ngx_http_upstream_finalize_request(r, u, 0);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2603 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2604
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2605 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2606 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2607
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2608 if (ngx_event_pipe(p, 1) == NGX_ABORT) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2609 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2610 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2611 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2612 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2613
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2614 ngx_http_upstream_process_request(r);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2615 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2616
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2617
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2618 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2619 ngx_http_upstream_process_upstream(ngx_http_request_t *r,
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2620 ngx_http_upstream_t *u)
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2621 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2622 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2623
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2624 c = u->peer.connection;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2625
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2626 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2627 "http upstream process upstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2628
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2629 c->log->action = "reading upstream";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2630
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2631 if (c->read->timedout) {
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2632 u->pipe->upstream_error = 1;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2633 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2634
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2635 } else {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2636 if (ngx_event_pipe(u->pipe, 0) == NGX_ABORT) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2637 ngx_http_upstream_finalize_request(r, u, 0);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2638 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2639 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2640 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2641
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2642 ngx_http_upstream_process_request(r);
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2643 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2644
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2645
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2646 static void
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2647 ngx_http_upstream_process_request(ngx_http_request_t *r)
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2648 {
2445
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2649 ngx_uint_t del;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2650 ngx_temp_file_t *tf;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2651 ngx_event_pipe_t *p;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2652 ngx_http_upstream_t *u;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2653
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2654 u = r->upstream;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2655 p = u->pipe;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2656
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2657 if (u->peer.connection) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2658
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2659 if (u->store) {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2660
2445
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2661 del = p->upstream_error;
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2662
1885
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2663 tf = u->pipe->temp_file;
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2664
2463
4bc8ea10d62b fix fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 2445
diff changeset
2665 if (p->upstream_eof || p->upstream_done) {
2445
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2666
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2667 if (u->headers_in.status_n == NGX_HTTP_OK
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2668 && (u->headers_in.content_length_n == -1
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2669 || (u->headers_in.content_length_n == tf->offset)))
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2670 {
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2671 ngx_http_upstream_store(r, u);
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2672
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2673 } else {
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2674 del = 1;
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2675 }
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2676 }
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2677
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2678 if (del && tf->file.fd != NGX_INVALID_FILE) {
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2679
1885
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2680 if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2681
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2682 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2683 ngx_delete_file_n " \"%s\" failed",
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2684 u->pipe->temp_file->file.name.data);
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2685 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2686 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2687 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2688
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2689 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2690
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2691 if (u->cacheable) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2692
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2693 if (p->upstream_done) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2694 ngx_http_file_cache_update(r, u->pipe->temp_file);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2695
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2696 } else if (p->upstream_eof) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2697
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2698 /* TODO: check length & update cache */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2699
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2700 ngx_http_file_cache_update(r, u->pipe->temp_file);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2701
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2702 } else if (p->upstream_error) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
2703 ngx_http_file_cache_free(r->cache, u->pipe->temp_file);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2704 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2705 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2706
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2707 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2708
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2709 if (p->upstream_done || p->upstream_eof || p->upstream_error) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2710 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2711 "http upstream exit: %p", p->out);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2712 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2713 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2714 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2715 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2716 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2717 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2718 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2719
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2720 if (p->downstream_error) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2721 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2722 "http upstream downstream error");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2723
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
2724 if (!u->cacheable && !u->store && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2725 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2726 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2727 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2728 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2729
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2730
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2731 static void
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2732 ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2733 {
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2734 size_t root;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2735 time_t lm;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2736 ngx_str_t path;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2737 ngx_temp_file_t *tf;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2738 ngx_ext_rename_file_t ext;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2739
1777
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2740 tf = u->pipe->temp_file;
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2741
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2742 if (tf->file.fd == NGX_INVALID_FILE) {
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2743
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2744 /* create file for empty 200 response */
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2745
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2746 tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2747 if (tf == NULL) {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2748 return;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2749 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2750
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2751 tf->file.fd = NGX_INVALID_FILE;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2752 tf->file.log = r->connection->log;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2753 tf->path = u->conf->temp_path;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2754 tf->pool = r->pool;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2755 tf->persistent = 1;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2756
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2757 if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2758 tf->persistent, tf->clean, tf->access)
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2759 != NGX_OK)
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2760 {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2761 return;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2762 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2763
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2764 u->pipe->temp_file = tf;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2765 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2766
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2767 ext.access = u->conf->store_access;
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2386
diff changeset
2768 ext.path_access = u->conf->store_access;
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2769 ext.time = -1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2770 ext.create_path = 1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2771 ext.delete_file = 1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2772 ext.log = r->connection->log;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2773
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2774 if (u->headers_in.last_modified) {
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2775
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2776 lm = ngx_http_parse_time(u->headers_in.last_modified->value.data,
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2777 u->headers_in.last_modified->value.len);
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2778
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2779 if (lm != NGX_ERROR) {
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2780 ext.time = lm;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2781 ext.fd = tf->file.fd;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2782 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2783 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2784
1295
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2785 if (u->conf->store_lengths == NULL) {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2786
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2787 ngx_http_map_uri_to_path(r, &path, &root, 0);
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2788
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2789 } else {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2790 if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2791 u->conf->store_values->elts)
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2792 == NULL)
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2793 {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2794 return;
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2795 }
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2796 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2797
3032
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
2798 path.len--;
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
2799
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2800 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2801 "upstream stores \"%s\" to \"%s\"",
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2802 tf->file.name.data, path.data);
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2803
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2804 (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2805 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2806
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2807
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2808 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2809 ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2810 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2811 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2812 "http upstream dummy handler");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2813 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2814
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2815
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2816 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2817 ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2818 ngx_uint_t ft_type)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2819 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2820 ngx_uint_t status, state;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2821
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2822 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2823 "http next upstream, %xi", ft_type);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2824
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2825 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2826 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2827 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2828
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2829 if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2830 state = NGX_PEER_NEXT;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2831 } else {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2832 state = NGX_PEER_FAILED;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2833 }
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2834
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2835 if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2836 u->peer.free(&u->peer, u->peer.data, state);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2837 }
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2838
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2839 if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2840 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2841 "upstream timed out");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2842 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2843
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2844 if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2845 status = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2846
4115
70a45a504905 Workaround for cpu hog on errors with cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4114
diff changeset
2847 /* TODO: inform balancer instead */
70a45a504905 Workaround for cpu hog on errors with cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4114
diff changeset
2848
70a45a504905 Workaround for cpu hog on errors with cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4114
diff changeset
2849 u->peer.tries++;
70a45a504905 Workaround for cpu hog on errors with cached connections.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4114
diff changeset
2850
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2851 } else {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2852 switch(ft_type) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2853
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2854 case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2855 status = NGX_HTTP_GATEWAY_TIME_OUT;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2856 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2857
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2858 case NGX_HTTP_UPSTREAM_FT_HTTP_500:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2859 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2860 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2861
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2862 case NGX_HTTP_UPSTREAM_FT_HTTP_404:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2863 status = NGX_HTTP_NOT_FOUND;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2864 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2865
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2866 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2867 * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2868 * never reach here
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2869 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2870
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2871 default:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2872 status = NGX_HTTP_BAD_GATEWAY;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2873 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2874 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2875
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2876 if (r->connection->error) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2877 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2878 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2879 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2880 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2881
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2882 if (status) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2883 u->state->status = status;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2884
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2885 if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2886
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2887 #if (NGX_HTTP_CACHE)
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2888
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2889 if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2890 && (u->conf->cache_use_stale & ft_type))
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2891 {
2805
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2892 ngx_int_t rc;
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2893
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2894 rc = u->reinit_request(r);
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2895
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2896 if (rc == NGX_OK) {
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2897 u->cache_status = NGX_HTTP_CACHE_STALE;
2805
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2898 rc = ngx_http_upstream_cache_send(r, u);
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2899 }
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2900
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2901 ngx_http_upstream_finalize_request(r, u, rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2902 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2903 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2904 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2905
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2906 ngx_http_upstream_finalize_request(r, u, status);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2907 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2908 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2909 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2910
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2911 if (u->peer.connection) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2912 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2913 "close http upstream connection: %d",
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2914 u->peer.connection->fd);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2915 #if (NGX_HTTP_SSL)
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2916
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2917 if (u->peer.connection->ssl) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2918 u->peer.connection->ssl->no_wait_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2919 u->peer.connection->ssl->no_send_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2920
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2921 (void) ngx_ssl_shutdown(u->peer.connection);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2922 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2923 #endif
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2924
4138
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
2925 if (u->peer.connection->pool) {
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
2926 ngx_destroy_pool(u->peer.connection->pool);
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
2927 }
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
2928
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2929 ngx_close_connection(u->peer.connection);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2930 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2931
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2932 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2933 if (u->conf->busy_lock && !u->busy_locked) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2934 ngx_http_upstream_busy_lock(p);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2935 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2936 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2937 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2938
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2939 ngx_http_upstream_connect(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2940 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2941
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2942
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2943 static void
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2944 ngx_http_upstream_cleanup(void *data)
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2945 {
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2946 ngx_http_request_t *r = data;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2947
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2948 ngx_http_upstream_t *u;
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2949
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2950 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2951 "cleanup http upstream request: \"%V\"", &r->uri);
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2952
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2953 u = r->upstream;
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2954
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2955 if (u->resolved && u->resolved->ctx) {
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2956 ngx_resolve_name_done(u->resolved->ctx);
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2957 u->resolved->ctx = NULL;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2958 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2959
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2960 ngx_http_upstream_finalize_request(r, u, NGX_DONE);
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2961 }
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2962
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2963
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2964 static void
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2965 ngx_http_upstream_finalize_request(ngx_http_request_t *r,
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2966 ngx_http_upstream_t *u, ngx_int_t rc)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2967 {
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
2968 ngx_time_t *tp;
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2969
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2970 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2971 "finalize http upstream request: %i", rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2972
2413
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2973 if (u->cleanup) {
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2974 *u->cleanup = NULL;
3418
a076e1823737 delete u->cleanup mark, this fixes large values in $upstream_response_time,
Igor Sysoev <igor@sysoev.ru>
parents: 3401
diff changeset
2975 u->cleanup = NULL;
2413
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2976 }
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2977
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2978 if (u->resolved && u->resolved->ctx) {
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2979 ngx_resolve_name_done(u->resolved->ctx);
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2980 u->resolved->ctx = NULL;
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2981 }
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2982
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2983 if (u->state && u->state->response_sec) {
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2984 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
2985 u->state->response_sec = tp->sec - u->state->response_sec;
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
2986 u->state->response_msec = tp->msec - u->state->response_msec;
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2987
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2988 if (u->pipe) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2989 u->state->response_length = u->pipe->read_length;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2990 }
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2991 }
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2992
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2993 u->finalize_request(r, rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2994
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2995 if (u->peer.free) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2996 u->peer.free(&u->peer, u->peer.data, 0);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2997 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2998
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2999 if (u->peer.connection) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3000
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3001 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3002
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3003 /* TODO: do not shutdown persistent connection */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3004
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3005 if (u->peer.connection->ssl) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3006
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3007 /*
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3008 * We send the "close notify" shutdown alert to the upstream only
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3009 * and do not wait its "close notify" shutdown alert.
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3010 * It is acceptable according to the TLS standard.
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3011 */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3012
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3013 u->peer.connection->ssl->no_wait_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3014
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3015 (void) ngx_ssl_shutdown(u->peer.connection);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3016 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3017 #endif
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3018
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3019 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3020 "close http upstream connection: %d",
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3021 u->peer.connection->fd);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3022
4138
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
3023 if (u->peer.connection->pool) {
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
3024 ngx_destroy_pool(u->peer.connection->pool);
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
3025 }
70e1ee2307f9 Fix of separate pool for upstream connections (r4117).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4124
diff changeset
3026
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3027 ngx_close_connection(u->peer.connection);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3028 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3029
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3030 u->peer.connection = NULL;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3031
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
3032 if (u->pipe && u->pipe->temp_file) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3033 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3034 "http upstream temp fd: %d",
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
3035 u->pipe->temp_file->file.fd);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3036 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3037
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3038 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3039
3940
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3040 if (r->cache) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3041
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3042 if (u->cacheable) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3043
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3044 if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3045 time_t valid;
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3046
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3047 valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3048
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3049 if (valid) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3050 r->cache->valid_sec = ngx_time() + valid;
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3051 r->cache->error = rc;
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3052 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3053 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3054 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3055
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
3056 ngx_http_file_cache_free(r->cache, u->pipe->temp_file);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3057 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3058
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3059 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3060
2692
111e6e62af32 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2691
diff changeset
3061 if (u->header_sent
3963
10fbb8f02a45 finalizing with rc == 0 in unbuffered proxy mode caused nginx to wait
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
3062 && rc != NGX_HTTP_REQUEST_TIME_OUT
2692
111e6e62af32 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2691
diff changeset
3063 && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3064 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3065 rc = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3066 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3067
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3068 if (rc == NGX_DECLINED) {
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3069 return;
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3070 }
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3071
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3072 r->connection->log->action = "sending to client";
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3073
2971
87ddbe960172 fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents: 2957
diff changeset
3074 if (rc == 0) {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
3075 rc = ngx_http_send_special(r, NGX_HTTP_LAST);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3076 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3077
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3078 ngx_http_finalize_request(r, rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3079 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3080
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3081
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3082 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3083 ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3084 ngx_uint_t offset)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3085 {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3086 ngx_table_elt_t **ph;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3087
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3088 ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3089
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3090 if (*ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3091 *ph = h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3092 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3093
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3094 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3095 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3096
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3097
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3098 static ngx_int_t
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3099 ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3100 ngx_uint_t offset)
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3101 {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3102 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3103 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3104
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3105
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3106 static ngx_int_t
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3107 ngx_http_upstream_process_content_length(ngx_http_request_t *r,
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3108 ngx_table_elt_t *h, ngx_uint_t offset)
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3109 {
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3110 ngx_http_upstream_t *u;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3111
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3112 u = r->upstream;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3113
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3114 u->headers_in.content_length = h;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3115 u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3116
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3117 return NGX_OK;
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3118 }
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3119
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3120
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4116
diff changeset
3121 static ngx_int_t
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3122 ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3123 ngx_uint_t offset)
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3124 {
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3125 #if (NGX_HTTP_CACHE)
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3126 ngx_http_upstream_t *u;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3127
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3128 u = r->upstream;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3129
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3130 if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) {
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3131 u->cacheable = 0;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3132 }
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3133 #endif
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3134
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3135 return NGX_OK;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3136 }
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3137
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3138
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3139 static ngx_int_t
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3140 ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3141 ngx_table_elt_t *h, ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3142 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3143 ngx_array_t *pa;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3144 ngx_table_elt_t **ph;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3145 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3146
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3147 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3148 pa = &u->headers_in.cache_control;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3149
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3150 if (pa->elts == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3151 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3152 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3153 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3154 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3155 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3156
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3157 ph = ngx_array_push(pa);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3158 if (ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3159 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3160 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3161
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3162 *ph = h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3163
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3164 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3165 {
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3166 u_char *p, *last;
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3167 ngx_int_t n;
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3168
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3169 if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) {
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3170 return NGX_OK;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3171 }
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3172
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3173 if (r->cache == NULL) {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3174 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3175 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3176
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3177 if (r->cache->valid_sec != 0) {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3178 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3179 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3180
3517
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3181 p = h->value.data;
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3182 last = p + h->value.len;
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3183
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3184 if (ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3185 || ngx_strlcasestrn(p, last, (u_char *) "no-store", 8 - 1) != NULL
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3186 || ngx_strlcasestrn(p, last, (u_char *) "private", 7 - 1) != NULL)
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3187 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3188 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3189 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3190 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3191
3517
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3192 p = ngx_strlcasestrn(p, last, (u_char *) "max-age=", 8 - 1);
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3193
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3194 if (p == NULL) {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3195 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3196 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3197
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3198 n = 0;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3199
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3200 for (p += 8; p < last; p++) {
3198
48bfb7dc981b test comma separator in "Cache-Control"
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
3201 if (*p == ',' || *p == ';' || *p == ' ') {
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3202 break;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3203 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3204
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3205 if (*p >= '0' && *p <= '9') {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3206 n = n * 10 + *p - '0';
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3207 continue;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3208 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3209
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3210 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3211 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3212 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3213
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3214 if (n == 0) {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3215 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3216 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3217 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3218
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3219 r->cache->valid_sec = ngx_time() + n;
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3220 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3221 #endif
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3222
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3223 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3224 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3225
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3226
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3227 static ngx_int_t
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3228 ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3229 ngx_uint_t offset)
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3230 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3231 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3232
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3233 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3234 u->headers_in.expires = h;
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3235
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3236 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3237 {
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3238 time_t expires;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3239
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3240 if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) {
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3241 return NGX_OK;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3242 }
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3243
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3244 if (r->cache == NULL) {
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3245 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3246 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3247
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3248 if (r->cache->valid_sec != 0) {
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3249 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3250 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3251
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3252 expires = ngx_http_parse_time(h->value.data, h->value.len);
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3253
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3254 if (expires == NGX_ERROR || expires < ngx_time()) {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3255 u->cacheable = 0;
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3256 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3257 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3258
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3259 r->cache->valid_sec = expires;
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3260 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3261 #endif
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3262
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3263 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3264 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3265
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3266
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3267 static ngx_int_t
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3268 ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3269 ngx_table_elt_t *h, ngx_uint_t offset)
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3270 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3271 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3272
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3273 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3274 u->headers_in.x_accel_expires = h;
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3275
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3276 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3277 {
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3278 u_char *p;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3279 size_t len;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3280 ngx_int_t n;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3281
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3282 if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) {
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3283 return NGX_OK;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3284 }
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3285
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3286 if (r->cache == NULL) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3287 return NGX_OK;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3288 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3289
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3290 len = h->value.len;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3291 p = h->value.data;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3292
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3293 if (p[0] != '@') {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3294 n = ngx_atoi(p, len);
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3295
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3296 switch (n) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3297 case 0:
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3298 u->cacheable = 0;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3299 case NGX_ERROR:
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3300 return NGX_OK;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3301
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3302 default:
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3303 r->cache->valid_sec = ngx_time() + n;
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3304 return NGX_OK;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3305 }
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3306 }
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3307
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3308 p++;
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3309 len--;
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3310
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3311 n = ngx_atoi(p, len);
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3312
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3313 if (n != NGX_ERROR) {
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3314 r->cache->valid_sec = n;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3315 }
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3316 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3317 #endif
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3318
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3319 return NGX_OK;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3320 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3321
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3322
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3323 static ngx_int_t
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3324 ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3325 ngx_uint_t offset)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3326 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3327 ngx_int_t n;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3328
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3329 r->upstream->headers_in.x_accel_limit_rate = h;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3330
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3331 n = ngx_atoi(h->value.data, h->value.len);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3332
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3333 if (n != NGX_ERROR) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3334 r->limit_rate = (size_t) n;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3335 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3336
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3337 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3338 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3339
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3340
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3341 static ngx_int_t
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3342 ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3343 ngx_uint_t offset)
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3344 {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3345 u_char c0, c1, c2;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3346
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3347 if (r->upstream->conf->change_buffering) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3348
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3349 if (h->value.len == 2) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3350 c0 = ngx_tolower(h->value.data[0]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3351 c1 = ngx_tolower(h->value.data[1]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3352
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3353 if (c0 == 'n' && c1 == 'o') {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3354 r->upstream->buffering = 0;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3355 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3356
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3357 } else if (h->value.len == 3) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3358 c0 = ngx_tolower(h->value.data[0]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3359 c1 = ngx_tolower(h->value.data[1]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3360 c2 = ngx_tolower(h->value.data[2]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3361
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3362 if (c0 == 'y' && c1 == 'e' && c2 == 's') {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3363 r->upstream->buffering = 1;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3364 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3365 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3366 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3367
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3368 return NGX_OK;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3369 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3370
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3371
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3372 static ngx_int_t
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3373 ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3374 ngx_uint_t offset)
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3375 {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3376 r->headers_out.override_charset = &h->value;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3377
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3378 return NGX_OK;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3379 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3380
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3381
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3382 static ngx_int_t
4124
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3383 ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3384 ngx_uint_t offset)
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3385 {
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3386 r->upstream->headers_in.connection = h;
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3387
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3388 if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3389 (u_char *) "close", 5 - 1)
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3390 != NULL)
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3391 {
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3392 r->upstream->headers_in.connection_close = 1;
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3393 }
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3394
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3395 return NGX_OK;
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3396 }
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3397
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3398
0c30976f5bfa Upstream: Connection header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4123
diff changeset
3399 static ngx_int_t
4123
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3400 ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3401 ngx_table_elt_t *h, ngx_uint_t offset)
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3402 {
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3403 r->upstream->headers_in.transfer_encoding = h;
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3404
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3405 if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3406 (u_char *) "chunked", 7 - 1)
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3407 != NULL)
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3408 {
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3409 r->upstream->headers_in.chunked = 1;
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3410 }
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3411
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3412 return NGX_OK;
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3413 }
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3414
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3415
0ee350b5177c Upstream: Transfer-Encoding header processing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4120
diff changeset
3416 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3417 ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3418 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3419 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3420 ngx_table_elt_t *ho, **ph;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3421
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3422 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3423 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3424 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3425 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3426
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3427 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3428
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3429 if (offset) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3430 ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3431 *ph = ho;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3432 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3433
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3434 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3435 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3436
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3437
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3438 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3439 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3440 ngx_table_elt_t *h, ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3441 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3442 ngx_array_t *pa;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3443 ngx_table_elt_t *ho, **ph;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3444
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3445 pa = (ngx_array_t *) ((char *) &r->headers_out + offset);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3446
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3447 if (pa->elts == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3448 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3449 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3450 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3451 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3452 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3453
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3454 ph = ngx_array_push(pa);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3455 if (ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3456 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3457 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3458
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3459 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3460 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3461 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3462 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3463
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3464 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3465 *ph = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3466
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3467 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3468 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3469
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3470
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3471 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3472 ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3473 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3474 {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3475 u_char *p, *last;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3476
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3477 r->headers_out.content_type_len = h->value.len;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3478 r->headers_out.content_type = h->value;
2882
896db5a09bd2 reset content_type hash value, this fixes a bug when XSLT responses
Igor Sysoev <igor@sysoev.ru>
parents: 2875
diff changeset
3479 r->headers_out.content_type_lowcase = NULL;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3480
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3481 for (p = h->value.data; *p; p++) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3482
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3483 if (*p != ';') {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3484 continue;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3485 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3486
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3487 last = p;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3488
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3489 while (*++p == ' ') { /* void */ }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3490
1968
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3491 if (*p == '\0') {
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3492 return NGX_OK;
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3493 }
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3494
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1098
diff changeset
3495 if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3496 continue;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3497 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3498
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3499 p += 8;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3500
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3501 r->headers_out.content_type_len = last - h->value.data;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3502
2244
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3503 if (*p == '"') {
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3504 p++;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3505 }
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3506
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3507 last = h->value.data + h->value.len;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3508
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3509 if (*(last - 1) == '"') {
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3510 last--;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3511 }
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3512
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3513 r->headers_out.charset.len = last - p;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3514 r->headers_out.charset.data = p;
1143
c6c42497106c fix segfault if upstream sends trailing ";" in "charset="
Igor Sysoev <igor@sysoev.ru>
parents: 1109
diff changeset
3515
c6c42497106c fix segfault if upstream sends trailing ";" in "charset="
Igor Sysoev <igor@sysoev.ru>
parents: 1109
diff changeset
3516 return NGX_OK;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3517 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3518
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3519 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3520 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3521
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3522
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3523 static ngx_int_t
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3524 ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3525 ngx_uint_t offset)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3526 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3527 ngx_table_elt_t *ho;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3528
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3529 ho = ngx_list_push(&r->headers_out.headers);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3530 if (ho == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3531 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3532 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3533
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3534 *ho = *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3535
3004
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3536 r->headers_out.last_modified = ho;
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3537
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3538 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3539
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3540 if (r->upstream->cacheable) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3541 r->headers_out.last_modified_time = ngx_http_parse_time(h->value.data,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3542 h->value.len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3543 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3544
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3545 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3546
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3547 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3548 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3549
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3550
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3551 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3552 ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3553 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3554 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3555 ngx_int_t rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3556 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3557
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3558 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3559 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3560 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3561 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3562
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3563 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3564
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3565 if (r->upstream->rewrite_redirect) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3566 rc = r->upstream->rewrite_redirect(r, ho, 0);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3567
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3568 if (rc == NGX_DECLINED) {
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3569 return NGX_OK;
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3570 }
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3571
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3572 if (rc == NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3573 r->headers_out.location = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3574
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3575 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3576 "rewritten location: \"%V\"", &ho->value);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3577 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3578
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3579 return rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3580 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3581
1653
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3582 if (ho->value.data[0] != '/') {
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3583 r->headers_out.location = ho;
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3584 }
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3585
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3586 /*
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3587 * we do not set r->headers_out.location here to avoid the handling
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3588 * the local redirects without a host name by ngx_http_header_filter()
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3589 */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3590
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3591 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3592 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3593
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3594
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3595 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3596 ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3597 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3598 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3599 u_char *p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3600 ngx_int_t rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3601 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3602
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3603 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3604 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3605 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3606 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3607
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3608 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3609
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3610 if (r->upstream->rewrite_redirect) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3611
1549
099d8470e6c3 pass length clearly
Igor Sysoev <igor@sysoev.ru>
parents: 1543
diff changeset
3612 p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3613
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3614 if (p) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3615 rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3616
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3617 } else {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3618 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3619 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3620
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3621 if (rc == NGX_DECLINED) {
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3622 return NGX_OK;
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3623 }
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3624
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3625 if (rc == NGX_OK) {
1654
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3626 r->headers_out.refresh = ho;
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3627
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3628 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3629 "rewritten refresh: \"%V\"", &ho->value);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3630 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3631
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3632 return rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3633 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3634
1654
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3635 r->headers_out.refresh = ho;
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3636
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3637 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3638 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3639
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3640
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3641 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3642 ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3643 ngx_table_elt_t *h, ngx_uint_t offset)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3644 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3645 ngx_table_elt_t *ho;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3646
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3647 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3648
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3649 if (r->cached) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3650 r->allow_ranges = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3651 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3652
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3653 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3654
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3655 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3656
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3657 ho = ngx_list_push(&r->headers_out.headers);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3658 if (ho == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3659 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3660 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3661
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3662 *ho = *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3663
3004
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3664 r->headers_out.accept_ranges = ho;
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3665
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3666 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3667 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3668
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3669
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3670 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3671
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3672 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3673 ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3674 ngx_table_elt_t *h, ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3675 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3676 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3677
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3678 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3679 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3680 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3681 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3682
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3683 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3684
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3685 r->headers_out.content_encoding = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3686
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3687 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3688 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3689
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3690 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3691
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3692
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
3693 static ngx_int_t
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3694 ngx_http_upstream_add_variables(ngx_conf_t *cf)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3695 {
880
3b763d36e055 axe old % log format
Igor Sysoev <igor@sysoev.ru>
parents: 850
diff changeset
3696 ngx_http_variable_t *var, *v;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3697
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3698 for (v = ngx_http_upstream_vars; v->name.len; v++) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3699 var = ngx_http_add_variable(cf, &v->name, v->flags);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3700 if (var == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3701 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3702 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3703
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
3704 var->get_handler = v->get_handler;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3705 var->data = v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3706 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3707
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3708 return NGX_OK;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3709 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3710
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3711
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3712 static ngx_int_t
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3713 ngx_http_upstream_addr_variable(ngx_http_request_t *r,
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3714 ngx_http_variable_value_t *v, uintptr_t data)
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3715 {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3716 u_char *p;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3717 size_t len;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3718 ngx_uint_t i;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3719 ngx_http_upstream_state_t *state;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3720
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3721 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3722 v->no_cacheable = 0;
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3723 v->not_found = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3724
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3725 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3726 v->not_found = 1;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3727 return NGX_OK;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3728 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3729
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3730 len = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3731 state = r->upstream_states->elts;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3732
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3733 for (i = 0; i < r->upstream_states->nelts; i++) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3734 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3735 len += state[i].peer->len + 2;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3736
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3737 } else {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3738 len += 3;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3739 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3740 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3741
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3742 p = ngx_pnalloc(r->pool, len);
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3743 if (p == NULL) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3744 return NGX_ERROR;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3745 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3746
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3747 v->data = p;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3748
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3749 i = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3750
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3751 for ( ;; ) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3752 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3753 p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3754 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3755
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3756 if (++i == r->upstream_states->nelts) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3757 break;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3758 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3759
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3760 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3761 *p++ = ',';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3762 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3763
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3764 } else {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3765 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3766 *p++ = ':';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3767 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3768
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3769 if (++i == r->upstream_states->nelts) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3770 break;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3771 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3772
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3773 continue;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3774 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3775 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3776
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3777 v->len = p - v->data;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3778
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3779 return NGX_OK;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3780 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3781
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3782
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3783 static ngx_int_t
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3784 ngx_http_upstream_status_variable(ngx_http_request_t *r,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3785 ngx_http_variable_value_t *v, uintptr_t data)
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3786 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3787 u_char *p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3788 size_t len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3789 ngx_uint_t i;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3790 ngx_http_upstream_state_t *state;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3791
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3792 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3793 v->no_cacheable = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3794 v->not_found = 0;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3795
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3796 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3797 v->not_found = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3798 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3799 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3800
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3801 len = r->upstream_states->nelts * (3 + 2);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3802
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3803 p = ngx_pnalloc(r->pool, len);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3804 if (p == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3805 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3806 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3807
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3808 v->data = p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3809
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3810 i = 0;
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3811 state = r->upstream_states->elts;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3812
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3813 for ( ;; ) {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3814 if (state[i].status) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3815 p = ngx_sprintf(p, "%ui", state[i].status);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3816
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3817 } else {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3818 *p++ = '-';
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3819 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3820
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3821 if (++i == r->upstream_states->nelts) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3822 break;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3823 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3824
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3825 if (state[i].peer) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3826 *p++ = ',';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3827 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3828
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3829 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3830 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3831 *p++ = ':';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3832 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3833
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3834 if (++i == r->upstream_states->nelts) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3835 break;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3836 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3837
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3838 continue;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3839 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3840 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3841
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3842 v->len = p - v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3843
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3844 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3845 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3846
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3847
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3848 static ngx_int_t
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3849 ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3850 ngx_http_variable_value_t *v, uintptr_t data)
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3851 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3852 u_char *p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3853 size_t len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3854 ngx_uint_t i;
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
3855 ngx_msec_int_t ms;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3856 ngx_http_upstream_state_t *state;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3857
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3858 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3859 v->no_cacheable = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3860 v->not_found = 0;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3861
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3862 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3863 v->not_found = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3864 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3865 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3866
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3867 len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3868
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3869 p = ngx_pnalloc(r->pool, len);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3870 if (p == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3871 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3872 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3873
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3874 v->data = p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3875
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3876 i = 0;
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3877 state = r->upstream_states->elts;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3878
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3879 for ( ;; ) {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3880 if (state[i].status) {
1640
02a22cd5282a 64-bit time_t compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
3881 ms = (ngx_msec_int_t)
02a22cd5282a 64-bit time_t compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
3882 (state[i].response_sec * 1000 + state[i].response_msec);
3515
76d252724db5 use ngx_min() and ngx_max()
Igor Sysoev <igor@sysoev.ru>
parents: 3514
diff changeset
3883 ms = ngx_max(ms, 0);
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
3884 p = ngx_sprintf(p, "%d.%03d", ms / 1000, ms % 1000);
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3885
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3886 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3887 *p++ = '-';
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3888 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3889
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3890 if (++i == r->upstream_states->nelts) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3891 break;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3892 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3893
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3894 if (state[i].peer) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3895 *p++ = ',';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3896 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3897
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3898 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3899 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3900 *p++ = ':';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3901 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3902
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3903 if (++i == r->upstream_states->nelts) {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3904 break;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3905 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3906
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3907 continue;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3908 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3909 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3910
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3911 v->len = p - v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3912
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3913 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3914 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3915
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3916
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3917 static ngx_int_t
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3918 ngx_http_upstream_response_length_variable(ngx_http_request_t *r,
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3919 ngx_http_variable_value_t *v, uintptr_t data)
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3920 {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3921 u_char *p;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3922 size_t len;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3923 ngx_uint_t i;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3924 ngx_http_upstream_state_t *state;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3925
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3926 v->valid = 1;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3927 v->no_cacheable = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3928 v->not_found = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3929
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3930 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3931 v->not_found = 1;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3932 return NGX_OK;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3933 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3934
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3935 len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3936
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3937 p = ngx_pnalloc(r->pool, len);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3938 if (p == NULL) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3939 return NGX_ERROR;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3940 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3941
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3942 v->data = p;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3943
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3944 i = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3945 state = r->upstream_states->elts;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3946
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3947 for ( ;; ) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3948 p = ngx_sprintf(p, "%O", state[i].response_length);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3949
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3950 if (++i == r->upstream_states->nelts) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3951 break;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3952 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3953
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3954 if (state[i].peer) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3955 *p++ = ',';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3956 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3957
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3958 } else {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3959 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3960 *p++ = ':';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3961 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3962
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3963 if (++i == r->upstream_states->nelts) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3964 break;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3965 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3966
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3967 continue;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3968 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3969 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3970
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3971 v->len = p - v->data;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3972
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3973 return NGX_OK;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3974 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3975
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3976
1162
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3977 ngx_int_t
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3978 ngx_http_upstream_header_variable(ngx_http_request_t *r,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3979 ngx_http_variable_value_t *v, uintptr_t data)
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3980 {
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3981 if (r->upstream == NULL) {
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3982 v->not_found = 1;
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3983 return NGX_OK;
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3984 }
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3985
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3986 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3987 &r->upstream->headers_in.headers.part,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3988 sizeof("upstream_http_") - 1);
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3989 }
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3990
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3991
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3992 #if (NGX_HTTP_CACHE)
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3993
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3994 ngx_int_t
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3995 ngx_http_upstream_cache_status(ngx_http_request_t *r,
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3996 ngx_http_variable_value_t *v, uintptr_t data)
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3997 {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3998 ngx_uint_t n;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3999
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4000 if (r->upstream == NULL || r->upstream->cache_status == 0) {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4001 v->not_found = 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4002 return NGX_OK;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4003 }
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4004
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4005 n = r->upstream->cache_status - 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4006
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4007 v->valid = 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4008 v->no_cacheable = 0;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4009 v->not_found = 0;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4010 v->len = ngx_http_cache_status[n].len;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4011 v->data = ngx_http_cache_status[n].data;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4012
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4013 return NGX_OK;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4014 }
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4015
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4016 #endif
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4017
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
4018
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4019 static char *
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4020 ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4021 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4022 char *rv;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4023 void *mconf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4024 ngx_str_t *value;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4025 ngx_url_t u;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4026 ngx_uint_t m;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4027 ngx_conf_t pcf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4028 ngx_http_module_t *module;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4029 ngx_http_conf_ctx_t *ctx, *http_ctx;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4030 ngx_http_upstream_srv_conf_t *uscf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4031
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4032 ngx_memzero(&u, sizeof(ngx_url_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4033
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4034 value = cf->args->elts;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4035 u.host = value[1];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4036 u.no_resolve = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4037
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4038 uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4039 |NGX_HTTP_UPSTREAM_WEIGHT
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4040 |NGX_HTTP_UPSTREAM_MAX_FAILS
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4041 |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4042 |NGX_HTTP_UPSTREAM_DOWN
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4043 |NGX_HTTP_UPSTREAM_BACKUP);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4044 if (uscf == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4045 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4046 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4047
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4048
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4049 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4050 if (ctx == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4051 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4052 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4053
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4054 http_ctx = cf->ctx;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4055 ctx->main_conf = http_ctx->main_conf;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4056
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4057 /* the upstream{}'s srv_conf */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4058
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4059 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4060 if (ctx->srv_conf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4061 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4062 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4063
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4064 ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4065
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4066 uscf->srv_conf = ctx->srv_conf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4067
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4068
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4069 /* the upstream{}'s loc_conf */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4070
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4071 ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4072 if (ctx->loc_conf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4073 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4074 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4075
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4076 for (m = 0; ngx_modules[m]; m++) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4077 if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4078 continue;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4079 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4080
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4081 module = ngx_modules[m]->ctx;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4082
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4083 if (module->create_srv_conf) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4084 mconf = module->create_srv_conf(cf);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4085 if (mconf == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4086 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4087 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4088
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4089 ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4090 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4091
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4092 if (module->create_loc_conf) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4093 mconf = module->create_loc_conf(cf);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4094 if (mconf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4095 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4096 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4097
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4098 ctx->loc_conf[ngx_modules[m]->ctx_index] = mconf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4099 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4100 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4101
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4102
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4103 /* parse inside upstream{} */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4104
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4105 pcf = *cf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4106 cf->ctx = ctx;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4107 cf->cmd_type = NGX_HTTP_UPS_CONF;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4108
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4109 rv = ngx_conf_parse(cf, NULL);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4110
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4111 *cf = pcf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4112
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4113 if (rv != NGX_CONF_OK) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4114 return rv;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4115 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4116
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4117 if (uscf->servers == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4118 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4119 "no servers are inside upstream");
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4120 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4121 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4122
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4123 return rv;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4124 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4125
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4126
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4127 static char *
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4128 ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4129 {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4130 ngx_http_upstream_srv_conf_t *uscf = conf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4131
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4132 time_t fail_timeout;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4133 ngx_str_t *value, s;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4134 ngx_url_t u;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4135 ngx_int_t weight, max_fails;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4136 ngx_uint_t i;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4137 ngx_http_upstream_server_t *us;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4138
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4139 if (uscf->servers == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4140 uscf->servers = ngx_array_create(cf->pool, 4,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4141 sizeof(ngx_http_upstream_server_t));
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4142 if (uscf->servers == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4143 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4144 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4145 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4146
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4147 us = ngx_array_push(uscf->servers);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4148 if (us == NULL) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4149 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4150 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4151
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4152 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4153
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4154 value = cf->args->elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4155
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4156 ngx_memzero(&u, sizeof(ngx_url_t));
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4157
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4158 u.url = value[1];
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4159 u.default_port = 80;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4160
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1558
diff changeset
4161 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4162 if (u.err) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4163 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4164 "%s in upstream \"%V\"", u.err, &u.url);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4165 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4166
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4167 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4168 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4169
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4170 weight = 1;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4171 max_fails = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4172 fail_timeout = 10;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4173
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4174 for (i = 2; i < cf->args->nelts; i++) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4175
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4176 if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4177
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4178 if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4179 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4180 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4181
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4182 weight = ngx_atoi(&value[i].data[7], value[i].len - 7);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4183
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4184 if (weight == NGX_ERROR || weight == 0) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4185 goto invalid;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4186 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4187
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4188 continue;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4189 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4190
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4191 if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4192
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4193 if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4194 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4195 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4196
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4197 max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4198
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4199 if (max_fails == NGX_ERROR) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4200 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4201 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4202
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4203 continue;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4204 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4205
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4206 if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4207
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4208 if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4209 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4210 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4211
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4212 s.len = value[i].len - 13;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4213 s.data = &value[i].data[13];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4214
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4215 fail_timeout = ngx_parse_time(&s, 1);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4216
1973
54e4d1b6c183 small fix
Igor Sysoev <igor@sysoev.ru>
parents: 1968
diff changeset
4217 if (fail_timeout == NGX_ERROR) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4218 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4219 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4220
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4221 continue;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4222 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4223
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4224 if (ngx_strncmp(value[i].data, "backup", 6) == 0) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4225
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4226 if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4227 goto invalid;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4228 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4229
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4230 us->backup = 1;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4231
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4232 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4233 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4234
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4235 if (ngx_strncmp(value[i].data, "down", 4) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4236
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4237 if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4238 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4239 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4240
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4241 us->down = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4242
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4243 continue;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4244 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4245
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4246 goto invalid;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4247 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4248
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4249 us->addrs = u.addrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4250 us->naddrs = u.naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4251 us->weight = weight;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4252 us->max_fails = max_fails;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4253 us->fail_timeout = fail_timeout;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4254
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4255 return NGX_CONF_OK;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4256
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4257 invalid:
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4258
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4259 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4260 "invalid parameter \"%V\"", &value[i]);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4261
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4262 return NGX_CONF_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4263 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4264
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4265
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4266 ngx_http_upstream_srv_conf_t *
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4267 ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4268 {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4269 ngx_uint_t i;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4270 ngx_http_upstream_server_t *us;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4271 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4272 ngx_http_upstream_main_conf_t *umcf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4273
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4274 if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4275
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1558
diff changeset
4276 if (ngx_parse_url(cf->pool, u) != NGX_OK) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4277 if (u->err) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4278 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4279 "%s in upstream \"%V\"", u->err, &u->url);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4280 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4281
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4282 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4283 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4284 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4285
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4286 umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4287
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4288 uscfp = umcf->upstreams.elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4289
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4290 for (i = 0; i < umcf->upstreams.nelts; i++) {
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4291
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4292 if (uscfp[i]->host.len != u->host.len
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4293 || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4294 != 0)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4295 {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4296 continue;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4297 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4298
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4299 if ((flags & NGX_HTTP_UPSTREAM_CREATE)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4300 && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4301 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4302 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4303 "duplicate upstream \"%V\"", &u->host);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4304 return NULL;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4305 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4306
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4307 if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && u->port) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4308 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4309 "upstream \"%V\" may not have port %d",
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4310 &u->host, u->port);
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4311 return NULL;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4312 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4313
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4314 if ((flags & NGX_HTTP_UPSTREAM_CREATE) && uscfp[i]->port) {
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4315 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4316 "upstream \"%V\" may not have port %d in %s:%ui",
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4317 &u->host, uscfp[i]->port,
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1469
diff changeset
4318 uscfp[i]->file_name, uscfp[i]->line);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4319 return NULL;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4320 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4321
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4322 if (uscfp[i]->port != u->port) {
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4323 continue;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4324 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4325
1340
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4326 if (uscfp[i]->default_port && u->default_port
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4327 && uscfp[i]->default_port != u->default_port)
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4328 {
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4329 continue;
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4330 }
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4331
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4332 return uscfp[i];
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4333 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4334
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4335 uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4336 if (uscf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4337 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4338 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4339
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4340 uscf->flags = flags;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4341 uscf->host = u->host;
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1469
diff changeset
4342 uscf->file_name = cf->conf_file->file.name.data;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4343 uscf->line = cf->conf_file->line;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4344 uscf->port = u->port;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4345 uscf->default_port = u->default_port;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4346
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4347 if (u->naddrs == 1) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4348 uscf->servers = ngx_array_create(cf->pool, 1,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4349 sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4350 if (uscf->servers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4351 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4352 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4353
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4354 us = ngx_array_push(uscf->servers);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4355 if (us == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4356 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4357 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4358
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4359 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4360
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4361 us->addrs = u->addrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4362 us->naddrs = u->naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4363 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4364
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4365 uscfp = ngx_array_push(&umcf->upstreams);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4366 if (uscfp == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4367 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4368 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4369
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4370 *uscfp = uscf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4371
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4372 return uscf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4373 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4374
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4375
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4376 char *
3399
ac9c0380337d fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3369
diff changeset
4377 ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4378 void *conf)
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4379 {
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4380 char *p = conf;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4381
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4382 ngx_int_t rc;
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4383 ngx_str_t *value;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4384 ngx_addr_t **paddr;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4385
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4386 paddr = (ngx_addr_t **) (p + cmd->offset);
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4387
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4388 *paddr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4389 if (*paddr == NULL) {
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4390 return NGX_CONF_ERROR;
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4391 }
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4392
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4393 value = cf->args->elts;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4394
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4395 rc = ngx_parse_addr(cf->pool, *paddr, value[1].data, value[1].len);
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4396
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4397 switch (rc) {
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4398 case NGX_OK:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4399 (*paddr)->name = value[1];
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4400 return NGX_CONF_OK;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4401
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4402 case NGX_DECLINED:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4403 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4404 "invalid address \"%V\"", &value[1]);
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4405 default:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4406 return NGX_CONF_ERROR;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4407 }
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4408 }
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4409
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4410
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4411 ngx_int_t
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4412 ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4413 ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4414 ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4415 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4416 ngx_str_t *h;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4417 ngx_uint_t i, j;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4418 ngx_array_t hide_headers;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4419 ngx_hash_key_t *hk;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4420
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4421 if (conf->hide_headers == NGX_CONF_UNSET_PTR
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4422 && conf->pass_headers == NGX_CONF_UNSET_PTR)
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4423 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4424 conf->hide_headers_hash = prev->hide_headers_hash;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4425
2929
37b7cd336fdf inherit proxy_set_header, proxy_hide_header, and fastcgi_hide_header
Igor Sysoev <igor@sysoev.ru>
parents: 2927
diff changeset
4426 if (conf->hide_headers_hash.buckets
2949
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4427 #if (NGX_HTTP_CACHE)
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4428 && ((conf->cache == NULL) == (prev->cache == NULL))
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4429 #endif
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4430 )
2929
37b7cd336fdf inherit proxy_set_header, proxy_hide_header, and fastcgi_hide_header
Igor Sysoev <igor@sysoev.ru>
parents: 2927
diff changeset
4431 {
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4432 return NGX_OK;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4433 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4434
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4435 conf->hide_headers = prev->hide_headers;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4436 conf->pass_headers = prev->pass_headers;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4437
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4438 } else {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4439 if (conf->hide_headers == NGX_CONF_UNSET_PTR) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4440 conf->hide_headers = prev->hide_headers;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4441 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4442
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4443 if (conf->pass_headers == NGX_CONF_UNSET_PTR) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4444 conf->pass_headers = prev->pass_headers;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4445 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4446 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4447
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4448 if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4449 != NGX_OK)
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4450 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4451 return NGX_ERROR;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4452 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4453
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4454 for (h = default_hide_headers; h->len; h++) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4455 hk = ngx_array_push(&hide_headers);
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4456 if (hk == NULL) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4457 return NGX_ERROR;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4458 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4459
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4460 hk->key = *h;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4461 hk->key_hash = ngx_hash_key_lc(h->data, h->len);
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4462 hk->value = (void *) 1;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4463 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4464
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4465 if (conf->hide_headers != NGX_CONF_UNSET_PTR) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4466
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4467 h = conf->hide_headers->elts;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4468
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4469 for (i = 0; i < conf->hide_headers->nelts; i++) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4470
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4471 hk = hide_headers.elts;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4472
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4473 for (j = 0; j < hide_headers.nelts; j++) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4474 if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4475 goto exist;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4476 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4477 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4478
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4479 hk = ngx_array_push(&hide_headers);
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4480 if (hk == NULL) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4481 return NGX_ERROR;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4482 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4483
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4484 hk->key = h[i];
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4485 hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4486 hk->value = (void *) 1;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4487
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4488 exist:
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4489
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4490 continue;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4491 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4492 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4493
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4494 if (conf->pass_headers != NGX_CONF_UNSET_PTR) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4495
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4496 h = conf->pass_headers->elts;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4497 hk = hide_headers.elts;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4498
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4499 for (i = 0; i < conf->pass_headers->nelts; i++) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4500 for (j = 0; j < hide_headers.nelts; j++) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4501
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4502 if (hk[j].key.data == NULL) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4503 continue;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4504 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4505
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4506 if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4507 hk[j].key.data = NULL;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4508 break;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4509 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4510 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4511 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4512 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4513
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4514 hash->hash = &conf->hide_headers_hash;
1706
9242e21d2f8d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1705
diff changeset
4515 hash->key = ngx_hash_key_lc;
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4516 hash->pool = cf->pool;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4517 hash->temp_pool = NULL;
1706
9242e21d2f8d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1705
diff changeset
4518
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4519 return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4520 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4521
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4522
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4523 static void *
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4524 ngx_http_upstream_create_main_conf(ngx_conf_t *cf)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4525 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4526 ngx_http_upstream_main_conf_t *umcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4527
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4528 umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4529 if (umcf == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4530 return NULL;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4531 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4532
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4533 if (ngx_array_init(&umcf->upstreams, cf->pool, 4,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4534 sizeof(ngx_http_upstream_srv_conf_t *))
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4535 != NGX_OK)
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4536 {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2882
diff changeset
4537 return NULL;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4538 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4539
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4540 return umcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4541 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4542
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4543
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4544 static char *
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4545 ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4546 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4547 ngx_http_upstream_main_conf_t *umcf = conf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4548
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4549 ngx_uint_t i;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4550 ngx_array_t headers_in;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4551 ngx_hash_key_t *hk;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4552 ngx_hash_init_t hash;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4553 ngx_http_upstream_init_pt init;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4554 ngx_http_upstream_header_t *header;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4555 ngx_http_upstream_srv_conf_t **uscfp;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4556
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4557 uscfp = umcf->upstreams.elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4558
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4559 for (i = 0; i < umcf->upstreams.nelts; i++) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4560
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4561 init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4562 ngx_http_upstream_init_round_robin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4563
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4564 if (init(cf, uscfp[i]) != NGX_OK) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4565 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4566 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4567 }
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4568
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4569
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4570 /* upstream_headers_in_hash */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4571
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4572 if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4573 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4574 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4575 return NGX_CONF_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4576 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4577
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4578 for (header = ngx_http_upstream_headers_in; header->name.len; header++) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4579 hk = ngx_array_push(&headers_in);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4580 if (hk == NULL) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4581 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4582 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4583
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4584 hk->key = header->name;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4585 hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4586 hk->value = header;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4587 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4588
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4589 hash.hash = &umcf->headers_in_hash;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4590 hash.key = ngx_hash_key_lc;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4591 hash.max_size = 512;
751
bae59a740c40 align hash bucket size to cache line
Igor Sysoev <igor@sysoev.ru>
parents: 750
diff changeset
4592 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4593 hash.name = "upstream_headers_in_hash";
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4594 hash.pool = cf->pool;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4595 hash.temp_pool = NULL;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4596
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4597 if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4598 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4599 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4600
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4601 return NGX_CONF_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4602 }