annotate src/http/ngx_http_upstream.c @ 34:aab2ea7c0458 NGINX_0_1_17

nginx 0.1.17 *) Change: the ngx_http_rewrite_module was rewritten from the scratch. Now it is possible to redirect, to return the error codes, to check the variables and referrers. The directives can be used inside locations. The redirect directive was canceled. *) Feature: the ngx_http_geo_module. *) Feature: the proxy_set_x_var and fastcgi_set_var directives. *) Bugfix: the location configuration with "=" modifier may be used in another location. *) Bugfix: the correct content type was set only for requests that use small caps letters in extension. *) Bugfix: if the proxy_pass or fastcgi_pass directives were set in the location, and access was denied, and the error was redirected to a static page, then the segmentation fault occurred. *) Bugfix: if in a proxied "Location" header was a relative URL, then a host name and a slash were added to them; bug appeared in 0.1.14. *) Bugfix: the system error message was not logged on Linux.
author Igor Sysoev <http://sysoev.ru>
date Thu, 03 Feb 2005 00:00:00 +0300
parents da8c190bdaba
children a39d1b793287
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_event_connect.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 static void ngx_http_upstream_check_broken_connection(ngx_event_t *ev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 static void ngx_http_upstream_connect(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_http_upstream_t *u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 static void ngx_http_upstream_reinit(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ngx_http_upstream_t *u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 static void ngx_http_upstream_send_request(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 ngx_http_upstream_t *u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 static void ngx_http_upstream_send_request_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 static void ngx_http_upstream_process_header(ngx_event_t *rev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 static void ngx_http_upstream_send_response(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 ngx_http_upstream_t *u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 static void ngx_http_upstream_process_body(ngx_event_t *ev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 static void ngx_http_upstream_dummy_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 static void ngx_http_upstream_next(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 ngx_http_upstream_t *u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 ngx_uint_t ft_type);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 ngx_http_upstream_t *u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 ngx_int_t rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 static size_t ngx_http_upstream_log_status_getlen(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 uintptr_t data);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 static u_char *ngx_http_upstream_log_status(ngx_http_request_t *r, u_char *buf,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_http_log_op_t *op);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 static ngx_int_t ngx_http_upstream_add_log_formats(ngx_conf_t *cf);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 ngx_http_module_t ngx_http_upstream_module_ctx = {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 ngx_http_upstream_add_log_formats, /* pre conf */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 NULL, /* create main configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 NULL, /* init main configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 NULL, /* create server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 NULL, /* merge server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 NULL, /* create location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 NULL /* merge location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 ngx_module_t ngx_http_upstream_module = {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 NGX_MODULE,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 &ngx_http_upstream_module_ctx, /* module context */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 NULL, /* module directives */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 NGX_HTTP_MODULE, /* module type */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 NULL, /* init module */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 NULL /* init process */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 static ngx_http_log_op_name_t ngx_http_upstream_log_fmt_ops[] = {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 { ngx_string("upstream_status"), 0, NULL,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 ngx_http_upstream_log_status_getlen,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 ngx_http_upstream_log_status },
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 { ngx_null_string, 0, NULL, NULL, NULL }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 char *ngx_http_upstream_header_errors[] = {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 "upstream sent invalid header",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 "upstream sent too long header line"
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 void ngx_http_upstream_init(ngx_http_request_t *r)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 c = r->connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 "http init upstream, client timer: %d", c->read->timer_set);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 if (c->read->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ngx_del_timer(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 c->read->event_handler = ngx_http_upstream_check_broken_connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 c->write->event_handler = ngx_http_upstream_check_broken_connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 if (!c->write->active) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 if (ngx_add_event(c->write, NGX_WRITE_EVENT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 NGX_CLEAR_EVENT) == NGX_ERROR)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 u->method = r->method;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 if (u->create_request(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 u->peer.log = r->connection->log;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
120 u->saved_log_ctx = r->connection->log->data;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
121 u->saved_log_handler = r->connection->log->handler;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 r->connection->log->data = u->log_ctx;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 r->connection->log->handler = u->log_handler;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 u->output.sendfile = r->connection->sendfile;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 u->output.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 u->output.bufs.num = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 u->output.output_filter = ngx_chain_writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 u->output.filter_ctx = &u->writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 u->writer.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 if (ngx_array_init(&u->states, r->pool, u->peer.peers->number,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 sizeof(ngx_http_upstream_state_t)) == NGX_ERROR)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 if (!(u->state = ngx_push_array(&u->states))) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 static void ngx_http_upstream_check_broken_connection(ngx_event_t *ev)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 int n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 char buf[1];
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 ngx_err_t err;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 "http upstream check client, write event:%d", ev->write);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
163 c = ev->data;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
164 r = c->data;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
165 u = r->upstream;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
166
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
167 if (u->peer.connection == NULL) {
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
168 return;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
169 }
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
170
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 #if (NGX_HAVE_KQUEUE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 if (!ev->pending_eof) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 ev->eof = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 if (ev->kq_errno) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 "kevent() reported that client closed "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 "prematurely connection, "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 "so upstream connection is closed too");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 "kevent() reported that client closed "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 "prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 n = recv(c->fd, buf, 1, MSG_PEEK);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 err = ngx_socket_errno;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 * we do not need to disable the write event because
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 * that event has NGX_USE_CLEAR_EVENT type
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 if (ngx_del_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 if (n > 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 ev->eof = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 if (n == -1) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 if (err == NGX_EAGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
244 } else { /* n == 0 */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 err = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 "client closed prematurely connection, "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 "so upstream connection is closed too");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 "client closed prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 static void ngx_http_upstream_connect(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 ngx_http_upstream_t *u)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 ngx_int_t rc;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
274 r->connection->log->action = "connecting to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 r->connection->single_connection = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278 rc = ngx_event_connect_peer(&u->peer);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 "http upstream connect: %i", rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 u->state->peer = &u->peer.peers->peer[u->peer.cur_peer].name;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 if (rc == NGX_CONNECT_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 c->data = r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 c->write->event_handler = ngx_http_upstream_send_request_handler;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 c->read->event_handler = ngx_http_upstream_process_header;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 c->sendfile = r->connection->sendfile;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304 c->pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 c->read->log = c->write->log = c->log = r->connection->log;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 u->writer.out = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 u->writer.last = &u->writer.out;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 u->writer.connection = c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 u->writer.limit = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 if (u->request_sent) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 ngx_http_upstream_reinit(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 if (r->request_body->buf) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 if (r->request_body->temp_file) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 if (!(u->output.free = ngx_alloc_chain_link(r->pool))) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327 u->output.free->buf = r->request_body->buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 u->output.free->next = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 u->output.allocated = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 r->request_body->buf->pos = r->request_body->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 r->request_body->buf->last = r->request_body->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 r->request_body->buf->tag = u->output.tag;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 r->request_body->buf->pos = r->request_body->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 u->request_sent = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343 ngx_add_timer(c->write, u->conf->connect_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 static void ngx_http_upstream_reinit(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354 ngx_http_upstream_t *u)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 ngx_chain_t *cl;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 if (u->reinit_request(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 /* reinit the request chain */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 for (cl = r->request_body->bufs; cl; cl = cl->next) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 cl->buf->pos = cl->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 cl->buf->file_pos = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 /* reinit the ngx_output_chain() context */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 u->output.buf = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 u->output.in = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375 u->output.free = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 u->output.busy = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 /* reinit u->header_in buffer */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 u->header_in.pos = u->header_in.start + u->cache->ctx.header_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 u->header_in.last = u->header_in.pos;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 u->header_in.pos = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387 u->header_in.last = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 #else
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 u->header_in.pos = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391 u->header_in.last = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 /* add one more state */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 if (!(u->state = ngx_push_array(&u->states))) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 u->status = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405 u->status_count = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 static void ngx_http_upstream_send_request(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 ngx_http_upstream_t *u)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
412 int rc;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
413 ngx_connection_t *c;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 "http upstream send request");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 #if (NGX_HAVE_KQUEUE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 && !u->request_sent
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 && c->write->pending_eof)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 ngx_log_error(NGX_LOG_ERR, c->log, c->write->kq_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 "connect() failed");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
435 c->log->action = "sending request to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 rc = ngx_output_chain(&u->output,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 u->request_sent ? NULL : r->request_body->bufs);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 u->request_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 if (c->write->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 ngx_del_timer(c->write);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 ngx_add_timer(c->write, u->conf->send_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 if (ngx_handle_write_event(c->write, u->conf->send_lowat) == NGX_ERROR)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 ngx_tcp_push_n " failed");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 ngx_add_timer(c->read, u->conf->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 #if 1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482 if (c->read->ready) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 /* post aio operation */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 * TODO comment
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488 * although we can post aio operation just in the end
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 * of ngx_http_upstream_connect() CHECK IT !!!
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 * it's better to do here because we postpone header buffer allocation
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 ngx_http_upstream_process_header(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498 c->write->event_handler = ngx_http_upstream_dummy_handler;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 if (ngx_handle_level_write_event(c->write) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 static void ngx_http_upstream_send_request_handler(ngx_event_t *wev)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 c = wev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 "http upstream send request handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 if (wev->timedout) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
522 c->log->action = "sending request to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527 if (r->connection->write->eof && (!u->cachable || !u->request_sent)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
531 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
532
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
533 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537 static void ngx_http_upstream_process_header(ngx_event_t *rev)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539 ssize_t n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 ngx_int_t rc;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 c = rev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
550 "http upstream process header");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
552 c->log->action = "reading response header from upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554 if (rev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 if (u->header_in.start == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 u->header_in.start = ngx_palloc(r->pool, u->conf->header_buffer_size);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561 if (u->header_in.start == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567 u->header_in.pos = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568 u->header_in.last = u->header_in.start;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
569 u->header_in.end = u->header_in.start + u->conf->header_buffer_size;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 u->header_in.temporary = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 u->header_in.tag = u->output.tag;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
574 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
575 if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
576 u->header_in.pos += u->cache->ctx.header_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
577 u->header_in.last = u->header_in.pos;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
578 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
579 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582 n = ngx_recv(u->peer.connection, u->header_in.last,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583 u->header_in.end - u->header_in.last);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585 if (n == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
590 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
592 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
593 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
594 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
596 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
597 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
599 if (n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
600 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 "upstream prematurely closed connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 if (n == NGX_ERROR || n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
608
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609 if (n == NGX_HTTP_INTERNAL_SERVER_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
610 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
614
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 u->header_in.last += n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
618 u->valid_header_in = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
619
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
620 u->peer.cached = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
621 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 rc = u->process_header(r);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
624
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
626 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
627 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
628 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
629
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
630 if (u->header_in.last == u->header_in.end) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
631 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
632 "upstream sent too big header");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
633
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
634 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
635 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
636 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
637
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
638 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
639 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
640 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
641 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
642 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
643
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
644 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
646
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
647 if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
648 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
649 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
650 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
652 if (rc == NGX_ERROR || rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
653 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
654 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
655 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
656 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
657
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
658 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
659
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
660 ngx_http_upstream_send_response(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
661 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
662
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
663
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
664 static void ngx_http_upstream_send_response(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
665 ngx_http_upstream_t *u)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
666 {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
667 ngx_int_t rc;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
668 ngx_event_pipe_t *p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
669 ngx_http_core_loc_conf_t *clcf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
670
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
671 rc = u->send_header(r);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
673 if (rc == NGX_ERROR || rc > NGX_OK) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
674 ngx_http_upstream_finalize_request(r, u, rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
675 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678 u->header_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
680 /* TODO: preallocate event_pipe bufs, look "Content-Length" */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
681
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
682 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
683
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
684 if (u->cache && u->cache->ctx.file.fd != NGX_INVALID_FILE) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
685 if (ngx_close_file(u->cache->ctx.file.fd) == NGX_FILE_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 ngx_close_file_n " \"%s\" failed",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
688 u->cache->ctx.file.name.data);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692 if (u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
693 header = (ngx_http_cache_header_t *) u->header_in->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
695 header->expires = u->cache->ctx.expires;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
696 header->last_modified = u->cache->ctx.last_modified;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
697 header->date = u->cache->ctx.date;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
698 header->length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
699 u->cache->ctx.length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
700
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
701 header->key_len = u->cache->ctx.key0.len;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
702 ngx_memcpy(&header->key, u->cache->ctx.key0.data, header->key_len);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
703 header->key[header->key_len] = LF;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
704 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
705
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
706 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
707
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
708 p = &u->pipe;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
710 p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
711 p->output_ctx = r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
712 p->tag = u->output.tag;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 p->bufs = u->conf->bufs;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714 p->busy_size = u->conf->busy_buffers_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715 p->upstream = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 p->downstream = r->connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 p->pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
718 p->log = r->connection->log;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
719
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
720 p->cachable = u->cachable;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
721
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
722 if (!(p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
723 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
727 p->temp_file->file.fd = NGX_INVALID_FILE;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
728 p->temp_file->file.log = r->connection->log;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
729 p->temp_file->path = u->conf->temp_path;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730 p->temp_file->pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
731
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
732 if (u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
733 p->temp_file->persistent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
734 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
735 p->temp_file->warn = "an upstream response is buffered "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736 "to a temporary file";
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
737 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
738
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
739 p->max_temp_file_size = u->conf->max_temp_file_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
740 p->temp_file_write_size = u->conf->temp_file_write_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
741
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
742 if (!(p->preread_bufs = ngx_alloc_chain_link(r->pool))) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
743 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
744 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
745 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
746 p->preread_bufs->buf = &u->header_in;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
747 p->preread_bufs->next = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
748 u->header_in.recycled = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750 p->preread_size = u->header_in.last - u->header_in.pos;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
751
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752 if (u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
753 p->buf_to_file = ngx_calloc_buf(r->pool);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
754 if (p->buf_to_file == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
755 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
756 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
758 p->buf_to_file->pos = u->header_in.start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
759 p->buf_to_file->last = u->header_in.pos;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
760 p->buf_to_file->temporary = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
761 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
762
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
763 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
764 /* the posted aio operation may currupt a shadow buffer */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
765 p->single_buf = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
766 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
767
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769 p->free_bufs = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772 * event_pipe would do u->header_in.last += p->preread_size
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773 * as though these bytes were read
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775 u->header_in.last = u->header_in.pos;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777 if (u->conf->cyclic_temp_file) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780 * we need to disable the use of sendfile() if we use cyclic temp file
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 * because the writing a new data may interfere with sendfile()
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782 * that uses the same kernel file pages (at least on FreeBSD)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
784
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
785 p->cyclic_temp_file = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
786 r->connection->sendfile = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
787
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
788 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
789 p->cyclic_temp_file = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
790 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
791
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
792 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
793
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
794 p->read_timeout = u->conf->read_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
795 p->send_timeout = clcf->send_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
796 p->send_lowat = clcf->send_lowat;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
797
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798 u->peer.connection->read->event_handler = ngx_http_upstream_process_body;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799 r->connection->write->event_handler = ngx_http_upstream_process_body;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801 ngx_http_upstream_process_body(u->peer.connection->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 static void ngx_http_upstream_process_body(ngx_event_t *ev)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810 ngx_event_pipe_t *p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
811
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
812 c = ev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
813 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
814 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
815
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
816 if (ev->write) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
817 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
818 "http upstream process downstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
819 c->log->action = "sending to client";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
820
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
821 } else {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
822 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
823 "http upstream process upstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
824 c->log->action = "reading upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
825 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
826
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827 p = &u->pipe;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
828
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
829 if (ev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
830 if (ev->write) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
831 p->downstream_error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833 "client timed out");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
834
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
835 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
836 p->upstream_error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
838 "upstream timed out");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842 if (ngx_event_pipe(p, ev->write) == NGX_ABORT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
844 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
845 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
846 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
847
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
849
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850 #if (NGX_HTTP_FILE_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
851
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852 if (p->upstream_done && u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
856 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
858
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
859 } else if (p->upstream_eof && u->cachable) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
860
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
861 /* TODO: check length & update cache */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
864 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
865 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
866 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
867 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
868 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
869
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
870 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
871
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
872 if (p->upstream_done || p->upstream_eof || p->upstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
873 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
874 "http upstream exit: %p", p->out);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
876 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
877 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
878 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
879 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
881 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
882
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
883 if (p->downstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
884 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
885 "http upstream downstream error");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
886
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
887 if (!u->cachable && u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
888 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
889 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
890 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
891 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
892
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
893
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
894 static void ngx_http_upstream_dummy_handler(ngx_event_t *wev)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
896 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
897 "http upstream dummy handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
898 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
899
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
900
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
901 static void ngx_http_upstream_next(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
902 ngx_http_upstream_t *u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903 ngx_uint_t ft_type)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905 ngx_uint_t status;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
906
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
907 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
908 "http next upstream, %xD", ft_type);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
909
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
910 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
911 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
913
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914 if (ft_type != NGX_HTTP_UPSTREAM_FT_HTTP_404) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
915 ngx_event_connect_peer_failed(&u->peer);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
917
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
918 if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
919 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
920 "upstream timed out");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
921 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
922
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
923 if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
924 status = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
925
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
926 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
927 switch(ft_type) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
928
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
929 case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
930 status = NGX_HTTP_GATEWAY_TIME_OUT;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
931 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
932
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
933 case NGX_HTTP_UPSTREAM_FT_HTTP_500:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
934 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
935 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
936
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
937 case NGX_HTTP_UPSTREAM_FT_HTTP_404:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
938 status = NGX_HTTP_NOT_FOUND;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
939 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
940
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
941 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
942 * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
943 * never reach here
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946 default:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 status = NGX_HTTP_BAD_GATEWAY;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951 if (r->connection->write->eof) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957 if (status) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
958 u->state->status = status;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960 if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type))
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
961 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963 #if (NGX_HTTP_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 if (u->stale && (u->conf->use_stale & ft_type)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966 ngx_http_upstream_finalize_request(r, u,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
967 ngx_http_send_cached_response(r));
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
968 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
971 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
972
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
973 ngx_http_upstream_finalize_request(r, u, status);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
974 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
975 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
976 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
977
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
978 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
979 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 "close http upstream connection: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
981 u->peer.connection->fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
982
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
983 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
985
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
987 if (u->conf->busy_lock && !u->busy_locked) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
988 ngx_http_upstream_busy_lock(p);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
993 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
994 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
996
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
997 static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
998 ngx_http_upstream_t *u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
999 ngx_int_t rc)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1000 {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1001 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1002 "finalize http upstream request: %i", rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004 u->finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1008 "close http upstream connection: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 u->peer.connection->fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1012 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1013
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1014 u->peer.connection = NULL;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1015
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1016 if (u->header_sent
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1017 && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1018 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1019 rc = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1020 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1021
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1022 if (u->saved_log_ctx) {
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1023 r->connection->log->data = u->saved_log_ctx;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1024 r->connection->log->handler = u->saved_log_handler;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1025 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1026
30
e1ada20fc595 nginx 0.1.15
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1027 if (u->pipe.temp_file) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1028 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1029 "http upstream temp fd: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1030 u->pipe.temp_file->file.fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1031 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1032
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1033 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1034 if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1035 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1036 "http upstream cache fd: %d",
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1037 u->cache->ctx.file.fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1038 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1039 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1040
30
e1ada20fc595 nginx 0.1.15
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1041 if (u->pipe.temp_file) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1042 r->file.fd = u->pipe.temp_file->file.fd;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1043
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1044 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1045 } else if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1046 r->file.fd = u->cache->ctx.file.fd;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1047 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1048 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1049
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1050 r->connection->log->action = "sending to client";
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1051
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1052 if (rc == 0 && r->main == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1053 rc = ngx_http_send_last(r);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1054 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1055
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1056 ngx_http_finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1057 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1058
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1059
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1060 static size_t ngx_http_upstream_log_status_getlen(ngx_http_request_t *r,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1061 uintptr_t data)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1062 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1063 if (r->upstream) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1064 return r->upstream->states.nelts * (3 + 2);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1065 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1066
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1067 return 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1068 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1069
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1070
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1071 static u_char *ngx_http_upstream_log_status(ngx_http_request_t *r, u_char *buf,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1072 ngx_http_log_op_t *op)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1073 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1074 ngx_uint_t i;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1075 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1076 ngx_http_upstream_state_t *state;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1077
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1078 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1079
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1080 if (u == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1081 *buf = '-';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1082 return buf + 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1083 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1084
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1085 i = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1086 state = u->states.elts;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1087
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1088 for ( ;; ) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1089 if (state[i].status == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1090 *buf++ = '-';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1091
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1092 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1093 buf = ngx_sprintf(buf, "%ui", state[i].status);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1094 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1095
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1096 if (++i == u->states.nelts) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1097 return buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1098 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1099
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1100 *buf++ = ',';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1101 *buf++ = ' ';
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1102 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1103 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1104
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1105
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1106 u_char *ngx_http_upstream_log_error(ngx_log_t *log, u_char *buf, size_t len)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1107 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1108 u_char *p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1109 ngx_int_t escape;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1110 ngx_str_t uri;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1111 ngx_http_log_ctx_t *ctx;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1112 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1113 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1114 ngx_peer_connection_t *peer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1115
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1116 ctx = log->data;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1117 r = ctx->request;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1118 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1119 peer = &u->peer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1120
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1121 p = ngx_snprintf(buf, len,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1122 " while %s, client: %V, URL: %V, upstream: %V%V%s%V",
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1123 log->action,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1124 &r->connection->addr_text,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1125 &r->unparsed_uri,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1126 &u->schema,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1127 &peer->peers->peer[peer->cur_peer].name,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1128 peer->peers->peer[peer->cur_peer].uri_separator,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1129 &u->uri);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1130 len -= p - buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1131 buf = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1132
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1133 if (r->quoted_uri) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1134 escape = 2 * ngx_escape_uri(NULL, r->uri.data + u->location->len,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1135 r->uri.len - u->location->len,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1136 NGX_ESCAPE_URI);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1137 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1138 escape = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1139 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1140
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1141 if (escape) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1142 if (len >= r->uri.len - u->location->len + escape) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1143
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1144 ngx_escape_uri(buf, r->uri.data + u->location->len,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1145 r->uri.len - u->location->len, NGX_ESCAPE_URI);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1146
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1147 buf += r->uri.len - u->location->len + escape;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1148
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1149 if (r->args.len == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1150 return buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1151 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1152
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1153 len -= r->uri.len - u->location->len + escape;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1154
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1155 return ngx_snprintf(buf, len, "?%V", &r->args);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1156 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1157
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1158 p = ngx_palloc(r->pool, r->uri.len - u->location->len + escape);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1159 if (p == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1160 return buf;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1161 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1162
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1163 ngx_escape_uri(p, r->uri.data + u->location->len,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1164 r->uri.len - u->location->len, NGX_ESCAPE_URI);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1165
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1166 uri.len = r->uri.len - u->location->len + escape;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1167 uri.data = p;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1168
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1169 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1170 uri.len = r->uri.len - u->location->len;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1171 uri.data = r->uri.data + u->location->len;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1172
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1173 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1174
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1175 return ngx_snprintf(buf, len, "%V%s%V",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1176 &uri, r->args.len ? "?" : "", &r->args);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1177 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1178
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1179
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1180 static ngx_int_t ngx_http_upstream_add_log_formats(ngx_conf_t *cf)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1181 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1182 ngx_http_log_op_name_t *op;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1183
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1184 for (op = ngx_http_upstream_log_fmt_ops; op->name.len; op++) { /* void */ }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1185 op->run = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1186
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1187 for (op = ngx_http_log_fmt_ops; op->run; op++) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1188 if (op->name.len == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1189 op = (ngx_http_log_op_name_t *) op->run;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1190 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1191 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1192
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1193 op->run = (ngx_http_log_op_run_pt) ngx_http_upstream_log_fmt_ops;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1194
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1195 return NGX_OK;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1196 }