annotate src/http/modules/proxy/ngx_http_proxy_upstream.c @ 176:c0552e5ab567

nginx-0.0.1-2003-11-09-23:03:38 import; separate building
author Igor Sysoev <igor@sysoev.ru>
date Sun, 09 Nov 2003 20:03:38 +0000
parents e92c2c647c57
children 4db54fdbcbe7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 #include <ngx_config.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 #include <ngx_core.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 #include <ngx_event.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 #include <ngx_event_connect.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 #include <ngx_event_pipe.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_http.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_http_proxy_handler.h>
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
11 static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
12 static void ngx_http_proxy_init_upstream(void *data);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
13 static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
14 static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
15 static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
16 static void ngx_http_proxy_send_request_handler(ngx_event_t *wev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
17 static void ngx_http_proxy_dummy_handler(ngx_event_t *wev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
18 static void ngx_http_proxy_process_upstream_status_line(ngx_event_t *rev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
19 static void ngx_http_proxy_process_upstream_headers(ngx_event_t *rev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
20 static ssize_t ngx_http_proxy_read_upstream_header(ngx_http_proxy_ctx_t *);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
21 static void ngx_http_proxy_send_response(ngx_http_proxy_ctx_t *p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
22 static void ngx_http_proxy_process_body(ngx_event_t *ev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
23 static void ngx_http_proxy_next_upstream(ngx_http_proxy_ctx_t *p, int ft_type);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
24
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
25
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
26 static ngx_str_t http_methods[] = {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
27 ngx_string("GET "),
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
28 ngx_string("HEAD "),
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
29 ngx_string("POST ")
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
30 };
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
31
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
32
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
33 static char *upstream_header_errors[] = {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
34 "upstream sent invalid header",
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
35 "upstream sent too long header line"
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
36 };
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
37
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
38
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
39 static char http_version[] = " HTTP/1.0" CRLF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
40 static char host_header[] = "Host: ";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
41 static char connection_close_header[] = "Connection: close" CRLF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
42
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
43
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
44 int ngx_http_proxy_request_upstream(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
45 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
46 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
47 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
48 ngx_http_proxy_upstream_t *u;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
49
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
50 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
51
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
52 if (!(u = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_upstream_t)))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
53 return NGX_HTTP_INTERNAL_SERVER_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
54 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
55
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
56 p->upstream = u;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
57
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
58 u->peer.peers = p->lcf->peers;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
59 u->peer.tries = p->lcf->peers->number;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
60
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
61 u->method = r->method;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
62
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
63 if (r->headers_in.content_length_n > 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
64 if (!(r->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
65 return NGX_HTTP_INTERNAL_SERVER_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
66 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
67
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
68 r->temp_file->file.fd = NGX_INVALID_FILE;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
69 r->temp_file->file.log = r->connection->log;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
70 r->temp_file->path = p->lcf->temp_path;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
71 r->temp_file->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
72 r->temp_file->warn = "a client request body is buffered "
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
73 "to a temporary file";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
74 /* r->temp_file->persistent = 0; */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
75
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
76 r->request_body_handler = ngx_http_proxy_init_upstream;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
77 r->data = p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
78
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
79 rc = ngx_http_read_client_request_body(r, p->lcf->request_buffer_size);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
80
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
81 if (rc == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
82 return NGX_DONE;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
83 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
84
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
85 if (rc == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
86 return NGX_HTTP_INTERNAL_SERVER_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
87 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
88 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
89
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
90 ngx_http_proxy_init_upstream(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
91
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
92 return NGX_DONE;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
93 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
94
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
95
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
96 static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
97 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
98 int i;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
99 size_t len;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
100 ngx_hunk_t *h;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
101 ngx_chain_t *chain;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
102 ngx_table_elt_t *header;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
103 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
104 ngx_http_proxy_upstream_conf_t *uc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
105
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
106 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
107 uc = p->lcf->upstream;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
108
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
109 len = http_methods[p->upstream->method - 1].len
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
110 + uc->uri.len
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
111 + r->uri.len - uc->location->len
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
112 + 1 + r->args.len /* 1 is for "?" */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
113 + sizeof(http_version) - 1
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
114 + sizeof(host_header) - 1 + uc->host_header.len + 2
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
115 /* 2 is for "\r\n" */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
116 + sizeof(connection_close_header) - 1
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
117 + 2; /* 2 is for "\r\n" at the header end */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
118
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
119 header = (ngx_table_elt_t *) r->headers_in.headers->elts;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
120 for (i = 0; i < r->headers_in.headers->nelts; i++) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
121
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
122 if (&header[i] == r->headers_in.host) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
123 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
124 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
125
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
126 if (&header[i] == r->headers_in.connection) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
127 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
128 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
129
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
130 /* 2 is for ": " and 2 is for "\r\n" */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
131 len += header[i].key.len + 2 + header[i].value.len + 2;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
132 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
133
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
134 /* STUB */ len++;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
135
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
136 ngx_test_null(h, ngx_create_temp_hunk(r->pool, len), NULL);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
137 ngx_alloc_link_and_set_hunk(chain, h, r->pool, NULL);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
138
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
139
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
140 /* the request line */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
141
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
142 h->last = ngx_cpymem(h->last, http_methods[p->upstream->method - 1].data,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
143 http_methods[p->upstream->method - 1].len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
144
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
145 h->last = ngx_cpymem(h->last, uc->uri.data, uc->uri.len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
146
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
147 h->last = ngx_cpymem(h->last,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
148 r->uri.data + uc->location->len,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
149 r->uri.len - uc->location->len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
150
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
151 if (r->args.len > 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
152 *(h->last++) = '?';
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
153 h->last = ngx_cpymem(h->last, r->args.data, r->args.len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
154 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
155
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
156 h->last = ngx_cpymem(h->last, http_version, sizeof(http_version) - 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
157
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
158
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
159 /* "Host" header */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
160
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
161 h->last = ngx_cpymem(h->last, host_header, sizeof(host_header) - 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
162 h->last = ngx_cpymem(h->last, uc->host_header.data, uc->host_header.len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
163 *(h->last++) = CR; *(h->last++) = LF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
164
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
165
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
166 /* "Connection: close" header */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
167
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
168 h->last = ngx_cpymem(h->last, connection_close_header,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
169 sizeof(connection_close_header) - 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
170
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
172 for (i = 0; i < r->headers_in.headers->nelts; i++) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
173
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
174 if (&header[i] == r->headers_in.host) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
175 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
176 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
177
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
178 if (&header[i] == r->headers_in.connection) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
179 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
180 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
181
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
182 if (&header[i] == r->headers_in.keep_alive) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
183 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
184 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
185
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
186 h->last = ngx_cpymem(h->last, header[i].key.data, header[i].key.len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
187
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
188 *(h->last++) = ':'; *(h->last++) = ' ';
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
189
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
190 h->last = ngx_cpymem(h->last, header[i].value.data,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
191 header[i].value.len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
192
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
193 *(h->last++) = CR; *(h->last++) = LF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
194
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
195 ngx_log_debug(r->connection->log, "proxy: '%s: %s'" _
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
196 header[i].key.data _ header[i].value.data);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
197 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
198
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
199 /* add "\r\n" at the header end */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
200 *(h->last++) = CR; *(h->last++) = LF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
201
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
202 /* STUB */ *(h->last) = '\0';
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
203 ngx_log_debug(r->connection->log, "PROXY:\n'%s'" _ h->pos);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
204
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
205 return chain;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
206 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
207
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
208
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
209 static void ngx_http_proxy_init_upstream(void *data)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
210 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
211 ngx_http_proxy_ctx_t *p = data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
212
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
213 ngx_chain_t *cl;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
214 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
215 ngx_output_chain_ctx_t *octx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
216 ngx_chain_writer_ctx_t *wctx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
217
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
218 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
219
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
220 ngx_log_debug(r->connection->log, "timer_set: %d" _
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
221 r->connection->read->timer_set);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
222
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
223 if (r->connection->read->timer_set) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
224 ngx_del_timer(r->connection->read);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
225 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
226
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
227 if (!(cl = ngx_http_proxy_create_request(p))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
228 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
229 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
230 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
231
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
232 if (r->request_hunks) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
233 cl->next = r->request_hunks;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
234 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
235
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
236 r->request_hunks = cl;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
237
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
238 p->upstream->peer.log = r->connection->log;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
239 p->saved_ctx = r->connection->log->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
240 p->saved_handler = r->connection->log->handler;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
241 r->connection->log->data = p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
242 r->connection->log->handler = ngx_http_proxy_log_error;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
243 p->action = "connecting to upstream";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
244
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
245 if (!(octx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t)))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
246 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
247 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
248 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
249
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
250 p->upstream->output_chain_ctx = octx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
251
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
252 octx->sendfile = r->sendfile;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
253 octx->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
254 octx->bufs.num = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
255 octx->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
256 octx->output_filter = (ngx_output_chain_filter_pt) ngx_chain_writer;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
257
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
258 if (!(wctx = ngx_palloc(r->pool, sizeof(ngx_chain_writer_ctx_t)))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
259 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
260 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
261 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
262
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
263 octx->output_ctx = wctx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
264
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
265 wctx->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
266
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
267 if (p->lcf->busy_lock && !p->busy_locked) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
268 ngx_http_proxy_upstream_busy_lock(p);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
269 } else {
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
270 ngx_http_proxy_connect(p);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
271 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
272 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
273
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
274
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
275 static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p)
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 ngx_chain_t *cl;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 ngx_output_chain_ctx_t *octx;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
280 octx = p->upstream->output_chain_ctx;
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 /* reinit the request chain */
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 for (cl = p->request->request_hunks; cl; cl = cl->next) {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 cl->hunk->pos = cl->hunk->start;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 /* reinit ngx_output_chain() context */
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 octx->hunk = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 octx->in = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 octx->free = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 octx->busy = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 /* reinit r->header_in buffer */
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 if (p->header_in) {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 if (p->cache) {
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
299 p->header_in->pos = p->header_in->start + p->cache->ctx.header_size;
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 p->header_in->last = p->header_in->pos;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 } else {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 p->header_in->pos = p->header_in->start;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 p->header_in->last = p->header_in->start;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 }
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
307
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
308 p->status = 0;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
309 p->status_count = 0;
170
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
311
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
312
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
313 void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p)
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
314 {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
315 int rc, ft_type;
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
316
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
317 if (p->busy_lock.time == 0) {
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
318 p->busy_lock.event = p->request->connection->read;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
319 p->busy_lock.event_handler = ngx_http_proxy_busy_lock_handler;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
320 }
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
321
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
322 rc = ngx_http_busy_lock(p->lcf->busy_lock, &p->busy_lock);
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
323
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
324 if (rc == NGX_AGAIN) {
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
325 return;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
326 }
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
327
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
328 if (rc == NGX_OK) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
329 ngx_http_proxy_connect(p);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
330 return;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
331 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
332
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
333 if (rc == NGX_DONE) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
334 ft_type = NGX_HTTP_PROXY_FT_BUSY_LOCK;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
335
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
336 } else {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
337 /* rc == NGX_ERROR */
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
338 ft_type = NGX_HTTP_PROXY_FT_MAX_WAITING;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
339 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
340
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
341 if (p->stale && (p->lcf->use_stale & ft_type)) {
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
342 ngx_http_proxy_finalize_request(p,
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
343 ngx_http_proxy_send_cached_response(p));
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
344 return;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
345 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
346
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
347 ngx_http_proxy_finalize_request(p, NGX_HTTP_SERVICE_UNAVAILABLE);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
348 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
349
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
350
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
351 static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
352 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
353 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
354 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
355 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
356 ngx_output_chain_ctx_t *octx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
357
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
358 p->action = "connecting to upstream";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
359
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
360 rc = ngx_event_connect_peer(&p->upstream->peer);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
361
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
362 if (rc == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
363 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
364 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
365 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
366
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
367 p->state->peer =
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
368 &p->upstream->peer.peers->peers[p->upstream->peer.cur_peer].addr_port_text;
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
369
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
370 if (rc == NGX_CONNECT_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
371 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
372 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
373 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
374
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
375 p->upstream->peer.connection->data = p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
376 p->upstream->peer.connection->write->event_handler =
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
377 ngx_http_proxy_send_request_handler;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
378 p->upstream->peer.connection->read->event_handler =
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
379 ngx_http_proxy_process_upstream_status_line;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
380
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
381 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
382 c = p->upstream->peer.connection;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
383 c->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
384 c->read->log = c->write->log = c->log = r->connection->log;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
385
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
386 octx = p->upstream->output_chain_ctx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
387
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
388 if (p->upstream->peer.tries > 1 && p->request_sent) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
389 ngx_http_proxy_reinit_upstream(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
390 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
391
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
392 /* init or reinit ngx_output_chain() context */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
393
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
394 if (r->request_body_hunk) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
395 if (!(octx->free = ngx_alloc_chain_link(r->pool))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
396 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
397 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
398 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
399
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
400 octx->free->hunk = r->request_body_hunk;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
401 octx->free->next = NULL;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
402 octx->hunks = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
403
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
404 r->request_body_hunk->pos = r->request_body_hunk->start;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
405 r->request_body_hunk->last = r->request_body_hunk->start;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
406 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
407
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
408 p->request_sent = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
409
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
410 if (!(p->state = ngx_push_array(&p->states))) {
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
411 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
412 return;
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
413 }
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
414
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
415 if (rc == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
416 ngx_add_timer(c->write, p->lcf->connect_timeout);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
417 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
418 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
419
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
420 /* rc == NGX_OK */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
421
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
422 #if 1 /* test only */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
423
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
424 if (c->read->ready) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
425 /* post aio operation */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
426 ngx_http_proxy_process_upstream_status_line(c->read);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
427 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
428 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
429 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
430
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
431 ngx_http_proxy_send_request(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
432 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
433
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
434
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
435 static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
436 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
437 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
438 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
439 ngx_chain_writer_ctx_t *wctx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
440
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
441 c = p->upstream->peer.connection;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
442
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
443 #if (HAVE_KQUEUE)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
444
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
445 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
446 && !p->request_sent
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
447 && c->write->kq_eof)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
448 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
449 ngx_log_error(NGX_LOG_ERR, c->log, c->write->kq_errno,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
450 "connect() failed");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
451
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
452 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
453 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
454 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
455
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
456 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
457
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
458 p->action = "sending request to upstream";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
459
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
460 wctx = p->upstream->output_chain_ctx->output_ctx;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
461 wctx->out = NULL;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
462 wctx->last = &wctx->out;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
463 wctx->connection = c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
464
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
465 rc = ngx_output_chain(p->upstream->output_chain_ctx,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
466 p->request_sent ? NULL : p->request->request_hunks);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
467
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
468 if (rc == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
469 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
470 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
471 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
472
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
473 p->request_sent = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
474
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
475 if (c->write->timer_set) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
476 ngx_del_timer(c->write);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
477 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
478
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
479 if (rc == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
480 ngx_add_timer(c->write, p->lcf->send_timeout);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
481
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
482 if (ngx_handle_write_event(c->write, /* STUB: lowat */ 0) == NGX_ERROR)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
483 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
484 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
485 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
486 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
487
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
488 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
489 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
490
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
491 /* rc == NGX_OK */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
492
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
493 if (c->tcp_nopush) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
494 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
495 ngx_log_error(NGX_LOG_CRIT, c->log,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
496 ngx_socket_errno,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
497 ngx_tcp_push_n " failed");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
498 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
499 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
500 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
501
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
502 c->tcp_nopush = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
503 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
504 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
505
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
506 #if 0
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
507 if (c->read->ready) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
508
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
509 /* post aio operation */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
510
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
511 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
512 * although we can post aio operation just in the end
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
513 * of ngx_http_proxy_connect() CHECK IT !!!
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
514 * it's better to do here because we postpone header buffer allocation
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
515 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
516
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
517 ngx_http_proxy_process_upstream_status_line(c->read);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
518 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
519 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
520 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
521
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
522 p->upstream->peer.connection->write->event_handler =
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
523 ngx_http_proxy_dummy_handler;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
524
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
525 if (ngx_handle_level_write_event(c->write) == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
526 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
527 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
528 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
529 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
530
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
531
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
532 static void ngx_http_proxy_send_request_handler(ngx_event_t *wev)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
533 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
534 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
535 ngx_http_proxy_ctx_t *p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
536
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
537 c = wev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
538 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
539
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
540 if (wev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
541 p->action = "sending request to upstream";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
542 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_TIMEOUT);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
543 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
544 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
545
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
546 ngx_http_proxy_send_request(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
547 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
548
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
549
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
550 static void ngx_http_proxy_dummy_handler(ngx_event_t *wev)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
551 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
552 ngx_log_debug(wev->log, "dummy handler");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
553 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
554
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
555
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
556 static void ngx_http_proxy_process_upstream_status_line(ngx_event_t *rev)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
557 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
558 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
559 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
560 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
561 ngx_http_proxy_ctx_t *p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
562
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
563 c = rev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
564 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
565 p->action = "reading upstream status line";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
566
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
567 ngx_log_debug(rev->log, "http proxy process status line");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
568
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
569 if (rev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
570 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_TIMEOUT);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
571 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
572 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
573
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
574 if (p->header_in == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
575 p->header_in = ngx_create_temp_hunk(p->request->pool,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
576 p->lcf->header_buffer_size);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
577 if (p->header_in == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
578 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
579 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
580 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
581 p->header_in->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
582
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
583 if (p->cache) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
584 p->header_in->pos += p->cache->ctx.header_size;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
585 p->header_in->last = p->header_in->pos;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
586 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
587 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
588
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
589 n = ngx_http_proxy_read_upstream_header(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
590
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
591 if (n == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
592 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
593 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
594
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
595 if (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
596 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
597 "upstream prematurely closed connection");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
598 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
599
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
600 if (n == NGX_ERROR || n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
601 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
602 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
603 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
604
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
605 p->valid_header_in = 0;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
606
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
607 p->upstream->peer.cached = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
608
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
609 rc = ngx_http_proxy_parse_status_line(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
610
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
611 if (rc == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
612 if (p->header_in->pos == p->header_in->last) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
613 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
614 "upstream sent too long status line");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
615 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_INVALID_HEADER);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
616 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
617 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
618 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
619
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
620 if (rc == NGX_HTTP_PROXY_PARSE_NO_HEADER) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
621 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
622 "upstream sent no valid HTTP/1.0 header");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
623
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
624 if (p->accel) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
625 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_INVALID_HEADER);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
626
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
627 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
628 p->request->http_version = NGX_HTTP_VERSION_9;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
629 p->upstream->status = NGX_HTTP_OK;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
630 ngx_http_proxy_send_response(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
631 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
632
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
633 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
634 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
635
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
636 /* rc == NGX_OK */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
637
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
638 p->upstream->status = p->status;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
639
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
640 if (p->status == NGX_HTTP_INTERNAL_SERVER_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
641
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
642 if (p->upstream->peer.tries > 1
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
643 && (p->lcf->next_upstream & NGX_HTTP_PROXY_FT_HTTP_500))
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
644 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
645 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_HTTP_500);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
646 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
647 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
648
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
649 if (p->upstream->peer.tries == 0
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
650 && p->stale
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
651 && (p->lcf->use_stale & NGX_HTTP_PROXY_FT_HTTP_500))
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
652 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
653 ngx_http_proxy_finalize_request(p,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
654 ngx_http_proxy_send_cached_response(p));
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
655
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
656 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
657 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
658 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
659
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
660 if (p->status == NGX_HTTP_NOT_FOUND
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
661 && p->upstream->peer.tries > 1
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
662 && p->lcf->next_upstream & NGX_HTTP_PROXY_FT_HTTP_404)
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
663 {
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
664 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_HTTP_404);
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
665 return;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
666 }
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
667
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
668 /* TODO: "proxy_error_page" */
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
669
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
670 p->upstream->status_line.len = p->status_end - p->status_start;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
671 p->upstream->status_line.data = ngx_palloc(p->request->pool,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
672 p->upstream->status_line.len + 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
673 if (p->upstream->status_line.data == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
674 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
675 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
676 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
677 ngx_cpystrn(p->upstream->status_line.data, p->status_start,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
678 p->upstream->status_line.len + 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
679
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
680 ngx_log_debug(rev->log, "http proxy status %d '%s'" _
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
681 p->upstream->status _ p->upstream->status_line.data);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
682
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
683 if (p->upstream->headers_in.headers) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
684 p->upstream->headers_in.headers->nelts = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
685 } else {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
686 /* TODO: ngx_init_table */
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
687 p->upstream->headers_in.headers = ngx_create_table(p->request->pool,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
688 20);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
689 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
690
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
691 c->read->event_handler = ngx_http_proxy_process_upstream_headers;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
692 ngx_http_proxy_process_upstream_headers(rev);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
693 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
694
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
695
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
696 static void ngx_http_proxy_process_upstream_headers(ngx_event_t *rev)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
697 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
698 int i, rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
699 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
700 ngx_table_elt_t *h;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
701 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
702 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
703 ngx_http_proxy_ctx_t *p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
704
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
705 c = rev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
706 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
707 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
708 p->action = "reading upstream headers";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
709
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
710 ngx_log_debug(rev->log, "http proxy process header line");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
711
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
712 if (rev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
713 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_TIMEOUT);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
714 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
715 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
716
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
717 rc = NGX_AGAIN;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
718
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
719 for ( ;; ) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
720 if (rc == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
721 n = ngx_http_proxy_read_upstream_header(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
722
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
723 if (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
724 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
725 "upstream prematurely closed connection");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
726 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
727
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
728 if (n == NGX_ERROR || n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
729 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
730 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
731 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
732
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
733 if (n == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
734 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
735 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
736 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
737
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
738 rc = ngx_http_parse_header_line(p->request, p->header_in);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
739
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
740 if (rc == NGX_OK) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
741
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
742 /* a header line has been parsed successfully */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
743
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
744 h = ngx_http_add_header(&p->upstream->headers_in,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
745 ngx_http_proxy_headers_in);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
746 if (h == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
747 ngx_http_proxy_finalize_request(p,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
748 NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
749 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
750 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
751
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
752 h->key.len = r->header_name_end - r->header_name_start;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
753 h->value.len = r->header_end - r->header_start;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
754
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
755 h->key.data = ngx_palloc(p->request->pool,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
756 h->key.len + 1 + h->value.len + 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
757 if (h->key.data == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
758 ngx_http_proxy_finalize_request(p,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
759 NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
760 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
761 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
762
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
763 h->value.data = h->key.data + h->key.len + 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
764 ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
765 ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
766
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
767 for (i = 0; ngx_http_proxy_headers_in[i].name.len != 0; i++) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
768 if (ngx_http_proxy_headers_in[i].name.len != h->key.len) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
769 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
770 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
771
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
772 if (ngx_strcasecmp(ngx_http_proxy_headers_in[i].name.data,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
773 h->key.data) == 0)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
774 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
775 *((ngx_table_elt_t **) ((char *) &p->upstream->headers_in
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
776 + ngx_http_proxy_headers_in[i].offset)) = h;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
777 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
778 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
779 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
780
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
781 ngx_log_debug(c->log, "HTTP proxy header: '%s: %s'" _
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
782 h->key.data _ h->value.data);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
783
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
784 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
785
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
786 } else if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
787
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
788 /* a whole header has been parsed successfully */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
789
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
790 ngx_log_debug(c->log, "HTTP header done");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
791
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
792 /* TODO: hook to process the upstream header */
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
793
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
794 if (p->cachable) {
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
795 p->cachable = ngx_http_proxy_is_cachable(p);
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
796 }
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
797
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
798 ngx_http_proxy_send_response(p);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
799 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
800
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
801 } else if (rc != NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
802
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
803 /* there was error while a header line parsing */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
804
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
805 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
806 upstream_header_errors[rc - NGX_HTTP_PARSE_HEADER_ERROR]);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
807
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
808 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_INVALID_HEADER);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
809 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
810 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
811
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
812 /* rc == NGX_AGAIN: a header line parsing is still not complete */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
813
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
814 if (p->header_in->last == p->header_in->end) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
815 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
816 "upstream sent too big header");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
817
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
818 ngx_http_proxy_next_upstream(p, NGX_HTTP_PROXY_FT_INVALID_HEADER);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
819 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
820 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
821 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
822 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
823
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
824
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
825 static ssize_t ngx_http_proxy_read_upstream_header(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
826 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
827 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
828 ngx_event_t *rev;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
829
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
830 rev = p->upstream->peer.connection->read;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
831
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
832 n = p->header_in->last - p->header_in->pos;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
833
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
834 if (n > 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
835 return n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
836 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
837
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
838 n = ngx_recv(p->upstream->peer.connection, p->header_in->last,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
839 p->header_in->end - p->header_in->last);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
840
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
841 if (n == NGX_AGAIN) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
842 ngx_add_timer(rev, p->lcf->read_timeout);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
843
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
844 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
845 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
846 return NGX_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
847 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
848
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
849 return NGX_AGAIN;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
850 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
851
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
852 if (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
853 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
854 "upstream closed prematurely connection");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
855 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
856
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
857 if (n == 0 || n == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
858 return NGX_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
859 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
860
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
861 p->header_in->last += n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
862
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
863 return n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
864 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
865
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
866
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
867 static void ngx_http_proxy_send_response(ngx_http_proxy_ctx_t *p)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
868 {
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
869 int rc;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
870 ngx_event_pipe_t *ep;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
871 ngx_http_request_t *r;
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
872 ngx_http_cache_header_t *header;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
873 ngx_http_core_loc_conf_t *clcf;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
874
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
875 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
876
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
877 r->headers_out.status = p->upstream->status;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
878
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
879 #if 0
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
880 r->headers_out.content_length_n = -1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
881 r->headers_out.content_length = NULL;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
882 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
883
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
884 /* copy an upstream header to r->headers_out */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
885
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
886 if (ngx_http_proxy_copy_header(p, &p->upstream->headers_in) == NGX_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
887 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
888 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
889 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
890
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
891 /* TODO: preallocate event_pipe hunks, look "Content-Length" */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
892
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
893 rc = ngx_http_send_header(r);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
894
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
895 p->header_sent = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
896
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
897 if (p->cachable) {
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
898 header = (ngx_http_cache_header_t *) p->header_in->start;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
899
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
900 header->expires = p->cache->ctx.expires;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
901 header->last_modified = p->cache->ctx.last_modified;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
902 header->date = p->cache->ctx.date;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
903 header->length = r->headers_out.content_length_n;
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
904 p->cache->ctx.length = r->headers_out.content_length_n;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
905
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
906 header->key_len = p->cache->ctx.key.len;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
907 ngx_memcpy(&header->key, p->cache->ctx.key.data, header->key_len);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
908 header->key[header->key_len] = LF;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
909 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
910
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
911 ep = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
912 if (ep == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
913 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
914 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
915 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
916
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
917 p->upstream->event_pipe = ep;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
918
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
919 ep->input_filter = ngx_event_pipe_copy_input_filter;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
920 ep->output_filter = (ngx_event_pipe_output_filter_pt)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
921 ngx_http_output_filter;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
922 ep->output_ctx = r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
923 ep->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
924 ep->bufs = p->lcf->bufs;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
925 ep->busy_size = p->lcf->busy_buffers_size;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
926 ep->upstream = p->upstream->peer.connection;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
927 ep->downstream = r->connection;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
928 ep->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
929 ep->log = r->connection->log;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
930
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
931 if (!(ep->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
932 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
933 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
934 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
935
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
936 ep->temp_file->file.fd = NGX_INVALID_FILE;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
937 ep->temp_file->file.log = r->connection->log;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
938 ep->temp_file->path = p->lcf->temp_path;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
939 ep->temp_file->pool = r->pool;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
940 ep->temp_file->warn = "an upstream response is buffered "
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
941 "to a temporary file";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
942
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
943 ep->max_temp_file_size = p->lcf->max_temp_file_size;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
944 ep->temp_file_write_size = p->lcf->temp_file_write_size;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
945
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
946 ep->preread_hunks = ngx_alloc_chain_link(r->pool);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
947 if (ep->preread_hunks == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
948 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
949 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
950 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
951 ep->preread_hunks->hunk = p->header_in;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
952 ep->preread_hunks->next = NULL;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
953 p->header_in->type |= NGX_HUNK_PREREAD;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
954
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
955 ep->preread_size = p->header_in->last - p->header_in->pos;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
956
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
957 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
958
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
959 /* the posted aio operation can currupt shadow buf */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
960 ep->single_buf = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
961 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
962
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
963 /* TODO: ep->free_bufs = 0 if use ngx_create_chain_of_hunks() */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
964 ep->free_bufs = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
965
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
966 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
967 * event_pipe would do p->header_in->last += ep->preread_size
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
968 * as though these bytes were read.
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
969 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
970 p->header_in->last = p->header_in->pos;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
971
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
972 ep->cachable = p->cachable;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
973
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
974 if (p->lcf->cyclic_temp_file) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
975
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
976 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
977 * we need to disable the use of sendfile() if we use cyclic temp file
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
978 * because the writing a new data can interfere with sendfile()
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
979 * that uses the same kernel file pages (at least on FreeBSD)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
980 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
981
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
982 ep->cyclic_temp_file = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
983 r->sendfile = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
984
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
985 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
986 ep->cyclic_temp_file = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
987 r->sendfile = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
988 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
989
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
990 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
991
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
992 ep->read_timeout = p->lcf->read_timeout;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
993 ep->send_timeout = clcf->send_timeout;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
994 ep->send_lowat = clcf->send_lowat;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
995
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
996 p->upstream->peer.connection->read->event_handler =
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
997 ngx_http_proxy_process_body;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
998 r->connection->write->event_handler = ngx_http_proxy_process_body;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
999
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1000 ngx_http_proxy_process_body(p->upstream->peer.connection->read);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1001
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1002 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1003 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1004
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1005
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1006 static void ngx_http_proxy_process_body(ngx_event_t *ev)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1007 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1008 ngx_connection_t *c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1009 ngx_http_request_t *r;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1010 ngx_http_proxy_ctx_t *p;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1011 ngx_event_pipe_t *ep;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1012
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1013 c = ev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1014
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1015 if (ev->write) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1016 ngx_log_debug(ev->log, "http proxy process downstream");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1017 r = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1018 p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1019 p->action = "sending to client";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1020
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1021 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1022 ngx_log_debug(ev->log, "http proxy process upstream");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1023 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1024 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1025 p->action = "reading upstream body";
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1026 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1027
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1028 ep = p->upstream->event_pipe;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1029
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1030 if (ev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1031 if (ev->write) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1032 ep->downstream_error = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1033 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1034 "client timed out");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1035
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1036 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1037 ep->upstream_error = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1038 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1039 "upstream timed out");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1040 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1041
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1042 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1043 if (ngx_event_pipe(ep, ev->write) == NGX_ABORT) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1044 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1045 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1046 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1047 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1048
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1049 if (p->upstream->peer.connection) {
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
1050 if (ep->upstream_done && p->cachable) {
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1051 if (ngx_http_proxy_update_cache(p) == NGX_ERROR) {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1052 ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1053 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1054 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1055 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1056
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1057 ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock);
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1058
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
1059 } else if (ep->upstream_eof && p->cachable) {
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1060
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1061 /* TODO: check length & update cache */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1062
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1063 if (ngx_http_proxy_update_cache(p) == NGX_ERROR) {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1064 ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1065 ngx_http_proxy_finalize_request(p, 0);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1066 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1067 }
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1068
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1069 ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1070 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1071
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1072 if (ep->upstream_done || ep->upstream_eof || ep->upstream_error) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1073 ngx_http_proxy_close_connection(p);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1074 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1075 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1076
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1077 if (ep->downstream_done) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1078 ngx_log_debug(ev->log, "http proxy downstream done");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1079 ngx_http_proxy_finalize_request(p, r->main ? 0 : ngx_http_send_last(r));
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1080 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1081 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1082
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1083 if (ep->downstream_error) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1084 if (!p->cachable && p->upstream->peer.connection) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1085 ngx_http_proxy_close_connection(p);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1086 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1087
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1088 if (p->upstream->peer.connection == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1089 ngx_http_close_connection(c);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1090 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1091 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1092
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1093 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1094 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1095
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1096
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1097 static void ngx_http_proxy_next_upstream(ngx_http_proxy_ctx_t *p, int ft_type)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1098 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1099 int status;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1100
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1101 ngx_log_debug(p->request->connection->log, "next upstream: %d" _ ft_type);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1102
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1103 if (ft_type != NGX_HTTP_PROXY_FT_HTTP_404) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1104 ngx_event_connect_peer_failed(&p->upstream->peer);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1105 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1106
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1107 if (ft_type == NGX_HTTP_PROXY_FT_TIMEOUT) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1108 ngx_log_error(NGX_LOG_ERR, p->request->connection->log, NGX_ETIMEDOUT,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1109 "upstream timed out");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1110 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1111
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1112 if (p->upstream->peer.cached && ft_type == NGX_HTTP_PROXY_FT_ERROR) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1113 status = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1114
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1115 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1116 switch(ft_type) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1117 case NGX_HTTP_PROXY_FT_TIMEOUT:
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1118 status = NGX_HTTP_GATEWAY_TIME_OUT;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1119 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1120
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1121 case NGX_HTTP_PROXY_FT_HTTP_500:
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1122 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1123 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1124
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1125 case NGX_HTTP_PROXY_FT_HTTP_404:
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1126 status = NGX_HTTP_NOT_FOUND;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1127 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1128
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1129 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1130 * NGX_HTTP_PROXY_FT_BUSY_LOCK and NGX_HTTP_PROXY_FT_MAX_WAITING
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1131 * never reach here
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1132 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1133
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1134 default:
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1135 status = NGX_HTTP_BAD_GATEWAY;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1136 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1137 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1138
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1139 if (p->upstream->peer.connection) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1140 ngx_http_proxy_close_connection(p);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1141 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1142
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1143 if (status) {
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
1144 p->state->status = status;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1145
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1146 if (p->upstream->peer.tries == 0 || !(p->lcf->next_upstream & ft_type))
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1147 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1148 if (p->stale && (p->lcf->use_stale & ft_type)) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1149 ngx_http_proxy_finalize_request(p,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1150 ngx_http_proxy_send_cached_response(p));
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1151 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1152 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1153
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1154 ngx_http_proxy_finalize_request(p, status);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1155 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1156 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1157 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1158
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1159 if (p->lcf->busy_lock && !p->busy_locked) {
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1160 ngx_http_proxy_upstream_busy_lock(p);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1161 } else {
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1162 ngx_http_proxy_connect(p);
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1163 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1164 }