annotate src/http/ngx_http_upstream.c @ 4437:3a1507f48686 stable-1.0

Merge of r4372, r4373, r4374: SCGI fixes: *) Fixed incorrect use of r->http_version in scgi module. The r->http_version is a version of client's request, and modules must not set it unless they are really willing to downgrade protocol version used for a response (i.e. to HTTP/0.9 if no response headers are available). In neither case r->http_version may be upgraded. The former code downgraded response from HTTP/1.1 to HTTP/1.0 for no reason, causing various problems (see ticket #66). It was also possible that HTTP/0.9 requests were upgraded to HTTP/1.0. *) Removed duplicate function declaration. *) Removed error if there is no Status header. The SCGI specification doesn't specify format of the response, and assuming CGI specs should be used there is no reason to complain. RFC 3875 explicitly states that "A Status header field is optional, and status 200 'OK' is assumed if it is omitted".
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 05 Feb 2012 13:53:50 +0000
parents e04fdb54dd71
children 4919fb357a5d
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);
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
75 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
76 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
77 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
78 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
79 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
80 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
81 ngx_table_elt_t *h, ngx_uint_t offset);
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
82 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
83 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
84 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
85 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
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93 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
94 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
95 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
96 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
97 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
98 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
99 static ngx_int_t ngx_http_upstream_copy_content_length(ngx_http_request_t *r,
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);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
101 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
102 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
103 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
104 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
105 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
106 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
107 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
108 ngx_table_elt_t *h, ngx_uint_t offset);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
109
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
110 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
111 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
112 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
113 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
114
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
115 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
116 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
117 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
118 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
119 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
120 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
121 ngx_http_variable_value_t *v, uintptr_t data);
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
122 static ngx_int_t ngx_http_upstream_response_length_variable(
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
123 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
124
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
125 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
126 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
127 void *conf);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
128
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
129 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
130 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
131
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
132 #if (NGX_HTTP_SSL)
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
133 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
134 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
135 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
136 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
137
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
138
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
139 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
140
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
141 { ngx_string("Status"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
142 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
143 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
144 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
145
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
146 { ngx_string("Content-Type"),
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, content_type),
673
b80f94fa2197 nginx-0.3.58-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 671
diff changeset
149 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
150
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
151 { ngx_string("Content-Length"),
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_length),
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
154 ngx_http_upstream_copy_content_length, 0, 0 },
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("Date"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
157 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
158 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
159 ngx_http_upstream_copy_header_line,
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
160 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
161
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
162 { ngx_string("Last-Modified"),
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
163 ngx_http_upstream_process_header_line,
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
164 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
165 ngx_http_upstream_copy_last_modified, 0, 0 },
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
166
3037
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
167 { ngx_string("ETag"),
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
168 ngx_http_upstream_process_header_line,
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
169 offsetof(ngx_http_upstream_headers_in_t, etag),
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
170 ngx_http_upstream_copy_header_line,
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
171 offsetof(ngx_http_headers_out_t, etag), 0 },
0278f13b04c5 process upstream ETag header
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
172
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
173 { ngx_string("Server"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
174 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
175 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
176 ngx_http_upstream_copy_header_line,
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
177 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
178
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
179 { ngx_string("WWW-Authenticate"),
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
180 ngx_http_upstream_process_header_line,
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
181 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
182 ngx_http_upstream_copy_header_line, 0, 0 },
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
183
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
184 { ngx_string("Location"),
2140
dce5ddef5af9 if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
185 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
186 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
187 ngx_http_upstream_rewrite_location, 0, 0 },
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
188
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
189 { ngx_string("Refresh"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
190 ngx_http_upstream_ignore_header_line, 0,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
191 ngx_http_upstream_rewrite_refresh, 0, 0 },
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
192
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
193 { ngx_string("Set-Cookie"),
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
194 ngx_http_upstream_process_set_cookie, 0,
531
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
195 ngx_http_upstream_copy_header_line, 0, 1 },
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
196
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
197 { ngx_string("Content-Disposition"),
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
198 ngx_http_upstream_ignore_header_line, 0,
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
199 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
200
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
201 { 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
202 ngx_http_upstream_process_cache_control, 0,
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
203 ngx_http_upstream_copy_multi_header_lines,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
204 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
205
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
206 { ngx_string("Expires"),
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
207 ngx_http_upstream_process_expires, 0,
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
208 ngx_http_upstream_copy_header_line,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
209 offsetof(ngx_http_headers_out_t, expires), 1 },
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
210
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
211 { ngx_string("Accept-Ranges"),
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
212 ngx_http_upstream_process_header_line,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
213 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
214 ngx_http_upstream_copy_allow_ranges,
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
215 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
216
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
217 { ngx_string("Connection"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
218 ngx_http_upstream_ignore_header_line, 0,
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
219 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
220
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
221 { ngx_string("Keep-Alive"),
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
222 ngx_http_upstream_ignore_header_line, 0,
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
223 ngx_http_upstream_ignore_header_line, 0, 0 },
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
224
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
225 { ngx_string("X-Powered-By"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
226 ngx_http_upstream_ignore_header_line, 0,
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
227 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
228
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
229 { ngx_string("X-Accel-Expires"),
2664
f903114355d4 zero field
Igor Sysoev <igor@sysoev.ru>
parents: 2663
diff changeset
230 ngx_http_upstream_process_accel_expires, 0,
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
231 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
232
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
233 { ngx_string("X-Accel-Redirect"),
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
234 ngx_http_upstream_process_header_line,
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
235 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
236 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
237
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
238 { ngx_string("X-Accel-Limit-Rate"),
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
239 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
240 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
241
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
242 { ngx_string("X-Accel-Buffering"),
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
243 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
244 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
245
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
246 { ngx_string("X-Accel-Charset"),
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
247 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
248 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
249
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
250 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
251 { ngx_string("Content-Encoding"),
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
252 ngx_http_upstream_process_header_line,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
253 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
254 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
255 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
256
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
257 { 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
258 };
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
261 static ngx_command_t ngx_http_upstream_commands[] = {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
262
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
263 { ngx_string("upstream"),
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
264 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
265 ngx_http_upstream,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
266 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
267 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
268 NULL },
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
269
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
270 { ngx_string("server"),
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
271 NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
272 ngx_http_upstream_server,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
273 NGX_HTTP_SRV_CONF_OFFSET,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
274 0,
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
275 NULL },
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
276
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
277 ngx_null_command
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
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
280
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
281 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
282 ngx_http_upstream_add_variables, /* preconfiguration */
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
283 NULL, /* postconfiguration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
284
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
285 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
286 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
287
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 NULL, /* create server configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 NULL, /* merge server configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 NULL, /* create location configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 NULL /* merge location configuration */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 };
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
294
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 ngx_module_t ngx_http_upstream_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
297 NGX_MODULE_V1,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 &ngx_http_upstream_module_ctx, /* module context */
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
299 ngx_http_upstream_commands, /* module directives */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
301 NULL, /* init master */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
303 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
304 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
305 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
306 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
307 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
308 NGX_MODULE_V1_PADDING
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 };
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
312 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
313
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
314 { 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
315 ngx_http_upstream_addr_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
316 NGX_HTTP_VAR_NOCACHEABLE, 0 },
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
317
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
318 { 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
319 ngx_http_upstream_status_variable, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
320 NGX_HTTP_VAR_NOCACHEABLE, 0 },
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
321
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
322 { 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
323 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
324 NGX_HTTP_VAR_NOCACHEABLE, 0 },
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
325
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
326 { ngx_string("upstream_response_length"), NULL,
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
327 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
328 NGX_HTTP_VAR_NOCACHEABLE, 0 },
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
329
2957
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
330 #if (NGX_HTTP_CACHE)
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
331
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
332 { ngx_string("upstream_cache_status"), NULL,
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
333 ngx_http_upstream_cache_status, 0,
3898
bd1222fb0192 allow to use $upstream_... variables in SSI
Igor Sysoev <igor@sysoev.ru>
parents: 3879
diff changeset
334 NGX_HTTP_VAR_NOCACHEABLE, 0 },
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
335
2957
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
336 #endif
b4f39842523b fix building --without-http-cache, broken in r2953
Igor Sysoev <igor@sysoev.ru>
parents: 2953
diff changeset
337
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
338 { 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
339 };
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
340
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
341
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
342 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
343 { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
344 { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
345 { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
346 { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
347 { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
348 { 0, 0 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
349 };
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
350
2875
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
351
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
352 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
353 { ngx_string("GET"), NGX_HTTP_GET},
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
354 { ngx_string("HEAD"), NGX_HTTP_HEAD },
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
355 { ngx_string("POST"), NGX_HTTP_POST },
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
356 { ngx_null_string, 0 }
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
357 };
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
358
6e1941b321b7 proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents: 2874
diff changeset
359
3667
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
360 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
361 { 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
362 { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
363 { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE },
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
364 { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING },
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
365 { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET },
3667
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
366 { 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
367 { 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
368 { 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
369 { ngx_null_string, 0 }
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
370 };
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
371
12bd9e26fadb use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
372
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
373 ngx_int_t
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
374 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
375 {
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
376 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
377
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
378 u = r->upstream;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
379
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
380 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
381 r->main->count++;
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
382 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
383 }
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
384
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
385 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
386 if (u == NULL) {
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
387 return NGX_ERROR;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
388 }
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 r->upstream = u;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
391
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
392 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
393 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
394 #if (NGX_THREADS)
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
395 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
396 #endif
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
397
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
398 #if (NGX_HTTP_CACHE)
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
399 r->cache = NULL;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
400 #endif
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
401
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
402 return NGX_OK;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
403 }
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
404
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 3004
diff changeset
405
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
406 void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
407 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
408 {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
409 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 c = r->connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 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
414 "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
415
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 if (c->read->timer_set) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 ngx_del_timer(c->read);
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 if (!c->write->active) {
531
c3bd8cdabb8f nginx-0.1.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 529
diff changeset
423 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
424 == NGX_ERROR)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 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
427 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 }
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 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
432 ngx_http_upstream_init_request(r);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
433 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
434
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
435
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
436 static void
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
437 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
438 {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
439 ngx_str_t *host;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
440 ngx_uint_t i;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
441 ngx_resolver_ctx_t *ctx, temp;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
442 ngx_http_cleanup_t *cln;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
443 ngx_http_upstream_t *u;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
444 ngx_http_core_loc_conf_t *clcf;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
445 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
446 ngx_http_upstream_main_conf_t *umcf;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
447
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
448 if (r->aio) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
449 return;
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
450 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
451
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
452 u = r->upstream;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
453
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
454 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
455
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
456 if (u->conf->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
457 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
458
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
459 rc = ngx_http_upstream_cache(r, u);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
460
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
461 if (rc == NGX_BUSY) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
462 r->write_event_handler = ngx_http_upstream_init_request;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
463 return;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
464 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
465
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
466 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
467
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
468 if (rc == NGX_DONE) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
469 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
470 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
471
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
472 if (rc != NGX_DECLINED) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
473 ngx_http_finalize_request(r, rc);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
474 return;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
475 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
476 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
477
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
478 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
479
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
480 u->store = (u->conf->store || u->conf->store_lengths);
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
481
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
482 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
483 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
484 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
485 }
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
486
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
487 if (r->request_body) {
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
488 u->request_bufs = r->request_body->bufs;
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
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
491 if (u->create_request(r) != NGX_OK) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 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
493 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
496 u->peer.local = u->conf->local;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
497
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
498 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
499
3053
0d253659da12 directio_alignment
Igor Sysoev <igor@sysoev.ru>
parents: 3052
diff changeset
500 u->output.alignment = clcf->directio_alignment;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 u->output.pool = r->pool;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 u->output.bufs.num = 1;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
503 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
504 u->output.output_filter = ngx_chain_writer;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 u->output.filter_ctx = &u->writer;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 u->writer.pool = r->pool;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
509 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
510
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
511 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
512 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
513 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
514 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
515 return;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
516 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
517
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
518 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
519
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
520 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
521 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
522 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
523 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
524 return;
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
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
527 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
528 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
530 cln = ngx_http_cleanup_add(r, 0);
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
531 if (cln == NULL) {
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
532 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
533 return;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
534 }
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
535
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
536 cln->handler = ngx_http_upstream_cleanup;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
537 cln->data = r;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
538 u->cleanup = &cln->handler;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
539
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
540 if (u->resolved == NULL) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
541
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
542 uscf = u->conf->upstream;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
543
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
544 } else {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
545
2422
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
546 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
547
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
548 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
549 != NGX_OK)
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
550 {
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
551 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
552 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
553 return;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
554 }
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 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
557
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
558 return;
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
559 }
7af1e5fe102c variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents: 2413
diff changeset
560
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
561 host = &u->resolved->host;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
562
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
563 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
564
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
565 uscfp = umcf->upstreams.elts;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
566
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
567 for (i = 0; i < umcf->upstreams.nelts; i++) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
568
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
569 uscf = uscfp[i];
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 if (uscf->host.len == host->len
2285
c77f4710595c fix r1913
Igor Sysoev <igor@sysoev.ru>
parents: 2268
diff changeset
572 && ((uscf->port == 0 && u->resolved->no_port)
1912
68b426b43c31 fix r1903
Igor Sysoev <igor@sysoev.ru>
parents: 1908
diff changeset
573 || uscf->port == u->resolved->port)
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
574 && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
575 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
576 goto found;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
577 }
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
3879
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
580 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
581 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
582 "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
583 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
584 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
585 return;
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
586 }
502a6b0acf3f fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents: 3713
diff changeset
587
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
588 temp.name = *host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
589
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
590 ctx = ngx_resolve_start(clcf->resolver, &temp);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
591 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
592 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
593 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
594 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
595 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
596
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
597 if (ctx == NGX_NO_RESOLVER) {
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
598 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
599 "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
600
3169
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_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
602 return;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
603 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
604
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
605 ctx->name = *host;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
606 ctx->type = NGX_RESOLVE_A;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
607 ctx->handler = ngx_http_upstream_resolve_handler;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
608 ctx->data = r;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
609 ctx->timeout = clcf->resolver_timeout;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
610
1959
4f16186f5603 quick resolving handles u->resolved->ctx by itself
Igor Sysoev <igor@sysoev.ru>
parents: 1958
diff changeset
611 u->resolved->ctx = ctx;
4f16186f5603 quick resolving handles u->resolved->ctx by itself
Igor Sysoev <igor@sysoev.ru>
parents: 1958
diff changeset
612
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
613 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
614 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
615 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
616 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
617 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
618 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
619
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
620 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
621 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
622
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
623 found:
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
624
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
625 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
626 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
627 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
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
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631 ngx_http_upstream_connect(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
635 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
636
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
637 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
638 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
639 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
640 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
641 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
642
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
643 c = r->cache;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
644
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
645 if (c == NULL) {
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
646
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
647 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
648 return NGX_DECLINED;
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
649 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
650
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
651 if (r->method & NGX_HTTP_HEAD) {
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
652 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
653 }
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
654
3698
d11227f0107f rename ngx_http_file_cache_create() to ngx_http_file_cache_new()
Igor Sysoev <igor@sysoev.ru>
parents: 3697
diff changeset
655 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
656 return NGX_ERROR;
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 (u->create_key(r) != NGX_OK) {
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
660 return NGX_ERROR;
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
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
663 /* TODO: add keys */
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
664
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
665 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
666
4045
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
667 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
668 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
4045
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
669 "%V_buffer_size %uz is not enough for cache key, "
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
670 "it should increased at least to %uz",
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
671 &u->conf->module, u->conf->buffer_size,
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
672 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
673
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
674 r->cache = NULL;
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
675 return NGX_DECLINED;
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
676 }
f1f194ceab16 fix segfault if cache key is larger than upstream buffer size
Igor Sysoev <igor@sysoev.ru>
parents: 3940
diff changeset
677
4248
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
678 u->cacheable = 1;
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
679
3917
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
680 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
681
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
682 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
683 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
684
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
685 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
686 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
687 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
688
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
689 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
690 break;
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
691 }
2a70484a6580 fix a broken cached response if bypass/no_cache directive values are different,
Igor Sysoev <igor@sysoev.ru>
parents: 3898
diff changeset
692
3697
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3692
diff changeset
693 c = r->cache;
3c442bd5597b ngx_http_file_cache_create()
Igor Sysoev <igor@sysoev.ru>
parents: 3692
diff changeset
694
3056
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
695 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
696 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
697 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
698
d22afd261e72 do not create cache key in AIO invocation
Igor Sysoev <igor@sysoev.ru>
parents: 3055
diff changeset
699 u->cache_status = NGX_HTTP_CACHE_MISS;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
700 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
701
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
702 rc = ngx_http_file_cache_open(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
703
2926
80a314b63c56 delete useless r->cache->uses
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
704 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
705 "http upstream cache: %i", rc);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
706
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
707 switch (rc) {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
708
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
709 case NGX_HTTP_CACHE_UPDATING:
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
710
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
711 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
712 u->cache_status = rc;
2927
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
713 rc = NGX_OK;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
714
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
715 } else {
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
716 rc = NGX_HTTP_CACHE_STALE;
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
717 }
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
718
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
719 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
720
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
721 case NGX_OK:
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
722 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
723 }
55ceaef03d34 proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents: 2926
diff changeset
724
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
725 switch (rc) {
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 case NGX_OK:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
728
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
729 rc = ngx_http_upstream_cache_send(r, u);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
730
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
731 if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
732 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
733 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
734
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
735 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
736
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
737 case NGX_HTTP_CACHE_STALE:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
738
2665
4d627567c324 fix r2664: ..._cache_valid did not work for stale responses
Igor Sysoev <igor@sysoev.ru>
parents: 2664
diff changeset
739 c->valid_sec = 0;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
740 u->buffer.start = NULL;
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
741 u->cache_status = NGX_HTTP_CACHE_EXPIRED;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
742
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_DECLINED:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
746
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
747 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
748 u->buffer.start = NULL;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
749
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
750 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
751 u->buffer.pos = u->buffer.start + c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
752 u->buffer.last = u->buffer.pos;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
753 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
754
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
755 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
756
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
757 case NGX_HTTP_CACHE_SCARCE:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
758
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
759 u->cacheable = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
760
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
761 break;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
762
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
763 case NGX_AGAIN:
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
764
3055
92b6cfaa3c27 fix sending a cached file using AIO
Igor Sysoev <igor@sysoev.ru>
parents: 3053
diff changeset
765 return NGX_BUSY;
3052
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
766
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
767 case NGX_ERROR:
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
768
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
769 return NGX_ERROR;
6060225e9261 FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents: 3050
diff changeset
770
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
771 default:
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
772
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
773 /* 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
774
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
775 u->cache_status = NGX_HTTP_CACHE_HIT;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
776
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
777 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
778 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
779
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
780 r->cached = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
781
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
782 return NGX_DECLINED;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
783 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
784
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
785
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
786 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
787 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
788 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
789 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
790 ngx_http_cache_t *c;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
791
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
792 r->cached = 1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
793 c = r->cache;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
794
3369
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
795 if (c->header_start == c->body_start) {
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
796 r->http_version = NGX_HTTP_VERSION_9;
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
797 return ngx_http_cache_send(r);
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
798 }
479468a7d982 fix handling cached HTTP/0.9 response
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
799
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
800 /* TODO: cache stack */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
801
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
802 u->buffer = *c->buf;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
803 u->buffer.pos += c->header_start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
804
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
805 ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
806
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
807 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
808 sizeof(ngx_table_elt_t))
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
809 != NGX_OK)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
810 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
811 return NGX_ERROR;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
814 rc = u->process_header(r);
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 (rc == NGX_OK) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
817
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
818 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
819 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
820 }
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 return ngx_http_cache_send(r);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
823 }
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_ERROR) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
826 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
827 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
828
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
829 /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */
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 /* TODO: delete file */
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 return rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
834 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
835
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
836 #endif
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
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
839 static void
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
840 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
841 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
842 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
843 ngx_http_upstream_t *u;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
844 ngx_http_upstream_resolved_t *ur;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
845
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
846 r = ctx->data;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
847
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
848 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
849 ur = u->resolved;
1658
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 if (ctx->state) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
852 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
853 "%V could not be resolved (%i: %s)",
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
854 &ctx->name, ctx->state,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
855 ngx_resolver_strerror(ctx->state));
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 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
858 return;
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
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
861 ur->naddrs = ctx->naddrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
862 ur->addrs = ctx->addrs;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
863
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
864 #if (NGX_DEBUG)
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
865 {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
866 in_addr_t addr;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
867 ngx_uint_t i;
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 for (i = 0; i < ctx->naddrs; i++) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
870 addr = ntohl(ur->addrs[i]);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
871
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
872 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
873 "name was resolved to %ud.%ud.%ud.%ud",
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
874 (addr >> 24) & 0xff, (addr >> 16) & 0xff,
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
875 (addr >> 8) & 0xff, addr & 0xff);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
876 }
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 #endif
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
879
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
880 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
881 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
882 NGX_HTTP_INTERNAL_SERVER_ERROR);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
883 return;
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
884 }
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 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
887 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
888
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
889 ngx_http_upstream_connect(r, u);
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
890 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
891
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
892
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
893 static void
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
894 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
895 {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
896 ngx_connection_t *c;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
897 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
898 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
899 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
900
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
901 c = ev->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
902 r = c->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
903
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
904 u = r->upstream;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
905 c = r->connection;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
906
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
907 ctx = c->log->data;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
908 ctx->current_request = r;
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 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
911 "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
912
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
913 if (ev->write) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
914 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
915
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
916 } else {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
917 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
918 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
919
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
920 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
921 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
922
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
923
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
924 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
925 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
926 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
927 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
928 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
929
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
930
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
931 static void
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
932 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
933 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
934 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
935 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
936
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 static void
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
939 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
940 ngx_event_t *ev)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 int n;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 char buf[1];
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
944 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
945 ngx_int_t event;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
946 ngx_connection_t *c;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947 ngx_http_upstream_t *u;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
949 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
950 "http upstream check client, write event:%d, \"%V\"",
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
951 ev->write, &r->uri);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
952
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
953 c = r->connection;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
954 u = r->upstream;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
955
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
956 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
957 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
958
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
959 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
960
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
961 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
962 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
963 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
964 return;
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
965 }
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
966 }
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
967
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
968 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
969 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
970 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
971 }
2807
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
972
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
973 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
974 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
975
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
976 #if (NGX_HAVE_KQUEUE)
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
977
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
978 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
979
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 if (!ev->pending_eof) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
981 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
982 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 ev->eof = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
985 c->error = 1;
479
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 (ev->kq_errno) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
988 ev->error = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
989 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
991 if (!u->cacheable && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
4246
d3568507db51 Merging r4132, r4134, r4143, r4183, r4191, r4199:
Igor Sysoev <igor@sysoev.ru>
parents: 4045
diff changeset
993 "kevent() reported that client prematurely closed "
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
994 "connection, so upstream connection is closed too");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997 return;
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1000 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
4246
d3568507db51 Merging r4132, r4134, r4143, r4183, r4191, r4199:
Igor Sysoev <igor@sysoev.ru>
parents: 4045
diff changeset
1001 "kevent() reported that client prematurely closed "
d3568507db51 Merging r4132, r4134, r4143, r4183, r4191, r4199:
Igor Sysoev <igor@sysoev.ru>
parents: 4045
diff changeset
1002 "connection");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1003
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 if (u->peer.connection == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 NGX_HTTP_CLIENT_CLOSED_REQUEST);
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 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1011
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1012 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1014 n = recv(c->fd, buf, 1, MSG_PEEK);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016 err = ngx_socket_errno;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017
1109
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1018 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1019 "http upstream recv(): %d", n);
1402dbb554c4 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
1020
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1023 }
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 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
1026
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1027 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
1028
6ad4bba6313e delete level event of appropriate type, this should fix select()'s EBADF,
Igor Sysoev <igor@sysoev.ru>
parents: 2805
diff changeset
1029 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
1030 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032 return;
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 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1036 if (n > 0) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1037 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 if (n == -1) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1041 if (err == NGX_EAGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 return;
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 ev->error = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1047 } else { /* n == 0 */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048 err = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1049 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1050
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
1051 ev->eof = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
1052 c->error = 1;
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
1053
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
1054 if (!u->cacheable && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055 ngx_log_error(NGX_LOG_INFO, ev->log, err,
4246
d3568507db51 Merging r4132, r4134, r4143, r4183, r4191, r4199:
Igor Sysoev <igor@sysoev.ru>
parents: 4045
diff changeset
1056 "client prematurely closed connection, "
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057 "so upstream connection is closed too");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1058 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1059 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1060 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1061 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1062
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1063 ngx_log_error(NGX_LOG_INFO, ev->log, err,
4246
d3568507db51 Merging r4132, r4134, r4143, r4183, r4191, r4199:
Igor Sysoev <igor@sysoev.ru>
parents: 4045
diff changeset
1064 "client prematurely closed connection");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1065
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1066 if (u->peer.connection == NULL) {
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 }
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
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1073 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1074 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
1075 {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1076 ngx_int_t rc;
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1077 ngx_time_t *tp;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1078 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1080 r->connection->log->action = "connecting to upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1081
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1082 r->connection->single_connection = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1083
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1084 if (u->state && u->state->response_sec) {
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1085 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1086 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
1087 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
1088 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1089
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1090 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
1091 if (u->state == NULL) {
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1092 ngx_http_upstream_finalize_request(r, u,
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1093 NGX_HTTP_INTERNAL_SERVER_ERROR);
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1094 return;
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1095 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1096
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1097 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
1098
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1099 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1100 u->state->response_sec = tp->sec;
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
1101 u->state->response_msec = tp->msec;
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1102
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1103 rc = ngx_event_connect_peer(&u->peer);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 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
1106 "http upstream connect: %i", rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1108 if (rc == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1111 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113
1707
f3188f6eae1f $upstream_addr did not contain last address, the bug was introduced in r1659
Igor Sysoev <igor@sysoev.ru>
parents: 1706
diff changeset
1114 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
1115
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1116 if (rc == NGX_BUSY) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1117 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
1118 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
1119 return;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1120 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
1121
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
1122 if (rc == NGX_DECLINED) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 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
1124 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1125 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1127 /* rc == NGX_OK || rc == NGX_AGAIN */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1128
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129 c = u->peer.connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1131 c->data = r;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1132
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1133 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
1134 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
1135
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1136 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
1137 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
1138
1397
6c25a49e548a upstream sendfile bit was overridden by r->connection->sendfile
Igor Sysoev <igor@sysoev.ru>
parents: 1378
diff changeset
1139 c->sendfile &= r->connection->sendfile;
1958
3e9e4581fbba fix peer sendfile capability
Igor Sysoev <igor@sysoev.ru>
parents: 1947
diff changeset
1140 u->output.sendfile = c->sendfile;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1142 c->pool = r->pool;
2847
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1143 c->log = r->connection->log;
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1144 c->read->log = c->log;
3e10674139e4 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2824
diff changeset
1145 c->write->log = c->log;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1146
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147 /* 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
1148
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149 u->writer.out = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 u->writer.last = &u->writer.out;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 u->writer.connection = c;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1152 u->writer.limit = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154 if (u->request_sent) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1155 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
1156 ngx_http_upstream_finalize_request(r, u,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1157 NGX_HTTP_INTERNAL_SERVER_ERROR);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1158 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1159 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161
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
1162 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
1163 && 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
1164 && 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
1165 && 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
1166 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1167 /*
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1168 * 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
1169 * the subrequests should allocate their own temporay bufs
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1170 */
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1171
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1172 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
1173 if (u->output.free == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1174 ngx_http_upstream_finalize_request(r, u,
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1175 NGX_HTTP_INTERNAL_SERVER_ERROR);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1176 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1177 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1178
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1179 u->output.free->buf = r->request_body->buf;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1180 u->output.free->next = NULL;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1181 u->output.allocated = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1182
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1183 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
1184 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
1185 r->request_body->buf->tag = u->output.tag;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1186 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1187
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1188 u->request_sent = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1189
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1190 if (rc == NGX_AGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1191 ngx_add_timer(c->write, u->conf->connect_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1192 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1193 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1194
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1195 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1196
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
1197 if (u->ssl && c->ssl == NULL) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1198 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
1199 return;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1200 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1201
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1202 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1203
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1204 ngx_http_upstream_send_request(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1205 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1206
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1207
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1208 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1209
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1210 static void
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1211 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
1212 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
1213 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
1214 ngx_int_t rc;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1215
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1216 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
1217 NGX_SSL_BUFFER|NGX_SSL_CLIENT)
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2463
diff changeset
1218 != NGX_OK)
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1219 {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1220 ngx_http_upstream_finalize_request(r, u,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1221 NGX_HTTP_INTERNAL_SERVER_ERROR);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1222 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1223 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1224
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1225 c->sendfile = 0;
619
7a16e281c01f nginx-0.3.31-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 615
diff changeset
1226 u->output.sendfile = 0;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1227
2184
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1228 if (u->conf->ssl_session_reuse) {
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1229 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
1230 ngx_http_upstream_finalize_request(r, u,
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1231 NGX_HTTP_INTERNAL_SERVER_ERROR);
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1232 return;
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1233 }
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1234 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1235
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
1236 r->connection->log->action = "SSL handshaking to upstream";
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
1237
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1238 rc = ngx_ssl_handshake(c);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1239
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1240 if (rc == NGX_AGAIN) {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1241 c->ssl->handler = ngx_http_upstream_ssl_handshake;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1242 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1243 }
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 ngx_http_upstream_ssl_handshake(c);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1246 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1247
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1248
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1249 static void
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1250 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
1251 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1252 ngx_http_request_t *r;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1253 ngx_http_upstream_t *u;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1254
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1255 r = c->data;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1256 u = r->upstream;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1257
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1258 if (c->ssl->handshaked) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1259
2184
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1260 if (u->conf->ssl_session_reuse) {
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1261 u->peer.save_session(&u->peer, u->peer.data);
274c0f3ea600 proxy_ssl_session_reuse
Igor Sysoev <igor@sysoev.ru>
parents: 2183
diff changeset
1262 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
1263
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1264 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
1265 c->read->handler = ngx_http_upstream_handler;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1266
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1267 ngx_http_upstream_send_request(r, u);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1268
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1269 return;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1270 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1271
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1272 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
1273
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1274 }
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 #endif
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1277
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1278
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1279 static ngx_int_t
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1280 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
1281 {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1282 ngx_chain_t *cl;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1283
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1284 if (u->reinit_request(r) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1285 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1286 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1287
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1288 ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1289
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1290 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
1291 sizeof(ngx_table_elt_t))
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1292 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1293 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1294 return NGX_ERROR;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1295 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1296
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1297 /* reinit the request chain */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1298
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1299 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
1300 cl->buf->pos = cl->buf->start;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1301 cl->buf->file_pos = 0;
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
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1304 /* reinit the subrequest's ngx_output_chain() context */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1305
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1306 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
1307 && r != r->main && u->output.buf)
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1308 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1309 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
1310 if (u->output.free == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1311 return NGX_ERROR;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1312 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1313
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1314 u->output.free->buf = u->output.buf;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1315 u->output.free->next = NULL;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1316
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1317 u->output.buf->pos = u->output.buf->start;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
1318 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
1319 }
479
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 u->output.buf = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1322 u->output.in = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1323 u->output.busy = NULL;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1324
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1325 /* reinit u->buffer */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1326
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1327 u->buffer.pos = u->buffer.start;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1328
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1329 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1330
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1331 if (r->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1332 u->buffer.pos += r->cache->header_start;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1333 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1334
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1335 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1336
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1337 u->buffer.last = u->buffer.pos;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1338
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1339 return NGX_OK;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1340 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1341
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1342
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1343 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1344 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
1345 {
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1346 ngx_int_t rc;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1347 ngx_connection_t *c;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1348
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1349 c = u->peer.connection;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1350
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1351 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
1352 "http upstream send request");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1353
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1354 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
1355 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
1356 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1357 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1358
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1359 c->log->action = "sending request to upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1360
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1361 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
1362
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1363 u->request_sent = 1;
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 if (rc == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1366 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
1367 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1368 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1369
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1370 if (c->write->timer_set) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1371 ngx_del_timer(c->write);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1372 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1373
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1374 if (rc == NGX_AGAIN) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1375 ngx_add_timer(c->write, u->conf->send_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1376
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1377 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
1378 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1379 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1380 return;
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1383 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1384 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1385
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1386 /* rc == NGX_OK */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1387
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1388 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1389 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1390 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
1391 ngx_tcp_push_n " failed");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1392 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1393 NGX_HTTP_INTERNAL_SERVER_ERROR);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1394 return;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1395 }
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 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1398 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1399
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1400 ngx_add_timer(c->read, u->conf->read_timeout);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1401
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1402 #if 1
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1403 if (c->read->ready) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1404
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1405 /* post aio operation */
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 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1408 * TODO comment
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1409 * 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
1410 * of ngx_http_upstream_connect() CHECK IT !!!
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1411 * 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
1412 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1413
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1414 ngx_http_upstream_process_header(r, u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1415 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1416 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1417 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1418
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1419 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
1420
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1421 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
1422 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1423 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1424 return;
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 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1427
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1428
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1429 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1430 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
1431 ngx_http_upstream_t *u)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1432 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1433 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1434
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1435 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1436
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1437 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
1438 "http upstream send request handler");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1439
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1440 if (c->write->timedout) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1441 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
1442 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1443 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1444
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1445 #if (NGX_HTTP_SSL)
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1446
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
1447 if (u->ssl && c->ssl == NULL) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1448 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
1449 return;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1450 }
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1451
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1452 #endif
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1453
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1454 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
1455 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
1456
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1457 (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
1458
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1459 return;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1460 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
1461
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1462 ngx_http_upstream_send_request(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1463 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1464
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1465
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1466 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1467 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
1468 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1469 ssize_t n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1470 ngx_int_t rc;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1471 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1472
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1473 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1474
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1475 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
1476 "http upstream process header");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1477
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
1478 c->log->action = "reading response header from upstream";
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1479
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1480 if (c->read->timedout) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1481 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
1482 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1483 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
1484
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1485 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
1486 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
1487 return;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1488 }
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1489
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1490 if (u->buffer.start == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1491 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
1492 if (u->buffer.start == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1493 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1494 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1495 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1496 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1497
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1498 u->buffer.pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1499 u->buffer.last = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1500 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
1501 u->buffer.temporary = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1502
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1503 u->buffer.tag = u->output.tag;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1504
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
1505 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
1506 sizeof(ngx_table_elt_t))
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1507 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1508 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1509 ngx_http_upstream_finalize_request(r, u,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1510 NGX_HTTP_INTERNAL_SERVER_ERROR);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1511 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1512 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1513
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1514 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1515
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1516 if (r->cache) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1517 u->buffer.pos += r->cache->header_start;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1518 u->buffer.last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1519 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1520 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1521 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1522
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1523 for ( ;; ) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1524
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1525 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
1526
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1527 if (n == NGX_AGAIN) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1528 #if 0
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1529 ngx_add_timer(rev, u->read_timeout);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1530 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1531
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1532 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
1533 ngx_http_upstream_finalize_request(r, u,
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1534 NGX_HTTP_INTERNAL_SERVER_ERROR);
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1535 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1536 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1537
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1538 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1539 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1540
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1541 if (n == 0) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1542 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
1543 "upstream prematurely closed connection");
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1544 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1545
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1546 if (n == NGX_ERROR || n == 0) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1547 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
1548 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1549 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1550
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1551 u->buffer.last += n;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1552
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1553 #if 0
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1554 u->valid_header_in = 0;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1555
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1556 u->peer.cached = 0;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1557 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1558
2360
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1559 rc = u->process_header(r);
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 if (rc == NGX_AGAIN) {
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1562
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1563 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
1564 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
1565 "upstream sent too big header");
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1566
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1567 ngx_http_upstream_next(r, u,
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1568 NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1569 return;
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1570 }
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1571
64854406b1f9 read and process upstream header in cycle,
Igor Sysoev <igor@sysoev.ru>
parents: 2308
diff changeset
1572 continue;
479
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 break;
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1578 if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1579 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
1580 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1581 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1582
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
1583 if (rc == NGX_ERROR) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1584 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1585 NGX_HTTP_INTERNAL_SERVER_ERROR);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1586 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1587 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1588
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1589 /* rc == NGX_OK */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1590
3401
9e7926763f87 allow to handle 301/302 in error_page
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
1591 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
1592
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1593 if (r->subrequest_in_memory) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1594 u->buffer.last = u->buffer.pos;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1595 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1596
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1597 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
1598 return;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1599 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
1600
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1601 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
1602 return;
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1603 }
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1604 }
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1605
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1606 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
1607 return;
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
1608 }
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
1609
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1610 if (!r->subrequest_in_memory) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1611 ngx_http_upstream_send_response(r, u);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1612 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1613 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1614
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1615 /* subrequest content in memory */
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1616
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1617 if (u->input_filter == NULL) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1618 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1619 u->input_filter = ngx_http_upstream_non_buffered_filter;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1620 u->input_filter_ctx = r;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1621 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1622
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1623 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1624 ngx_http_upstream_finalize_request(r, u,
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1625 NGX_HTTP_INTERNAL_SERVER_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1626 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1627 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1628
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1629 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
1630
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1631 if (n) {
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1632 u->buffer.last -= n;
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1633
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1634 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1635
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1636 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
1637 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1638 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1639 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1640
2308
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1641 if (u->length == 0) {
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1642 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
1643 return;
3f98400e31e9 memcached response was stored in variable with END
Igor Sysoev <igor@sysoev.ru>
parents: 2285
diff changeset
1644 }
777
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
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
1647 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
1648
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1649 ngx_http_upstream_process_body_in_memory(r, u);
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1650 }
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
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1653 static ngx_int_t
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1654 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
1655 {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1656 ngx_uint_t status;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1657 ngx_http_upstream_next_t *un;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1658
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1659 status = u->headers_in.status_n;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1660
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1661 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
1662
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1663 if (status != un->status) {
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1664 continue;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1665 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1666
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1667 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
1668 ngx_http_upstream_next(r, u, un->mask);
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1669 return NGX_OK;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1670 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1671
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1672 #if (NGX_HTTP_CACHE)
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1673
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1674 if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1675 && (u->conf->cache_use_stale & un->mask))
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1676 {
2824
d106509491b5 fix building --without-http-cache
Igor Sysoev <igor@sysoev.ru>
parents: 2807
diff changeset
1677 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
1678
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1679 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
1680
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1681 if (rc == NGX_OK) {
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
1682 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
1683 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
1684 }
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1685
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
1686 ngx_http_upstream_finalize_request(r, u, rc);
2268
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1687 return NGX_OK;
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1688 }
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 #endif
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1691 }
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1692
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1693 return NGX_DECLINED;
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
33556140681a *) ngx_http_upstream_test_next()
Igor Sysoev <igor@sysoev.ru>
parents: 2267
diff changeset
1697 static ngx_int_t
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1698 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
1699 ngx_http_upstream_t *u)
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1700 {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1701 ngx_int_t status;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1702 ngx_uint_t i;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1703 ngx_table_elt_t *h;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1704 ngx_http_err_page_t *err_page;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1705 ngx_http_core_loc_conf_t *clcf;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1706
2441
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1707 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
1708
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1709 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
1710 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
1711 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
1712 }
0c117a89f399 in miss case memcached module returned END instead of default 404 page body
Igor Sysoev <igor@sysoev.ru>
parents: 2422
diff changeset
1713
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1714 if (!u->conf->intercept_errors) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1715 return NGX_DECLINED;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1716 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1717
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1718 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
1719
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1720 if (clcf->error_pages == NULL) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1721 return NGX_DECLINED;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1722 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1723
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1724 err_page = clcf->error_pages->elts;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1725 for (i = 0; i < clcf->error_pages->nelts; i++) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1726
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1727 if (err_page[i].status == status) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1728
2953
aa12525236da fix segfault if there is error_page 401, proxy_intercept_errors is on
Igor Sysoev <igor@sysoev.ru>
parents: 2952
diff changeset
1729 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
1730 && 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
1731 {
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1732 h = ngx_list_push(&r->headers_out.headers);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1733
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1734 if (h == NULL) {
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1735 ngx_http_upstream_finalize_request(r, u,
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1736 NGX_HTTP_INTERNAL_SERVER_ERROR);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1737 return NGX_OK;
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1738 }
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1739
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1740 *h = *u->headers_in.www_authenticate;
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 r->headers_out.www_authenticate = h;
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
3706
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1745 #if (NGX_HTTP_CACHE)
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1746
3709
64777690c697 fix r3707: cache node should be freed be a response is not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3708
diff changeset
1747 if (r->cache) {
3706
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1748 time_t valid;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1749
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1750 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
1751
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1752 if (valid) {
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1753 r->cache->valid_sec = ngx_time() + valid;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1754 r->cache->error = status;
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1755 }
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1756
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
1757 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
1758 }
ea908f6ae499 an intercepted error code was not cached
Igor Sysoev <igor@sysoev.ru>
parents: 3705
diff changeset
1759 #endif
2267
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1760 ngx_http_upstream_finalize_request(r, u, status);
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1761
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1762 return NGX_OK;
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 }
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 return NGX_DECLINED;
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
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1769
920be89a3d2d ngx_http_upstream_intercept_errors()
Igor Sysoev <igor@sysoev.ru>
parents: 2244
diff changeset
1770 static ngx_int_t
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1771 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
1772 {
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1773 int err;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1774 socklen_t len;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1775
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1776 #if (NGX_HAVE_KQUEUE)
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1777
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1778 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1779 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
1780 c->log->action = "connecting to upstream";
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1781 (void) ngx_connection_error(c, c->write->kq_errno,
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1782 "kevent() reported that connect() failed");
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1783 return NGX_ERROR;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1784 }
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1785
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1786 } else
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1787 #endif
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1788 {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1789 err = 0;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1790 len = sizeof(int);
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1791
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1792 /*
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1793 * 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
1794 * Solaris returns -1 and sets errno
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1795 */
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1796
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1797 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
1798 == -1)
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1799 {
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1800 err = ngx_errno;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1801 }
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1802
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1803 if (err) {
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, err, "connect() failed");
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1806 return NGX_ERROR;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1162
diff changeset
1807 }
1153
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1808 }
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 return NGX_OK;
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1811 }
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1812
c843f3df3b85 separate ngx_http_upstream_test_connect() and
Igor Sysoev <igor@sysoev.ru>
parents: 1143
diff changeset
1813
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1814 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1815 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
1816 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1817 ngx_str_t *uri, args;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1818 ngx_uint_t i, flags;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1819 ngx_list_part_t *part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1820 ngx_table_elt_t *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1821 ngx_http_upstream_header_t *hh;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1822 ngx_http_upstream_main_conf_t *umcf;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1823
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1824 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
1825
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
1826 if (u->headers_in.x_accel_redirect
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
1827 && !(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
1828 {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1829 ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1830
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1831 part = &u->headers_in.headers.part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1832 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1833
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1834 for (i = 0; /* void */; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1835
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1836 if (i >= part->nelts) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1837 if (part->next == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1838 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1839 }
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 part = part->next;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1842 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1843 i = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1844 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1845
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1846 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
1847 h[i].lowcase_key, h[i].key.len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1848
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1849 if (hh && hh->redirect) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1850 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
1851 ngx_http_finalize_request(r,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1852 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1853 return NGX_DONE;
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 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1856 }
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 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
1859 ngx_str_null(&args);
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3120
diff changeset
1860 flags = NGX_HTTP_LOG_UNSAFE;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1861
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1862 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
1863 ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1864 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1865 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1866
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1867 if (r->method != NGX_HTTP_HEAD) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1868 r->method = NGX_HTTP_GET;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1871 r->valid_unparsed_uri = 0;
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 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
1874 ngx_http_finalize_request(r, NGX_DONE);
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1875 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1876 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1877
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1878 part = &u->headers_in.headers.part;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1879 h = part->elts;
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 for (i = 0; /* void */; i++) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1882
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1883 if (i >= part->nelts) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1884 if (part->next == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1885 break;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1886 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1887
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1888 part = part->next;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1889 h = part->elts;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1890 i = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1891 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1892
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1893 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
1894 h[i].lowcase_key, h[i].key.len))
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1895 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1896 continue;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1897 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1898
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1899 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
1900 h[i].lowcase_key, h[i].key.len);
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 if (hh) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1903 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
1904 ngx_http_upstream_finalize_request(r, u,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1905 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1906 return NGX_DONE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1907 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1908
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1909 continue;
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 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
1913 ngx_http_upstream_finalize_request(r, u,
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1914 NGX_HTTP_INTERNAL_SERVER_ERROR);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1915 return NGX_DONE;
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 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1918
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1919 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
1920 r->headers_out.server->hash = 0;
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 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
1924 r->headers_out.date->hash = 0;
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
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1927 r->headers_out.status = u->headers_in.status_n;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1928 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
1929
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1930 u->headers_in.content_length_n = r->headers_out.content_length_n;
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 if (r->headers_out.content_length_n != -1) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1933 u->length = (size_t) r->headers_out.content_length_n;
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 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1936 u->length = NGX_MAX_SIZE_T_VALUE;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1937 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1938
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
1939 return NGX_OK;
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
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1943 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1944 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
1945 ngx_http_upstream_t *u)
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1946 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1947 size_t size;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1948 ssize_t n;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1949 ngx_buf_t *b;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1950 ngx_event_t *rev;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1951 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1952
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1953 c = u->peer.connection;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
1954 rev = c->read;
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1955
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1956 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1957 "http upstream process body on memory");
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1958
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1959 if (rev->timedout) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1960 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1961 ngx_http_upstream_finalize_request(r, u, NGX_ETIMEDOUT);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1962 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1963 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1964
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1965 b = &u->buffer;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1966
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1967 for ( ;; ) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1968
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1969 size = b->end - b->last;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1970
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1971 if (size == 0) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1972 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
3708
c1385a3b8093 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3706
diff changeset
1973 "upstream buffer is too small to read response");
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1974 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1975 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1976 }
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 n = c->recv(c, b->last, size);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1979
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1980 if (n == NGX_AGAIN) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1981 break;
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 if (n == 0 || n == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1985 ngx_http_upstream_finalize_request(r, u, n);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1986 return;
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
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1989 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
1990
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1991 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1992 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1993 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1994 }
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 if (!rev->ready) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
1997 break;
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 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2000
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2001 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2002 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2003 return;
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2004 }
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2005
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2006 if (rev->active) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2007 ngx_add_timer(rev, u->conf->read_timeout);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2008
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2009 } else if (rev->timer_set) {
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2010 ngx_del_timer(rev);
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 757
diff changeset
2011 }
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2012 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2013
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2014
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2015 static void
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2016 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
2017 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2018 int tcp_nodelay;
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2019 ssize_t n;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2020 ngx_int_t rc;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2021 ngx_event_pipe_t *p;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2022 ngx_connection_t *c;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2023 ngx_http_core_loc_conf_t *clcf;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
2024
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2025 rc = ngx_http_send_header(r);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2026
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2027 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
2028 ngx_http_upstream_finalize_request(r, u, rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2029 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2030 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2031
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2032 c = r->connection;
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2033
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2034 if (r->header_only) {
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2035
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2036 if (u->cacheable || u->store) {
2704
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2037
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2038 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
2039 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
2040 ngx_shutdown_socket_n " failed");
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2041 }
ac1e2e199c9f shutdown client connection for cacheable header only responses
Igor Sysoev <igor@sysoev.ru>
parents: 2703
diff changeset
2042
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2043 r->read_event_handler = ngx_http_request_empty_handler;
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2044 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
2045 c->error = 1;
2701
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2046
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2047 } else {
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2048 ngx_http_upstream_finalize_request(r, u, rc);
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2049 return;
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2050 }
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2051 }
756f73ca1e39 support HEAD in proxy cache
Igor Sysoev <igor@sysoev.ru>
parents: 2692
diff changeset
2052
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2053 u->header_sent = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2054
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
2055 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
2056 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
2057 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
2058 }
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2059
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2060 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
2061
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
2062 if (!u->buffering) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2063
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2064 if (u->input_filter == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2065 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
2066 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
2067 u->input_filter_ctx = r;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2068 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2069
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2070 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
2071 r->write_event_handler =
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2072 ngx_http_upstream_process_non_buffered_downstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2073
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2074 r->limit_rate = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2075
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2076 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
2077 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2078 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2079 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2080
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2081 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
2082 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
2083
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2084 tcp_nodelay = 1;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2085
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2086 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2087 (const void *) &tcp_nodelay, sizeof(int)) == -1)
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2088 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2089 ngx_connection_error(c, ngx_socket_errno,
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2090 "setsockopt(TCP_NODELAY) failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2091 ngx_http_upstream_finalize_request(r, u, 0);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2092 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2093 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2094
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2095 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2096 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2097
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2098 n = u->buffer.last - u->buffer.pos;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2099
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2100 if (n) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2101 u->buffer.last = u->buffer.pos;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2102
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2103 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2104
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2105 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
2106 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2107 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2108 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2109
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2110 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
2111
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2112 } else {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2113 u->buffer.pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2114 u->buffer.last = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2115
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2116 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
2117 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2118 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2119 }
1468
491e5059ea19 read EOF of header only responses in non-buffered proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1397
diff changeset
2120
491e5059ea19 read EOF of header only responses in non-buffered proxying
Igor Sysoev <igor@sysoev.ru>
parents: 1397
diff changeset
2121 if (u->peer.connection->read->ready) {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2122 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
2123 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2124 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2125
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2126 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2127 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2128
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2129 /* TODO: preallocate event_pipe bufs, look "Content-Length" */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2130
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2131 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2132
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2133 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
2134 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
2135 r->cache->file.fd = NGX_INVALID_FILE;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2136 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2137
3699
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2138 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
2139
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2140 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
2141 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
2142 return;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2143
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2144 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
2145 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
2146 break;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2147
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2148 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
2149
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2150 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
2151
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2152 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
2153 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
2154 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
2155
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2156 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
2157 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
2158 return;
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2159 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2160 }
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2161
b0a0686a85bb proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents: 3698
diff changeset
2162 break;
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
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2165 if (u->cacheable) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2166 time_t now, valid;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2167
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2168 now = ngx_time();
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2169
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2170 valid = r->cache->valid_sec;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2171
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2172 if (valid == 0) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2173 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
2174 u->headers_in.status_n);
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2175 if (valid) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2176 r->cache->valid_sec = now + valid;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2177 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2178 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
2179
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2180 if (valid) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2181 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
2182 r->cache->date = now;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2183 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
2184
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2185 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
2186
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2187 } else {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2188 u->cacheable = 0;
2703
3b6afa999c2f support 304 for cacheable responses
Igor Sysoev <igor@sysoev.ru>
parents: 2701
diff changeset
2189 r->headers_out.last_modified_time = -1;
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2190 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2191 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2192
2690
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2193 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2194 "http cacheable: %d", u->cacheable);
d3cffe32b930 add debug logging
Igor Sysoev <igor@sysoev.ru>
parents: 2669
diff changeset
2195
3083
ffe8bfb38184 clean cache updating state if a response has uncacheable code or
Igor Sysoev <igor@sysoev.ru>
parents: 3056
diff changeset
2196 if (u->cacheable == 0 && r->cache) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
2197 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
2198 }
ffe8bfb38184 clean cache updating state if a response has uncacheable code or
Igor Sysoev <igor@sysoev.ru>
parents: 3056
diff changeset
2199
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2200 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2201
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2202 p = u->pipe;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2203
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2204 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
2205 p->output_ctx = r;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2206 p->tag = u->output.tag;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2207 p->bufs = u->conf->bufs;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2208 p->busy_size = u->conf->busy_buffers_size;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2209 p->upstream = u->peer.connection;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2210 p->downstream = c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2211 p->pool = r->pool;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2212 p->log = c->log;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2213
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2214 p->cacheable = u->cacheable || u->store;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2215
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2216 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
2217 if (p->temp_file == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2218 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2219 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2220 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2221
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2222 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
2223 p->temp_file->file.log = c->log;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2224 p->temp_file->path = u->conf->temp_path;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2225 p->temp_file->pool = r->pool;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2226
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2227 if (p->cacheable) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2228 p->temp_file->persistent = 1;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2229
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2230 } else {
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
2231 p->temp_file->log_level = NGX_LOG_WARN;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2232 p->temp_file->warn = "an upstream response is buffered "
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2233 "to a temporary file";
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2234 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2235
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2236 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
2237 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
2238
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
2239 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
2240 if (p->preread_bufs == NULL) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2241 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2242 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2243 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2244
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2245 p->preread_bufs->buf = &u->buffer;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2246 p->preread_bufs->next = NULL;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2247 u->buffer.recycled = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2248
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2249 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
2250
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
2251 if (u->cacheable) {
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2252
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2253 p->buf_to_file = ngx_calloc_buf(r->pool);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2254 if (p->buf_to_file == NULL) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2255 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2256 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2257 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2258
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2259 p->buf_to_file->pos = u->buffer.start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2260 p->buf_to_file->last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2261 p->buf_to_file->temporary = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2262 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2263
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2264 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2265 /* the posted aio operation may currupt a shadow buffer */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2266 p->single_buf = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2267 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2268
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2269 /* 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
2270 p->free_bufs = 1;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2271
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2272 /*
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2273 * 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
2274 * as though these bytes were read
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2275 */
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2276 u->buffer.last = u->buffer.pos;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2277
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2278 if (u->conf->cyclic_temp_file) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2279
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2280 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2281 * 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
2282 * 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
2283 * 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
2284 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2285
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2286 p->cyclic_temp_file = 1;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2287 c->sendfile = 0;
479
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 } else {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2290 p->cyclic_temp_file = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2291 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2292
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2293 p->read_timeout = u->conf->read_timeout;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2294 p->send_timeout = clcf->send_timeout;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2295 p->send_lowat = clcf->send_lowat;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2296
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2297 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
2298 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
2299
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2300 ngx_http_upstream_process_upstream(r, u);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2301 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2302
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2303
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2304 static void
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2305 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
2306 {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2307 ngx_event_t *wev;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2308 ngx_connection_t *c;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2309 ngx_http_upstream_t *u;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2310
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2311 c = r->connection;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2312 u = r->upstream;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2313 wev = c->write;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2314
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2315 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
2316 "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
2317
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2318 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
2319
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2320 if (wev->timedout) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2321 c->timedout = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2322 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
4045
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
2323 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
2324 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2325 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2326
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2327 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
2328 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2329
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2330
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2331 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2332 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
2333 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
2334 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2335 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2336
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2337 c = u->peer.connection;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2338
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2339 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
2340 "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
2341
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2342 c->log->action = "reading upstream";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2343
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2344 if (c->read->timedout) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2345 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
2346 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
2347 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2348 }
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_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
2351 }
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
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2354 static void
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2355 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
2356 ngx_uint_t do_write)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2357 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2358 size_t size;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2359 ssize_t n;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2360 ngx_buf_t *b;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2361 ngx_int_t rc;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2362 ngx_connection_t *downstream, *upstream;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2363 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2364 ngx_http_core_loc_conf_t *clcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2365
756
d904b5cb3bba fix building introduced by previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 755
diff changeset
2366 u = r->upstream;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2367 downstream = r->connection;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2368 upstream = u->peer.connection;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2369
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2370 b = &u->buffer;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2371
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2372 do_write = do_write || u->length == 0;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2373
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2374 for ( ;; ) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2375
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2376 if (do_write) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2377
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2378 if (u->out_bufs || u->busy_bufs) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2379 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
2380
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2381 if (rc == NGX_ERROR) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2382 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2383 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2384 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2385
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2386 ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2387 &u->out_bufs, u->output.tag);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2388 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2389
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2390 if (u->busy_bufs == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2391
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2392 if (u->length == 0
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2393 || upstream->read->eof
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2394 || upstream->read->error)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2395 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2396 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2397 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2398 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2399
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2400 b->pos = b->start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2401 b->last = b->start;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2402 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2403 }
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 size = b->end - b->last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2406
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2407 if (size > u->length) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2408 size = u->length;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2409 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2410
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2411 if (size && upstream->read->ready) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2412
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2413 n = upstream->recv(upstream, b->last, size);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2414
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2415 if (n == NGX_AGAIN) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2416 break;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2417 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2418
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2419 if (n > 0) {
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2420 u->state->response_length += n;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2421
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2422 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
2423 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2424 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2425 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2428 do_write = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2429
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2430 continue;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2431 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2432
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2433 break;
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
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2436 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
2437
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2438 if (downstream->data == r) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2439 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
2440 != NGX_OK)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2441 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2442 ngx_http_upstream_finalize_request(r, u, 0);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2443 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2444 }
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
1063
e2a6ecc5a3ae a non-active client connection must not closed after send timeout
Igor Sysoev <igor@sysoev.ru>
parents: 1031
diff changeset
2447 if (downstream->write->active && !downstream->write->ready) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2448 ngx_add_timer(downstream->write, clcf->send_timeout);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2449
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2450 } else if (downstream->write->timer_set) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2451 ngx_del_timer(downstream->write);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2452 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2453
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
2454 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
2455 ngx_http_upstream_finalize_request(r, u, 0);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2456 return;
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
1063
e2a6ecc5a3ae a non-active client connection must not closed after send timeout
Igor Sysoev <igor@sysoev.ru>
parents: 1031
diff changeset
2459 if (upstream->read->active && !upstream->read->ready) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2460 ngx_add_timer(upstream->read, u->conf->read_timeout);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2461
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2462 } else if (upstream->read->timer_set) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2463 ngx_del_timer(upstream->read);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2464 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2467
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2468 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2469 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
2470 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2471 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2472 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2473
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2474
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2475 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2476 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
2477 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2478 ngx_http_request_t *r = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2479
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2480 ngx_buf_t *b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2481 ngx_chain_t *cl, **ll;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2482 ngx_http_upstream_t *u;
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 u = r->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2485
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2486 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
2487 ll = &cl->next;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2490 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
2491 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2492 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2493 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2494
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2495 *ll = cl;
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 cl->buf->flush = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2498 cl->buf->memory = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2499
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2500 b = &u->buffer;
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 cl->buf->pos = b->last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2503 b->last += bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2504 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
2505 cl->buf->tag = u->output.tag;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2506
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2507 if (u->length == NGX_MAX_SIZE_T_VALUE) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2508 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2509 }
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 u->length -= bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2512
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2513 return NGX_OK;
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
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 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2518 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
2519 {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2520 ngx_event_t *wev;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2521 ngx_connection_t *c;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
2522 ngx_event_pipe_t *p;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2523 ngx_http_upstream_t *u;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2524
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2525 c = r->connection;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2526 u = r->upstream;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2527 p = u->pipe;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2528 wev = c->write;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2529
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2530 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
2531 "http upstream process downstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2532
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2533 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
2534
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2535 if (wev->timedout) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2536
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2537 if (wev->delayed) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2538
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2539 wev->timedout = 0;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2540 wev->delayed = 0;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2541
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2542 if (!wev->ready) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2543 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
2544
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2545 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
2546 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
2547 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2548
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2549 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2550 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2551
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2552 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
2553 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
2554 return;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2555 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2556
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2557 } else {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2558 p->downstream_error = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2559 c->timedout = 1;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2560 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
2561 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2562
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2563 } else {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2564
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2565 if (wev->delayed) {
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2566
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2567 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
2568 "http downstream delayed");
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2569
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2570 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
2571 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
2572 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2573
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2574 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2575 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
2576
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2577 if (ngx_event_pipe(p, 1) == NGX_ABORT) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2578 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2579 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2580 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2581 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2582
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2583 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
2584 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2585
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2586
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2587 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2588 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
2589 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
2590 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2591 ngx_connection_t *c;
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2592
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2593 c = u->peer.connection;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2594
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2595 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
2596 "http upstream process upstream");
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2597
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2598 c->log->action = "reading upstream";
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2599
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2600 if (c->read->timedout) {
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2601 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
2602 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
2603
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2604 } else {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2605 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
2606 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
2607 return;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2608 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2609 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2610
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2611 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
2612 }
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2613
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2614
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2615 static void
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2616 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
2617 {
2445
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2618 ngx_uint_t del;
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2619 ngx_temp_file_t *tf;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2620 ngx_event_pipe_t *p;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2621 ngx_http_upstream_t *u;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2622
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2623 u = r->upstream;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2624 p = u->pipe;
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2625
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2626 if (u->peer.connection) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2627
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2628 if (u->store) {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2629
2445
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2630 del = p->upstream_error;
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2631
1885
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2632 tf = u->pipe->temp_file;
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2633
2463
4bc8ea10d62b fix fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 2445
diff changeset
2634 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
2635
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2636 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
2637 && (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
2638 || (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
2639 {
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2640 ngx_http_upstream_store(r, u);
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2641
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2642 } else {
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2643 del = 1;
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2644 }
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2645 }
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2646
3c6af1fb7586 proxy/fastcgi_store did not delete incomplete files
Igor Sysoev <igor@sysoev.ru>
parents: 2441
diff changeset
2647 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
2648
1885
e5897822515f test response length in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1777
diff changeset
2649 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
2650
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2651 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
2652 ngx_delete_file_n " \"%s\" failed",
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2653 u->pipe->temp_file->file.name.data);
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2654 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2655 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2656 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2657
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2658 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2659
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2660 if (u->cacheable) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2661
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2662 if (p->upstream_done) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2663 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
2664
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2665 } else if (p->upstream_eof) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2666
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2667 /* TODO: check length & update cache */
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2668
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2669 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
2670
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2671 } else if (p->upstream_error) {
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
2672 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
2673 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2674 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2675
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2676 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2677
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2678 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
2679 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
2680 "http upstream exit: %p", p->out);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2681 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2682 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
2683 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2684 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2685 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2686 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2687 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2688
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2689 if (p->downstream_error) {
2381
3d7a70173d77 fix r2378, run posted requests after upstream event handling
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
2690 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
2691 "http upstream downstream error");
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2692
2757
9cc973b46af1 get a full response if the response is cacheable or storable even
Igor Sysoev <igor@sysoev.ru>
parents: 2708
diff changeset
2693 if (!u->cacheable && !u->store && u->peer.connection) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2694 ngx_http_upstream_finalize_request(r, u, 0);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2695 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2696 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2697 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2698
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2699
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2700 static void
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2701 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
2702 {
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2703 size_t root;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2704 time_t lm;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2705 ngx_str_t path;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2706 ngx_temp_file_t *tf;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2707 ngx_ext_rename_file_t ext;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2708
1777
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2709 tf = u->pipe->temp_file;
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2710
edaea30d83be optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1707
diff changeset
2711 if (tf->file.fd == NGX_INVALID_FILE) {
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2712
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2713 /* create file for empty 200 response */
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2714
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2715 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
2716 if (tf == NULL) {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2717 return;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2718 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2719
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2720 tf->file.fd = NGX_INVALID_FILE;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2721 tf->file.log = r->connection->log;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2722 tf->path = u->conf->temp_path;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2723 tf->pool = r->pool;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2724 tf->persistent = 1;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2725
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2726 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
2727 tf->persistent, tf->clean, tf->access)
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2728 != NGX_OK)
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2729 {
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2730 return;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2731 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2732
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2733 u->pipe->temp_file = tf;
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2734 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2735
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2736 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
2737 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
2738 ext.time = -1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2739 ext.create_path = 1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2740 ext.delete_file = 1;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2741 ext.log = r->connection->log;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2742
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2743 if (u->headers_in.last_modified) {
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2744
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2745 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
2746 u->headers_in.last_modified->value.len);
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2747
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2748 if (lm != NGX_ERROR) {
1947
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2749 ext.time = lm;
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2750 ext.fd = tf->file.fd;
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2751 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2752 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2753
1295
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2754 if (u->conf->store_lengths == NULL) {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2755
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2756 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
2757
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2758 } else {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2759 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
2760 u->conf->store_values->elts)
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2761 == NULL)
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2762 {
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2763 return;
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2764 }
5383f5232364 proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents: 1291
diff changeset
2765 }
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2766
3032
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
2767 path.len--;
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
2768
1291
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2769 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
2770 "upstream stores \"%s\" to \"%s\"",
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2771 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
2772
94b03bbd328e use ngx_ext_rename_file() in proxy/fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1916
diff changeset
2773 (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
2774 }
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2775
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2776
13a4ce6e7f1e proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents: 1284
diff changeset
2777 static void
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2778 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
2779 {
2386
4ccaa42de633 use already available r and u instead of ev
Igor Sysoev <igor@sysoev.ru>
parents: 2381
diff changeset
2780 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
2781 "http upstream dummy handler");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2782 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2783
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2784
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2785 static void
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2786 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
2787 ngx_uint_t ft_type)
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2788 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2789 ngx_uint_t status, state;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2790
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2791 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
2792 "http next upstream, %xi", ft_type);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2793
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2794 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2795 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
2796 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2797
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2798 if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2799 state = NGX_PEER_NEXT;
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2800 } else {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2801 state = NGX_PEER_FAILED;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2802 }
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2803
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2804 if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2805 u->peer.free(&u->peer, u->peer.data, state);
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
2806 }
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2807
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2808 if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2809 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
2810 "upstream timed out");
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2811 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2812
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2813 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
2814 status = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2815
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2816 } else {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2817 switch(ft_type) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2818
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2819 case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2820 status = NGX_HTTP_GATEWAY_TIME_OUT;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2821 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2822
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2823 case NGX_HTTP_UPSTREAM_FT_HTTP_500:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2824 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2825 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2826
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2827 case NGX_HTTP_UPSTREAM_FT_HTTP_404:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2828 status = NGX_HTTP_NOT_FOUND;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2829 break;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2830
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2831 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2832 * 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
2833 * never reach here
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2834 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2835
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2836 default:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2837 status = NGX_HTTP_BAD_GATEWAY;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2838 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2839 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2840
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
2841 if (r->connection->error) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2842 ngx_http_upstream_finalize_request(r, u,
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2843 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2844 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2845 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2846
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2847 if (status) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2848 u->state->status = status;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2849
525
09b42134ac0c nginx-0.1.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 515
diff changeset
2850 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
2851
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2852 #if (NGX_HTTP_CACHE)
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2853
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2854 if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2855 && (u->conf->cache_use_stale & ft_type))
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2856 {
2805
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2857 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
2858
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2859 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
2860
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2861 if (rc == NGX_OK) {
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
2862 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
2863 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
2864 }
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2865
60551422e150 reinit proxy/fastcgi header parser before ngx_http_upstream_cache_send()
Igor Sysoev <igor@sysoev.ru>
parents: 2804
diff changeset
2866 ngx_http_upstream_finalize_request(r, u, rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2867 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2868 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2869 #endif
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 ngx_http_upstream_finalize_request(r, u, status);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2872 return;
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
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2876 if (u->peer.connection) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2877 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
2878 "close http upstream connection: %d",
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2879 u->peer.connection->fd);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2880 #if (NGX_HTTP_SSL)
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2881
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2882 if (u->peer.connection->ssl) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2883 u->peer.connection->ssl->no_wait_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2884 u->peer.connection->ssl->no_send_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2885
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2886 (void) ngx_ssl_shutdown(u->peer.connection);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2887 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2888 #endif
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2889
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2890 ngx_close_connection(u->peer.connection);
4348
6af89b1b16e8 Merge of r4144:
Maxim Dounin <mdounin@mdounin.ru>
parents: 4256
diff changeset
2891 u->peer.connection = NULL;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2892 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2893
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2894 #if 0
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2895 if (u->conf->busy_lock && !u->busy_locked) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2896 ngx_http_upstream_busy_lock(p);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2897 return;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2898 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2899 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2900
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2901 ngx_http_upstream_connect(r, u);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2902 }
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
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2905 static void
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2906 ngx_http_upstream_cleanup(void *data)
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2907 {
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2908 ngx_http_request_t *r = data;
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2909
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2910 ngx_http_upstream_t *u;
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2911
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2912 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
2913 "cleanup http upstream request: \"%V\"", &r->uri);
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2914
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2915 u = r->upstream;
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2916
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2917 if (u->resolved && u->resolved->ctx) {
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2918 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
2919 u->resolved->ctx = NULL;
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2920 }
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2921
1705
d22095839d86 optimize r->upstream usage
Igor Sysoev <igor@sysoev.ru>
parents: 1701
diff changeset
2922 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
2923 }
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2924
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2925
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2926 static void
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
2927 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
2928 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
2929 {
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
2930 ngx_time_t *tp;
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2931
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2932 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
2933 "finalize http upstream request: %i", rc);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2934
2413
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2935 if (u->cleanup) {
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2936 *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
2937 u->cleanup = NULL;
2413
89ac47d91fc1 fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 2402
diff changeset
2938 }
569
174f1e853e1e nginx-0.3.6-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
2939
3169
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2940 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
2941 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
2942 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
2943 }
b1013d768911 fix request counter in resolver handling, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
2944
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2945 if (u->state && u->state->response_sec) {
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2946 tp = ngx_timeofday();
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
2947 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
2948 u->state->response_msec = tp->msec - u->state->response_msec;
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2949
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2950 if (u->pipe) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2951 u->state->response_length = u->pipe->read_length;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
2952 }
563
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2953 }
9c2f3ed7a247 nginx-0.3.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
2954
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2955 u->finalize_request(r, rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2956
1658
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2957 if (u->peer.free) {
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2958 u->peer.free(&u->peer, u->peer.data, 0);
13f8dec720b5 proxy_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents: 1654
diff changeset
2959 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2960
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2961 if (u->peer.connection) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2962
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2963 #if (NGX_HTTP_SSL)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2964
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2965 /* TODO: do not shutdown persistent connection */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2966
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2967 if (u->peer.connection->ssl) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2968
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2969 /*
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2970 * We send the "close notify" shutdown alert to the upstream only
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2971 * and do not wait its "close notify" shutdown alert.
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2972 * It is acceptable according to the TLS standard.
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2973 */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2974
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2975 u->peer.connection->ssl->no_wait_shutdown = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2976
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2977 (void) ngx_ssl_shutdown(u->peer.connection);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2978 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
2979 #endif
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2980
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2981 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2982 "close http upstream connection: %d",
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2983 u->peer.connection->fd);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
2984
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2985 ngx_close_connection(u->peer.connection);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2986 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2987
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2988 u->peer.connection = NULL;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
2989
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2990 if (u->pipe && u->pipe->temp_file) {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2991 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
2992 "http upstream temp fd: %d",
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
2993 u->pipe->temp_file->file.fd);
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2994 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2995
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2996 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
2997
3940
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
2998 if (r->cache) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
2999
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3000 if (u->cacheable) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3001
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3002 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
3003 time_t valid;
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3004
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3005 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
3006
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3007 if (valid) {
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3008 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
3009 r->cache->error = rc;
22f3e9197096 revert r3935 and fix "stalled cache updating" alert
Igor Sysoev <igor@sysoev.ru>
parents: 3934
diff changeset
3010 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3011 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3012 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3013
3711
ce6ba077c270 several changes in cache cleanup handling:
Igor Sysoev <igor@sysoev.ru>
parents: 3709
diff changeset
3014 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
3015 }
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3016
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3017 #endif
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3018
2692
111e6e62af32 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2691
diff changeset
3019 if (u->header_sent
4045
2d062c031fff Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents: 3944
diff changeset
3020 && rc != NGX_HTTP_REQUEST_TIME_OUT
2692
111e6e62af32 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 2691
diff changeset
3021 && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3022 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3023 rc = 0;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3024 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3025
515
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3026 if (rc == NGX_DECLINED) {
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3027 return;
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3028 }
417a087c9c4d nginx-0.1.32-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 511
diff changeset
3029
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3030 r->connection->log->action = "sending to client";
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 481
diff changeset
3031
4248
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3032 if (rc == 0
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3033 #if (NGX_HTTP_CACHE)
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3034 && !r->cached
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3035 #endif
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3036 )
2fad4d19ea4b Merging r4151, r4152, r4177:
Igor Sysoev <igor@sysoev.ru>
parents: 4246
diff changeset
3037 {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2360
diff changeset
3038 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
3039 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3040
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3041 ngx_http_finalize_request(r, rc);
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3042 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3043
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3044
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3045 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3046 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
3047 ngx_uint_t offset)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3048 {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3049 ngx_table_elt_t **ph;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3050
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3051 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
3052
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3053 if (*ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3054 *ph = h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3055 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3056
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3057 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3058 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3059
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3060
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3061 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
3062 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
3063 ngx_uint_t offset)
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3064 {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3065 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3066 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3067
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3068
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3069 static ngx_int_t
3669
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3070 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
3071 ngx_uint_t offset)
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3072 {
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3073 #if (NGX_HTTP_CACHE)
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3074 ngx_http_upstream_t *u;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3075
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3076 u = r->upstream;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3077
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3078 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
3079 u->cacheable = 0;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3080 }
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3081 #endif
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3082
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3083 return NGX_OK;
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3084 }
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3085
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3086
1f5841b1fcd7 treat Set-Cookie as a header that forbids caching
Igor Sysoev <igor@sysoev.ru>
parents: 3667
diff changeset
3087 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
3088 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
3089 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
3090 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3091 ngx_array_t *pa;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3092 ngx_table_elt_t **ph;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3093 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3094
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3095 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3096 pa = &u->headers_in.cache_control;
509
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 if (pa->elts == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3099 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
3100 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3101 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3102 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3103 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3104
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3105 ph = ngx_array_push(pa);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3106 if (ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3107 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3108 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3109
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3110 *ph = h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3111
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3112 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3113 {
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3114 u_char *p, *last;
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3115 ngx_int_t n;
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3116
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3117 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
3118 return NGX_OK;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3119 }
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3120
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3121 if (r->cache == NULL) {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3122 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3123 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3124
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3125 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
3126 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3127 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3128
3517
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3129 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
3130 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
3131
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3132 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
3133 || 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
3134 || 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
3135 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3136 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3137 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3138 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3139
3517
a4ee4a075ac5 do not cache response if it has "no-store" or "private"
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
3140 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
3141
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3142 if (p == NULL) {
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3143 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3144 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3145
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3146 n = 0;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3147
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3148 for (p += 8; p < last; p++) {
3198
48bfb7dc981b test comma separator in "Cache-Control"
Igor Sysoev <igor@sysoev.ru>
parents: 3195
diff changeset
3149 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
3150 break;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3151 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3152
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3153 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
3154 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
3155 continue;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3156 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3157
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3158 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3159 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3160 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3161
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3162 if (n == 0) {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3163 u->cacheable = 0;
2669
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3164 return NGX_OK;
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3165 }
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3166
5e4d8bd4486c support Cache-Control no-cache and max-age in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2667
diff changeset
3167 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
3168 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3169 #endif
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3170
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3171 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3172 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3173
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3174
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3175 static ngx_int_t
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3176 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
3177 ngx_uint_t offset)
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3178 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3179 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3180
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3181 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3182 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
3183
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3184 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3185 {
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3186 time_t expires;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3187
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3188 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
3189 return NGX_OK;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3190 }
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3191
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3192 if (r->cache == NULL) {
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3193 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3194 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3195
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3196 if (r->cache->valid_sec != 0) {
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3197 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3198 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3199
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3200 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
3201
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3202 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
3203 u->cacheable = 0;
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3204 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3205 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3206
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3207 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
3208 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3209 #endif
2666
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3210
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3211 return NGX_OK;
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3212 }
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3213
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3214
81556a9b6488 support Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2665
diff changeset
3215 static ngx_int_t
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3216 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
3217 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
3218 {
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3219 ngx_http_upstream_t *u;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3220
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3221 u = r->upstream;
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3222 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
3223
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3224 #if (NGX_HTTP_CACHE)
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3225 {
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3226 u_char *p;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3227 size_t len;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3228 ngx_int_t n;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3229
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3230 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
3231 return NGX_OK;
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
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3234 if (r->cache == NULL) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3235 return NGX_OK;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3236 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3237
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3238 len = h->value.len;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3239 p = h->value.data;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3240
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3241 if (p[0] != '@') {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3242 n = ngx_atoi(p, len);
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3243
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3244 switch (n) {
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3245 case 0:
2786
4e002555652d proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents: 2757
diff changeset
3246 u->cacheable = 0;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3247 case NGX_ERROR:
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3248 return NGX_OK;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3249
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3250 default:
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3251 r->cache->valid_sec = ngx_time() + n;
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3252 return NGX_OK;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3253 }
2667
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3254 }
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3255
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3256 p++;
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3257 len--;
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3258
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3259 n = ngx_atoi(p, len);
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3260
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3261 if (n != NGX_ERROR) {
c1ac00c2bc75 update r2664
Igor Sysoev <igor@sysoev.ru>
parents: 2666
diff changeset
3262 r->cache->valid_sec = n;
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3263 }
2708
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3264 }
4c658be4ab63 fix building --without-http-cache, introduced in r2664 and later
Igor Sysoev <igor@sysoev.ru>
parents: 2704
diff changeset
3265 #endif
2663
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3266
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3267 return NGX_OK;
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3268 }
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3269
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3270
09725d69cb25 support X-Accel-Expires in cache
Igor Sysoev <igor@sysoev.ru>
parents: 2662
diff changeset
3271 static ngx_int_t
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3272 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
3273 ngx_uint_t offset)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
3274 {
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3275 ngx_int_t n;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3276 ngx_http_upstream_t *u;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3277
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3278 u = r->upstream;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3279 u->headers_in.x_accel_limit_rate = h;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3280
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3281 if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) {
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3282 return NGX_OK;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3283 }
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3284
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3285 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
3286
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3287 if (n != NGX_ERROR) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3288 r->limit_rate = (size_t) n;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3289 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3290
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3291 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3292 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3293
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3294
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 525
diff changeset
3295 static ngx_int_t
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3296 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
3297 ngx_uint_t offset)
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3298 {
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3299 u_char c0, c1, c2;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3300 ngx_http_upstream_t *u;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3301
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3302 u = r->upstream;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3303
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3304 if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) {
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3305 return NGX_OK;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3306 }
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3307
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3308 if (u->conf->change_buffering) {
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3309
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3310 if (h->value.len == 2) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3311 c0 = ngx_tolower(h->value.data[0]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3312 c1 = ngx_tolower(h->value.data[1]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3313
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3314 if (c0 == 'n' && c1 == 'o') {
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3315 u->buffering = 0;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3316 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3317
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3318 } else if (h->value.len == 3) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3319 c0 = ngx_tolower(h->value.data[0]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3320 c1 = ngx_tolower(h->value.data[1]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3321 c2 = ngx_tolower(h->value.data[2]);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3322
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3323 if (c0 == 'y' && c1 == 'e' && c2 == 's') {
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3324 u->buffering = 1;
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3325 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3326 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3327 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3328
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3329 return NGX_OK;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3330 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3331
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3332
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
3333 static ngx_int_t
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3334 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
3335 ngx_uint_t offset)
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3336 {
4256
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3337 if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) {
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3338 return NGX_OK;
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3339 }
f83b47591642 Merging r4198:
Igor Sysoev <igor@sysoev.ru>
parents: 4248
diff changeset
3340
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3341 r->headers_out.override_charset = &h->value;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3342
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3343 return NGX_OK;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3344 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3345
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3346
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3347 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3348 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
3349 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3350 {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3351 ngx_table_elt_t *ho, **ph;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3352
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3353 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3354 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3355 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3356 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3357
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3358 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3359
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3360 if (offset) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3361 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
3362 *ph = ho;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3363 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3364
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3365 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3366 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3367
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3368
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3369 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3370 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
3371 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
3372 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3373 ngx_array_t *pa;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3374 ngx_table_elt_t *ho, **ph;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3375
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3376 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
3377
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3378 if (pa->elts == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3379 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
3380 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3381 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3382 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3383 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3384
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3385 ph = ngx_array_push(pa);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3386 if (ph == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3387 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3388 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3389
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3390 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3391 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3392 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3393 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3394
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3395 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3396 *ph = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3397
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3398 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3399 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3400
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3401
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3402 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3403 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
3404 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3405 {
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3406 u_char *p, *last;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3407
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3408 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
3409 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
3410 r->headers_out.content_type_lowcase = NULL;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3411
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3412 for (p = h->value.data; *p; p++) {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3413
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3414 if (*p != ';') {
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3415 continue;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3416 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3417
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3418 last = p;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3419
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3420 while (*++p == ' ') { /* void */ }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3421
1968
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3422 if (*p == '\0') {
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3423 return NGX_OK;
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3424 }
3c540ad3021f fix segfault
Igor Sysoev <igor@sysoev.ru>
parents: 1959
diff changeset
3425
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 1098
diff changeset
3426 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
3427 continue;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3428 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3429
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3430 p += 8;
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3431
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3432 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
3433
2244
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3434 if (*p == '"') {
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3435 p++;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3436 }
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3437
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3438 last = h->value.data + h->value.len;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3439
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3440 if (*(last - 1) == '"') {
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3441 last--;
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3442 }
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3443
f5a9f35e8344 strip charset name quotes
Igor Sysoev <igor@sysoev.ru>
parents: 2184
diff changeset
3444 r->headers_out.charset.len = last - p;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3445 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
3446
c6c42497106c fix segfault if upstream sends trailing ";" in "charset="
Igor Sysoev <igor@sysoev.ru>
parents: 1109
diff changeset
3447 return NGX_OK;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3448 }
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 653
diff changeset
3449
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3450 return NGX_OK;
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 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3455 ngx_http_upstream_copy_content_length(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
3456 ngx_uint_t offset)
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 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3459
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3460 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3461 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3462 return NGX_ERROR;
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3465 *ho = *h;
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 r->headers_out.content_length = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3468 r->headers_out.content_length_n = ngx_atoof(h->value.data, h->value.len);
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 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3471 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3472
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3473
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3474 static ngx_int_t
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3475 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
3476 ngx_uint_t offset)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3477 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3478 ngx_table_elt_t *ho;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3479
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3480 ho = ngx_list_push(&r->headers_out.headers);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3481 if (ho == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3482 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3483 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3484
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3485 *ho = *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3486
3004
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3487 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
3488
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3489 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3490
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3491 if (r->upstream->cacheable) {
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3492 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
3493 h->value.len);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3494 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3495
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3496 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3497
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3498 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3499 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3500
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3501
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3502 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3503 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
3504 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3505 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3506 ngx_int_t rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3507 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3508
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3509 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3510 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3511 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3512 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3513
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3514 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3515
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3516 if (r->upstream->rewrite_redirect) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3517 rc = r->upstream->rewrite_redirect(r, ho, 0);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3518
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3519 if (rc == NGX_DECLINED) {
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3520 return NGX_OK;
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3521 }
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3522
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3523 if (rc == NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3524 r->headers_out.location = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3525
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3526 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
3527 "rewritten location: \"%V\"", &ho->value);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3528 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3529
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3530 return rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3531 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3532
1653
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3533 if (ho->value.data[0] != '/') {
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3534 r->headers_out.location = ho;
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3535 }
ea681a6a0c61 set r->headers_out.location for non-local redirects
Igor Sysoev <igor@sysoev.ru>
parents: 1640
diff changeset
3536
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3537 /*
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3538 * 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
3539 * 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
3540 */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3541
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3542 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3543 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3544
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3545
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3546 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3547 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
3548 ngx_uint_t offset)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3549 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3550 u_char *p;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3551 ngx_int_t rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3552 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3553
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3554 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3555 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3556 return NGX_ERROR;
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3559 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3560
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3561 if (r->upstream->rewrite_redirect) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3562
1549
099d8470e6c3 pass length clearly
Igor Sysoev <igor@sysoev.ru>
parents: 1543
diff changeset
3563 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
3564
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3565 if (p) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3566 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
3567
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3568 } else {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3569 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3570 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3571
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3572 if (rc == NGX_DECLINED) {
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3573 return NGX_OK;
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3574 }
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
3575
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3576 if (rc == NGX_OK) {
1654
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3577 r->headers_out.refresh = ho;
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3578
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3579 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
3580 "rewritten refresh: \"%V\"", &ho->value);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3581 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3582
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3583 return rc;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3584 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3585
1654
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3586 r->headers_out.refresh = ho;
e5c547a225bd r->headers_out.refresh
Igor Sysoev <igor@sysoev.ru>
parents: 1653
diff changeset
3587
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3588 return NGX_OK;
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
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3592 static ngx_int_t
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3593 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
3594 ngx_table_elt_t *h, ngx_uint_t offset)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3595 {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3596 ngx_table_elt_t *ho;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3597
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3598 #if (NGX_HTTP_CACHE)
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3599
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3600 if (r->cached) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3601 r->allow_ranges = 1;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3602 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3603
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3604 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3605
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3606 #endif
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3607
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3608 ho = ngx_list_push(&r->headers_out.headers);
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3609 if (ho == NULL) {
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3610 return NGX_ERROR;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3611 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3612
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3613 *ho = *h;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3614
3004
4121acaf7a04 fix handling "Last-Modified" and "Accept-Ranges" for upstream responses
Igor Sysoev <igor@sysoev.ru>
parents: 3003
diff changeset
3615 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
3616
2592
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3617 return NGX_OK;
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3618 }
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3619
3a8a53c0c42f a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
3620
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3621 #if (NGX_HTTP_GZIP)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3622
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3623 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3624 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
3625 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
3626 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3627 ngx_table_elt_t *ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3628
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3629 ho = ngx_list_push(&r->headers_out.headers);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3630 if (ho == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3631 return NGX_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3632 }
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 *ho = *h;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3635
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3636 r->headers_out.content_encoding = ho;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3637
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3638 return NGX_OK;
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
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3641 #endif
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3642
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3643
487
31ff3e943e16 nginx-0.1.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
3644 static ngx_int_t
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3645 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
3646 {
880
3b763d36e055 axe old % log format
Igor Sysoev <igor@sysoev.ru>
parents: 850
diff changeset
3647 ngx_http_variable_t *var, *v;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3648
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3649 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
3650 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
3651 if (var == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3652 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3653 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3654
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
3655 var->get_handler = v->get_handler;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3656 var->data = v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3657 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3658
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3659 return NGX_OK;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3660 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3661
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
3662
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3663 static ngx_int_t
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3664 ngx_http_upstream_addr_variable(ngx_http_request_t *r,
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3665 ngx_http_variable_value_t *v, uintptr_t data)
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3666 {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3667 u_char *p;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3668 size_t len;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3669 ngx_uint_t i;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3670 ngx_http_upstream_state_t *state;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3671
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3672 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3673 v->no_cacheable = 0;
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3674 v->not_found = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3675
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3676 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3677 v->not_found = 1;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3678 return NGX_OK;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3679 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3680
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3681 len = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3682 state = r->upstream_states->elts;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3683
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3684 for (i = 0; i < r->upstream_states->nelts; i++) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3685 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3686 len += state[i].peer->len + 2;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3687
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3688 } else {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3689 len += 3;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3690 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3691 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3692
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3693 p = ngx_pnalloc(r->pool, len);
1181
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3694 if (p == NULL) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3695 return NGX_ERROR;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3696 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3697
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3698 v->data = p;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3699
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3700 i = 0;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3701
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3702 for ( ;; ) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3703 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3704 p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3705 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3706
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3707 if (++i == r->upstream_states->nelts) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3708 break;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3709 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3710
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3711 if (state[i].peer) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3712 *p++ = ',';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3713 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3714
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3715 } else {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3716 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3717 *p++ = ':';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3718 *p++ = ' ';
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3719
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3720 if (++i == r->upstream_states->nelts) {
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3721 break;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3722 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3723
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3724 continue;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3725 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3726 }
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3727
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3728 v->len = p - v->data;
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 return NGX_OK;
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3731 }
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
ea5ecb1aae88 $upstream_addr
Igor Sysoev <igor@sysoev.ru>
parents: 1168
diff changeset
3734 static ngx_int_t
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3735 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
3736 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
3737 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3738 u_char *p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3739 size_t len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3740 ngx_uint_t i;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3741 ngx_http_upstream_state_t *state;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3742
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3743 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3744 v->no_cacheable = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3745 v->not_found = 0;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3746
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3747 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
3748 v->not_found = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3749 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3750 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3751
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3752 len = r->upstream_states->nelts * (3 + 2);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3753
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3754 p = ngx_pnalloc(r->pool, len);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3755 if (p == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3756 return NGX_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3757 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3758
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3759 v->data = p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3760
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3761 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
3762 state = r->upstream_states->elts;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3763
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3764 for ( ;; ) {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3765 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
3766 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
3767
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3768 } else {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3769 *p++ = '-';
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3770 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3771
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3772 if (++i == r->upstream_states->nelts) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3773 break;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3774 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3775
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3776 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
3777 *p++ = ',';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3778 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3779
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3780 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3781 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3782 *p++ = ':';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3783 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3784
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3785 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
3786 break;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3787 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3788
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3789 continue;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3790 }
573
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
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3793 v->len = p - v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3794
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3795 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3796 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3797
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3798
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3799 static ngx_int_t
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3800 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
3801 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
3802 {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3803 u_char *p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3804 size_t len;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3805 ngx_uint_t i;
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
3806 ngx_msec_int_t ms;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3807 ngx_http_upstream_state_t *state;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3808
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3809 v->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
3810 v->no_cacheable = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3811 v->not_found = 0;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3812
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3813 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
3814 v->not_found = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3815 return NGX_OK;
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
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3818 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
3819
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1973
diff changeset
3820 p = ngx_pnalloc(r->pool, len);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3821 if (p == NULL) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3822 return NGX_ERROR;
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
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3825 v->data = p;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3826
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3827 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
3828 state = r->upstream_states->elts;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3829
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3830 for ( ;; ) {
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3831 if (state[i].status) {
1640
02a22cd5282a 64-bit time_t compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
3832 ms = (ngx_msec_int_t)
02a22cd5282a 64-bit time_t compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
3833 (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
3834 ms = ngx_max(ms, 0);
889
a9a7e4b1a72b the previous fix does not actually fix overflow
Igor Sysoev <igor@sysoev.ru>
parents: 888
diff changeset
3835 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
3836
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3837 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3838 *p++ = '-';
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3839 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3840
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3841 if (++i == r->upstream_states->nelts) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3842 break;
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
1168
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3845 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
3846 *p++ = ',';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3847 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3848
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3849 } else {
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3850 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3851 *p++ = ':';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3852 *p++ = ' ';
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3853
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3854 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
3855 break;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3856 }
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3857
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3858 continue;
4d0d12446c3b store the upstream states before X-Accel-Redirect to a next upstream
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
3859 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3860 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3861
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3862 v->len = p - v->data;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3863
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
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
3867
2402
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3868 static ngx_int_t
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3869 ngx_http_upstream_response_length_variable(ngx_http_request_t *r,
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3870 ngx_http_variable_value_t *v, uintptr_t data)
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3871 {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3872 u_char *p;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3873 size_t len;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3874 ngx_uint_t i;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3875 ngx_http_upstream_state_t *state;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3876
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3877 v->valid = 1;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3878 v->no_cacheable = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3879 v->not_found = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3880
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3881 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3882 v->not_found = 1;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3883 return NGX_OK;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3884 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3885
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3886 len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3887
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3888 p = ngx_pnalloc(r->pool, len);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3889 if (p == NULL) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3890 return NGX_ERROR;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3891 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3892
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3893 v->data = p;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3894
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3895 i = 0;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3896 state = r->upstream_states->elts;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3897
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3898 for ( ;; ) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3899 p = ngx_sprintf(p, "%O", state[i].response_length);
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3900
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3901 if (++i == r->upstream_states->nelts) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3902 break;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3903 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3904
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3905 if (state[i].peer) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3906 *p++ = ',';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3907 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3908
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3909 } else {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3910 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3911 *p++ = ':';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3912 *p++ = ' ';
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3913
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3914 if (++i == r->upstream_states->nelts) {
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3915 break;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3916 }
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3917
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3918 continue;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3919 }
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
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3922 v->len = p - v->data;
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3923
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3924 return NGX_OK;
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
cd6a1abe11a7 $upstream_response_length
Igor Sysoev <igor@sysoev.ru>
parents: 2394
diff changeset
3927
1162
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3928 ngx_int_t
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3929 ngx_http_upstream_header_variable(ngx_http_request_t *r,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3930 ngx_http_variable_value_t *v, uintptr_t data)
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3931 {
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3932 if (r->upstream == NULL) {
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3933 v->not_found = 1;
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3934 return NGX_OK;
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3935 }
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3936
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3937 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3938 &r->upstream->headers_in.headers.part,
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3939 sizeof("upstream_http_") - 1);
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3940 }
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3941
f59d15404269 $upstream_http_... variables
Igor Sysoev <igor@sysoev.ru>
parents: 1153
diff changeset
3942
2952
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3943 #if (NGX_HTTP_CACHE)
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3944
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3945 ngx_int_t
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3946 ngx_http_upstream_cache_status(ngx_http_request_t *r,
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3947 ngx_http_variable_value_t *v, uintptr_t data)
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3948 {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3949 ngx_uint_t n;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3950
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3951 if (r->upstream == NULL || r->upstream->cache_status == 0) {
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3952 v->not_found = 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3953 return NGX_OK;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3954 }
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3955
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3956 n = r->upstream->cache_status - 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3957
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3958 v->valid = 1;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3959 v->no_cacheable = 0;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3960 v->not_found = 0;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3961 v->len = ngx_http_cache_status[n].len;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3962 v->data = ngx_http_cache_status[n].data;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3963
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3964 return NGX_OK;
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3965 }
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3966
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3967 #endif
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3968
0998606fbfd4 $upstream_cache_status
Igor Sysoev <igor@sysoev.ru>
parents: 2949
diff changeset
3969
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
3970 static char *
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
3971 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
3972 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3973 char *rv;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3974 void *mconf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3975 ngx_str_t *value;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3976 ngx_url_t u;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3977 ngx_uint_t m;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3978 ngx_conf_t pcf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3979 ngx_http_module_t *module;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3980 ngx_http_conf_ctx_t *ctx, *http_ctx;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3981 ngx_http_upstream_srv_conf_t *uscf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3982
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3983 ngx_memzero(&u, sizeof(ngx_url_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3984
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3985 value = cf->args->elts;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3986 u.host = value[1];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3987 u.no_resolve = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3988
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3989 uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3990 |NGX_HTTP_UPSTREAM_WEIGHT
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3991 |NGX_HTTP_UPSTREAM_MAX_FAILS
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3992 |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3993 |NGX_HTTP_UPSTREAM_DOWN
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3994 |NGX_HTTP_UPSTREAM_BACKUP);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3995 if (uscf == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3996 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3997 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
3998
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
3999
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4000 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
4001 if (ctx == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4002 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4003 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4004
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4005 http_ctx = cf->ctx;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4006 ctx->main_conf = http_ctx->main_conf;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4007
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4008 /* the upstream{}'s srv_conf */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4009
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4010 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
4011 if (ctx->srv_conf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4012 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4013 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4014
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4015 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
4016
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4017 uscf->srv_conf = ctx->srv_conf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4018
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4019
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4020 /* the upstream{}'s loc_conf */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4021
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4022 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
4023 if (ctx->loc_conf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4024 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4025 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4026
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4027 for (m = 0; ngx_modules[m]; m++) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4028 if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4029 continue;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4030 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4031
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4032 module = ngx_modules[m]->ctx;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4033
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4034 if (module->create_srv_conf) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4035 mconf = module->create_srv_conf(cf);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4036 if (mconf == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4037 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4038 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4039
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4040 ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4041 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4042
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4043 if (module->create_loc_conf) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4044 mconf = module->create_loc_conf(cf);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4045 if (mconf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4046 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4047 }
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->loc_conf[ngx_modules[m]->ctx_index] = mconf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4050 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4051 }
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
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4054 /* parse inside upstream{} */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4055
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4056 pcf = *cf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4057 cf->ctx = ctx;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4058 cf->cmd_type = NGX_HTTP_UPS_CONF;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4059
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4060 rv = ngx_conf_parse(cf, NULL);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4061
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4062 *cf = pcf;
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 if (rv != NGX_CONF_OK) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4065 return rv;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4066 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4067
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4068 if (uscf->servers == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4069 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
4070 "no servers are inside upstream");
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4071 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4072 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4073
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4074 return rv;
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
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4077
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4078 static char *
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4079 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
4080 {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4081 ngx_http_upstream_srv_conf_t *uscf = conf;
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 time_t fail_timeout;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4084 ngx_str_t *value, s;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4085 ngx_url_t u;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4086 ngx_int_t weight, max_fails;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4087 ngx_uint_t i;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4088 ngx_http_upstream_server_t *us;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4089
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4090 if (uscf->servers == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4091 uscf->servers = ngx_array_create(cf->pool, 4,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4092 sizeof(ngx_http_upstream_server_t));
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4093 if (uscf->servers == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4094 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4095 }
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
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4098 us = ngx_array_push(uscf->servers);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4099 if (us == NULL) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4100 return NGX_CONF_ERROR;
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
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4103 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4104
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4105 value = cf->args->elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4106
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4107 ngx_memzero(&u, sizeof(ngx_url_t));
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 u.url = value[1];
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4110 u.default_port = 80;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4111
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1558
diff changeset
4112 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
4113 if (u.err) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4114 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
4115 "%s in upstream \"%V\"", u.err, &u.url);
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
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4118 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4119 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4120
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4121 weight = 1;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4122 max_fails = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4123 fail_timeout = 10;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4124
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4125 for (i = 2; i < cf->args->nelts; i++) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4126
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4127 if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4128
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4129 if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4130 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4131 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4132
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4133 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
4134
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4135 if (weight == NGX_ERROR || weight == 0) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4136 goto invalid;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4137 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4138
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4139 continue;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4140 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4141
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4142 if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4143
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4144 if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4145 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4146 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4147
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4148 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
4149
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4150 if (max_fails == NGX_ERROR) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4151 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4152 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4153
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4154 continue;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4155 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4156
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4157 if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4158
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4159 if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4160 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4161 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4162
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4163 s.len = value[i].len - 13;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4164 s.data = &value[i].data[13];
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4165
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4166 fail_timeout = ngx_parse_time(&s, 1);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4167
1973
54e4d1b6c183 small fix
Igor Sysoev <igor@sysoev.ru>
parents: 1968
diff changeset
4168 if (fail_timeout == NGX_ERROR) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4169 goto invalid;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4170 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4171
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4172 continue;
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
1378
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4175 if (ngx_strncmp(value[i].data, "backup", 6) == 0) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4176
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4177 if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4178 goto invalid;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4179 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4180
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4181 us->backup = 1;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4182
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4183 continue;
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4184 }
0be898896d1a backup upstream servers
Igor Sysoev <igor@sysoev.ru>
parents: 1340
diff changeset
4185
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4186 if (ngx_strncmp(value[i].data, "down", 4) == 0) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4187
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4188 if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4189 goto invalid;
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
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4192 us->down = 1;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4193
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4194 continue;
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 goto invalid;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4198 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4199
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4200 us->addrs = u.addrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4201 us->naddrs = u.naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4202 us->weight = weight;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4203 us->max_fails = max_fails;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4204 us->fail_timeout = fail_timeout;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4205
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4206 return NGX_CONF_OK;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4207
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4208 invalid:
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4209
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4210 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4211 "invalid parameter \"%V\"", &value[i]);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4212
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4213 return NGX_CONF_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4214 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4215
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4216
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4217 ngx_http_upstream_srv_conf_t *
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4218 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
4219 {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4220 ngx_uint_t i;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4221 ngx_http_upstream_server_t *us;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4222 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4223 ngx_http_upstream_main_conf_t *umcf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4224
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4225 if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4226
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1558
diff changeset
4227 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
4228 if (u->err) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4229 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
4230 "%s in upstream \"%V\"", u->err, &u->url);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4231 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4232
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4233 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4234 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4235 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4236
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4237 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
4238
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4239 uscfp = umcf->upstreams.elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4240
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4241 for (i = 0; i < umcf->upstreams.nelts; i++) {
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4242
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4243 if (uscfp[i]->host.len != u->host.len
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4244 || 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
4245 != 0)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4246 {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4247 continue;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4248 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4249
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4250 if ((flags & NGX_HTTP_UPSTREAM_CREATE)
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4251 && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4252 {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4253 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4254 "duplicate upstream \"%V\"", &u->host);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4255 return NULL;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4256 }
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4257
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4258 if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && u->port) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4259 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4260 "upstream \"%V\" may not have port %d",
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4261 &u->host, u->port);
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4262 return NULL;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4263 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4264
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4265 if ((flags & NGX_HTTP_UPSTREAM_CREATE) && uscfp[i]->port) {
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4266 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4267 "upstream \"%V\" may not have port %d in %s:%ui",
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4268 &u->host, uscfp[i]->port,
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1469
diff changeset
4269 uscfp[i]->file_name, uscfp[i]->line);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4270 return NULL;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4271 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4272
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4273 if (uscfp[i]->port != u->port) {
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4274 continue;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4275 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4276
1340
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4277 if (uscfp[i]->default_port && u->default_port
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4278 && uscfp[i]->default_port != u->default_port)
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4279 {
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4280 continue;
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4281 }
32cdba6f2ec1 fix case when two directives
Igor Sysoev <igor@sysoev.ru>
parents: 1295
diff changeset
4282
4349
e04fdb54dd71 Merge of r4153:
Maxim Dounin <mdounin@mdounin.ru>
parents: 4348
diff changeset
4283 if (flags & NGX_HTTP_UPSTREAM_CREATE) {
e04fdb54dd71 Merge of r4153:
Maxim Dounin <mdounin@mdounin.ru>
parents: 4348
diff changeset
4284 uscfp[i]->flags = flags;
e04fdb54dd71 Merge of r4153:
Maxim Dounin <mdounin@mdounin.ru>
parents: 4348
diff changeset
4285 }
e04fdb54dd71 Merge of r4153:
Maxim Dounin <mdounin@mdounin.ru>
parents: 4348
diff changeset
4286
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4287 return uscfp[i];
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4288 }
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 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
4291 if (uscf == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4292 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4293 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4294
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4295 uscf->flags = flags;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4296 uscf->host = u->host;
1489
56f1ea5baabb u_char* is enough to keep file name
Igor Sysoev <igor@sysoev.ru>
parents: 1469
diff changeset
4297 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
4298 uscf->line = cf->conf_file->line;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4299 uscf->port = u->port;
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 901
diff changeset
4300 uscf->default_port = u->default_port;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4301
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4302 if (u->naddrs == 1) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4303 uscf->servers = ngx_array_create(cf->pool, 1,
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4304 sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4305 if (uscf->servers == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4306 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4307 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4308
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4309 us = ngx_array_push(uscf->servers);
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4310 if (us == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4311 return NGX_CONF_ERROR;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4312 }
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4313
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4314 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4315
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4316 us->addrs = u->addrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4317 us->naddrs = u->naddrs;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4318 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4319
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4320 uscfp = ngx_array_push(&umcf->upstreams);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4321 if (uscfp == NULL) {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4322 return NULL;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4323 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4324
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4325 *uscfp = uscf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4326
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4327 return uscf;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4328 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4329
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4330
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4331 char *
3399
ac9c0380337d fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3369
diff changeset
4332 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
4333 void *conf)
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4334 {
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4335 char *p = conf;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4336
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4337 ngx_int_t rc;
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4338 ngx_str_t *value;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4339 ngx_addr_t **paddr;
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4340
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4341 paddr = (ngx_addr_t **) (p + cmd->offset);
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4342
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4343 *paddr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4344 if (*paddr == NULL) {
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4345 return NGX_CONF_ERROR;
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4346 }
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4347
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4348 value = cf->args->elts;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4349
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4350 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
4351
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4352 switch (rc) {
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4353 case NGX_OK:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4354 (*paddr)->name = value[1];
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4355 return NGX_CONF_OK;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4356
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4357 case NGX_DECLINED:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4358 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4359 "invalid address \"%V\"", &value[1]);
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4360 default:
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4361 return NGX_CONF_ERROR;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
4362 }
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4363 }
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4364
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3198
diff changeset
4365
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4366 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
4367 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
4368 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
4369 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
4370 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4371 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
4372 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
4373 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
4374 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
4375
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4376 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
4377 && 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
4378 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4379 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
4380
2929
37b7cd336fdf inherit proxy_set_header, proxy_hide_header, and fastcgi_hide_header
Igor Sysoev <igor@sysoev.ru>
parents: 2927
diff changeset
4381 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
4382 #if (NGX_HTTP_CACHE)
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4383 && ((conf->cache == NULL) == (prev->cache == NULL))
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4384 #endif
fe484c0be7c0 fix building --without-http-cache, broken in r2930
Igor Sysoev <igor@sysoev.ru>
parents: 2929
diff changeset
4385 )
2929
37b7cd336fdf inherit proxy_set_header, proxy_hide_header, and fastcgi_hide_header
Igor Sysoev <igor@sysoev.ru>
parents: 2927
diff changeset
4386 {
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4387 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
4388 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4389
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4390 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
4391 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
4392
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4393 } else {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4394 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
4395 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
4396 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4397
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4398 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
4399 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
4400 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4401 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4402
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4403 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
4404 != NGX_OK)
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4405 {
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4406 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
4407 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4408
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4409 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
4410 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
4411 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
4412 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
4413 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4414
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4415 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
4416 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
4417 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
4418 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4419
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4420 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
4421
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4422 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
4423
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4424 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
4425
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4426 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
4427
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4428 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
4429 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
4430 goto exist;
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4431 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4432 }
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 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
4435 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
4436 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
4437 }
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4438
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4439 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
4440 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
4441 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
4442
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4443 exist:
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4444
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4445 continue;
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
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4449 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
4450
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4451 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
4452 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
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 (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
4455 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
4456
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4457 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
4458 continue;
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
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4461 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
4462 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
4463 break;
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 }
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 }
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 hash->hash = &conf->hide_headers_hash;
1706
9242e21d2f8d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1705
diff changeset
4470 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
4471 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
4472 hash->temp_pool = NULL;
1706
9242e21d2f8d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1705
diff changeset
4473
1701
40d004d95d88 *) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents: 1699
diff changeset
4474 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
4475 }
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
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4478 static void *
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4479 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
4480 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4481 ngx_http_upstream_main_conf_t *umcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4482
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4483 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
4484 if (umcf == NULL) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4485 return NULL;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4486 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4487
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4488 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
4489 sizeof(ngx_http_upstream_srv_conf_t *))
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4490 != NGX_OK)
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4491 {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2882
diff changeset
4492 return NULL;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4493 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4494
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4495 return umcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4496 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4497
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4498
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4499 static char *
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4500 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
4501 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4502 ngx_http_upstream_main_conf_t *umcf = conf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4503
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4504 ngx_uint_t i;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4505 ngx_array_t headers_in;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4506 ngx_hash_key_t *hk;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4507 ngx_hash_init_t hash;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4508 ngx_http_upstream_init_pt init;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4509 ngx_http_upstream_header_t *header;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4510 ngx_http_upstream_srv_conf_t **uscfp;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4511
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4512 uscfp = umcf->upstreams.elts;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4513
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4514 for (i = 0; i < umcf->upstreams.nelts; i++) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4515
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4516 init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4517 ngx_http_upstream_init_round_robin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4518
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4519 if (init(cf, uscfp[i]) != NGX_OK) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4520 return NGX_CONF_ERROR;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4521 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
4522 }
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4523
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 659
diff changeset
4524
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4525 /* upstream_headers_in_hash */
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 880
diff changeset
4526
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4527 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
4528 != NGX_OK)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4529 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4530 return NGX_CONF_ERROR;
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
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4533 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
4534 hk = ngx_array_push(&headers_in);
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4535 if (hk == NULL) {
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4536 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4537 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4538
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4539 hk->key = header->name;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4540 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
4541 hk->value = header;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4542 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4543
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4544 hash.hash = &umcf->headers_in_hash;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4545 hash.key = ngx_hash_key_lc;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4546 hash.max_size = 512;
751
bae59a740c40 align hash bucket size to cache line
Igor Sysoev <igor@sysoev.ru>
parents: 750
diff changeset
4547 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
4548 hash.name = "upstream_headers_in_hash";
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4549 hash.pool = cf->pool;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4550 hash.temp_pool = NULL;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4551
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4552 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
4553 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
4554 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4555
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4556 return NGX_CONF_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
4557 }