annotate src/http/modules/proxy/ngx_http_proxy_upstream.c @ 257:70e1c7d2b83d

nginx-0.0.2-2004-02-11-20:08:49 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 11 Feb 2004 17:08:49 +0000
parents 8dee38ea9117
children 35a6a9df2d25
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
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
195 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
196 "http proxy header: \"%s: %s\"",
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
197 header[i].key.data, header[i].value.data);
171
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
200 /* 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
201 *(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
202
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
203 #if (NGX_DEBUG)
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
204 *(h->last) = '\0';
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
205 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
206 "http proxy header:\n\"%s\"", h->pos);
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
207 #endif
171
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 return chain;
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
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 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
214 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
215 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
216
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
217 ngx_chain_t *cl;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
218 ngx_http_request_t *r;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
219 ngx_output_chain_ctx_t *octx;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
220 ngx_chain_writer_ctx_t *wctx;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
221 ngx_http_proxy_log_ctx_t *lctx;
171
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 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
224
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
225 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
226 "http proxy set timer: %d",
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
227 r->connection->read->timer_set);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
228
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
229 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
230 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
231 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
232
188
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
233 if ((ngx_event_flags & (NGX_USE_CLEAR_EVENT|NGX_HAVE_KQUEUE_EVENT))
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
234 && !r->connection->write->active)
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
235 {
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
236 /* kqueue allows to detect when client closes prematurely connection */
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
237
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
238 r->connection->write->event_handler =
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
239 ngx_http_proxy_check_broken_connection;
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
240
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
241 if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT,
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
242 NGX_CLEAR_EVENT) == NGX_ERROR)
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
243 {
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
244 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
245 return;
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
246 }
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
247 }
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
248
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
249
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
250 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
251 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
252 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
253 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
254
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
255 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
256 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
257 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
258
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
259 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
260
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
261 if (!(lctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_log_ctx_t)))) {
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
262 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
263 return;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
264 }
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
265 lctx->connection = r->connection->number;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
266 lctx->proxy = p;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
267
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
268 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
269 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
270 p->saved_handler = r->connection->log->handler;
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 190
diff changeset
271 r->connection->log->data = lctx;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
272 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
273 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
274
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
275 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
276 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
277 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
278 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
279
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
280 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
281
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
282 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
283 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
284 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
285 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
286 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
287
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
288 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
289 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
290 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
291 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
292
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
293 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
294
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
295 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
296
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
297 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
298 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
299 } else {
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
300 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
301 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
302 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
303
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
304
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
305 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
306 {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 ngx_chain_t *cl;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 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
309
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
310 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
311
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 /* reinit the request chain */
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 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
315 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
316 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 /* 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
319
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 octx->hunk = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 octx->in = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 octx->free = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 octx->busy = NULL;
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 /* 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
326
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 if (p->header_in) {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 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
329 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
330 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
331
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 } else {
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 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
334 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
335 }
c42be4185301 nginx-0.0.1-2003-11-03-01:56:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 }
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
337
177
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
338 /* add one more state */
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
339
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
340 if (!(p->state = ngx_push_array(&p->states))) {
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
341 ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
342 return;
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
343 }
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
344
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
345 p->status = 0;
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
346 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
347 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
348
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
349
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
350 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
351 {
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
352 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
353
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
354 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
355 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
356 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
357 }
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
358
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
359 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
360
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
361 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
362 return;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
363 }
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
364
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
365 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
366 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
367 return;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
368 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
369
178
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
370 ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock);
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
371
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
372 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
373 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
374
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
375 } 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
376 /* 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
377 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
378 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
379
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
380 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
381 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
382 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
383 return;
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
384 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
385
177
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
386 p->state->status = NGX_HTTP_SERVICE_UNAVAILABLE;
175
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
387 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
388 }
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
389
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
390
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
391 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
392 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
393 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
394 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
395 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
396 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
397
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
398 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
399
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
400 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
401
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
402 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
403 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
404 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
405 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
406
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
407 p->state->peer =
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
408 &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
409
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
410 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
411 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
412 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
413 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
414
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
415 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
416 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
417 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
418 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
419 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
420
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
421 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
422 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
423 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
424 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
425
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
426 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
427
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
428 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
429 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
430 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
431
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
432 /* 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
433
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
434 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
435 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
436 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
437 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
438 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
439
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
440 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
441 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
442 octx->hunks = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
443
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
444 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
445 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
446 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
447
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
448 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
449
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
450 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
451 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
452 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
453 }
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 /* rc == NGX_OK */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
456
188
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
457 #if 1 /* test only, see below about "post aio operation" */
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
458
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
459 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
460 /* post aio operation */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
461 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
462 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
463 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
464 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
465
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
466 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
467 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
468
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
469
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
470 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
471 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
472 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
473 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
474 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
475
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
476 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
477
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
478 #if (HAVE_KQUEUE)
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
479
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
480 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
481 && !p->request_sent
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
482 && 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
483 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
484 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
485 "connect() failed");
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 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
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 #endif
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 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
494
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
495 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
496 wctx->out = NULL;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
497 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
498 wctx->connection = c;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
499
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
500 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
501 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
502
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
503 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
504 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
505 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
506 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
507
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
508 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
509
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
510 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
511 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
512 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
513
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
514 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
515 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
516
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
517 c->write->available = /* STUB: lowat */ 0;
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
518 if (ngx_handle_write_event(c->write, NGX_LOWAT_EVENT) == NGX_ERROR) {
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
519 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
520 return;
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
523 return;
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
526 /* rc == NGX_OK */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
527
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
528 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
529 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
530 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
531 ngx_socket_errno,
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
532 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
533 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
534 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
535 }
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->tcp_nopush = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
538 return;
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
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
541 ngx_add_timer(c->read, p->lcf->read_timeout);
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
542
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
543 #if 0
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
544 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
545
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
546 /* post aio operation */
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 * 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
550 * 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
551 * 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
552 */
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 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
555 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
556 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
557 #endif
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
558
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
559 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
560 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
561
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
562 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
563 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
564 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
565 }
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
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 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
570 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
571 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
572 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
573
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
574 c = wev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
575 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
576
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
577 if (wev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
578 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
579 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
580 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
581 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
582
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
583 if (p->request->connection->write->eof
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
584 && (!p->cachable || !p->request_sent))
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
585 {
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
586 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST);
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
587 return;
188
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
588 }
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
589
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
590 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
591 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
592
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 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
595 {
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
596 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http proxy dummy handler");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
597 }
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 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
601 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
602 int rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
603 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
604 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
605 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
606
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
607 c = rev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
608 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
609 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
610
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
611 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
612 "http proxy process status line");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
613
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
614 if (rev->timedout) {
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_TIMEOUT);
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
616 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
617 }
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 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
620 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
621 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
622 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
623 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
624 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
625 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
626 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
627
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
628 if (p->cache) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
629 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
630 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
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
634 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
635
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
636 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
637 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
638 }
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 (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
641 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
642 "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
643 }
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 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
646 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
647 return;
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
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
650 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
651
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
652 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
653
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
654 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
655
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
656 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
657 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
658 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
659 "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
660 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
661 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
662 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
663 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
664
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
665 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
666 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
667 "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
668
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
669 if (p->accel) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
670 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
671
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
672 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
673 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
674 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
675 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
676 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
677
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
678 return;
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
681 /* rc == NGX_OK */
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 p->upstream->status = p->status;
177
4db54fdbcbe7 nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 176
diff changeset
684 p->state->status = p->status;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
685
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
686 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
687
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
688 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
689 && (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
690 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
691 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
692 return;
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 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
696 && p->stale
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
697 && (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
698 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
699 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
700 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
701
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
702 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
703 }
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
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
706 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
707 && 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
708 && 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
709 {
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
710 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
711 return;
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
712 }
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
713
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
714 /* 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
715
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
716 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
717 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
718 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
719 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
720 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
721 return;
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 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
724 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
725
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
726 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, rev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
727 "http proxy status %d \"%s\"",
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
728 p->upstream->status, p->upstream->status_line.data);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
729
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
730 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
731 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
732 } 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
733 /* 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
734 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
735 20);
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 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
739 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
740 }
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
743 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
744 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
745 int i, rc;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
746 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
747 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
748 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
749 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
750 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
751
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
752 c = rev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
753 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
754 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
755 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
756
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
757 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
758 "http proxy process header line");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
759
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
760 if (rev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
761 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
762 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
763 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
764
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
765 rc = NGX_AGAIN;
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 ( ;; ) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
768 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
769 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
770
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
771 if (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
772 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
773 "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
774 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
775
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
776 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
777 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
778 return;
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 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
782 return;
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 }
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 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
787
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
788 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
789
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
790 /* 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
791
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
792 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
793 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
794 if (h == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
795 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
796 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
797 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
798 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
799
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
800 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
801 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
802
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
803 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
804 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
805 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
806 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
807 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
808 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
809 }
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 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
812 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
813 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
814
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
815 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
816 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
817 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
818 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
819
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
820 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
821 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
822 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
823 *((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
824 + 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
825 break;
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 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
828
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
829 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
830 "http proxy header: \"%s: %s\"",
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
831 h->key.data, h->value.data);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
832
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
833 continue;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
834
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
835 } 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
836
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
837 /* 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
838
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
839 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
840 "http proxy header done");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
841
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
842 /* 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
843
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
844 if (p->cachable) {
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
845 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
846 }
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
847
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
848 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
849 return;
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 } 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
852
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
853 /* 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
854
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
855 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
856 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
857
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
858 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
859 return;
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
862 /* 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
863
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
864 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
865 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
866 "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
867
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
868 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
869 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
870 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
871 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
872 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
873
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 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
876 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
877 ssize_t n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
878 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
879
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
880 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
881
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
882 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
883
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
884 if (n > 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
885 return n;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
886 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
887
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
888 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
889 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
890
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
891 if (n == NGX_AGAIN) {
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
892 #if 0
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
893 ngx_add_timer(rev, p->lcf->read_timeout);
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
894 #endif
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
895
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
896 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
897 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
898 return NGX_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
899 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
900
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
901 return NGX_AGAIN;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
902 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
903
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
904 if (n == 0) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
905 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
906 "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
907 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
908
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
909 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
910 return NGX_ERROR;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
911 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
912
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
913 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
914
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
915 return n;
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
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 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
920 {
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
921 int rc;
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
922 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
923 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
924 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
925 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
926
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
927 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
928
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
929 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
930
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
931 #if 0
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
932 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
933 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
934 #endif
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 /* 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
937
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
938 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
939 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
940 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
941 }
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 /* 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
944
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
945 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
946
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
947 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
948
194
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
949 if (p->cache && p->cache->ctx.file.fd != NGX_INVALID_FILE) {
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
950 if (ngx_close_file(p->cache->ctx.file.fd) == NGX_FILE_ERROR) {
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
951 ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
952 ngx_close_file_n " \"%s\" failed",
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
953 p->cache->ctx.file.name.data);
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
954 }
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
955 }
2357fa41738a nginx-0.0.1-2003-11-21-09:30:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 191
diff changeset
956
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
957 if (p->cachable) {
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
958 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
959
174
ea464a6c0581 nginx-0.0.1-2003-11-05-01:12:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 172
diff changeset
960 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
961 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
962 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
963 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
964 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
965
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
966 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
967 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
968 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
969 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
970
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
971 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
972 if (ep == NULL) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
973 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
974 return;
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 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
978
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
979 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
980 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
981 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
982 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
983 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
984 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
985 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
986 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
987 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
988 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
989 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
990
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
991 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
992 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
993 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
994 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
995
188
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
996 ep->cachable = p->cachable;
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
997
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
998 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
999 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
1000 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
1001 ep->temp_file->pool = r->pool;
188
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
1002 if (!p->cachable) {
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
1003 ep->temp_file->warn = "an upstream response is buffered "
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
1004 "to a temporary file";
0061d1f0908d nginx-0.0.1-2003-11-18-11:04:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 187
diff changeset
1005 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1006
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1007 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
1008 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
1009
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1010 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
1011 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
1012 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
1013 return;
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 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
1016 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
1017
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1018 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
1019
187
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1020 ep->hunk_to_file = ngx_calloc_hunk(r->pool);
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1021 if (ep->preread_hunks == NULL) {
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1022 ngx_http_proxy_finalize_request(p, 0);
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1023 return;
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1024 }
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1025 ep->hunk_to_file->pos = p->header_in->start;
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1026 ep->hunk_to_file->last = p->header_in->pos;
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1027 ep->hunk_to_file->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
5a9bbe99008b nginx-0.0.1-2003-11-17-19:15:03 import
Igor Sysoev <igor@sysoev.ru>
parents: 178
diff changeset
1028
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1029 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
195
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1030 /* the posted aio operation can currupt a shadow buffer */
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1031 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
1032 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1033
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1034 /* 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
1035 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
1036
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1037 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1038 * 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
1039 * 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
1040 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1041 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
1042
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1043 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
1044
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1045 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1046 * 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
1047 * 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
1048 * 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
1049 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1050
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1051 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
1052 r->sendfile = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1053
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1054 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1055 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
1056 r->sendfile = 1;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1057 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1058
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1059 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
1060
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1061 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
1062 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
1063 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
1064
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1065 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
1066 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
1067 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
1068
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1069 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
1070
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1071 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1072 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1073
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 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
1076 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1077 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
1078 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
1079 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
1080 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
1081
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1082 c = ev->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1083
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1084 if (ev->write) {
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1085 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1086 "http proxy process downstream");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1087 r = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1088 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
1089 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
1090
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1091 } else {
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1092 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1093 "http proxy process upstream");
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1094 p = c->data;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1095 r = p->request;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1096 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
1097 }
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 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
1100
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1101 if (ev->timedout) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1102 if (ev->write) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1103 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
1104 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
1105 "client timed out");
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 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1108 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
1109 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
1110 "upstream timed out");
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
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1113 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1114 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
1115 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
1116 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1117 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1118 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1119
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1120 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
1121 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
1122 if (ngx_http_proxy_update_cache(p) == NGX_ERROR) {
178
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
1123 ngx_http_busy_unlock(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
1124 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
1125 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1126 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1127
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
1128 } 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
1129
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1130 /* 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
1131
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1132 if (ngx_http_proxy_update_cache(p) == NGX_ERROR) {
178
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
1133 ngx_http_busy_unlock(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
1134 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
1135 return;
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 (ep->upstream_done || ep->upstream_eof || ep->upstream_error) {
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1140 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1141 "http proxy upstream exit");
178
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
1142 ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock);
195
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1143 ngx_http_proxy_finalize_request(p, 0);
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1144 return;
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 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1147
195
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1148 if (ep->downstream_error) {
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1149 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1150 "http proxy downstream error");
195
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1151 if (!p->cachable && p->upstream->peer.connection) {
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1152 ngx_http_proxy_finalize_request(p, 0);
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1153 }
8dee38ea9117 nginx-0.0.1-2003-11-25-23:44:56 import
Igor Sysoev <igor@sysoev.ru>
parents: 194
diff changeset
1154 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1155 }
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 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
1159 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1160 int status;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1161
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1162 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, p->request->connection->log, 0,
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 195
diff changeset
1163 "http proxy next upstream: %d", ft_type);
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1164
178
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
1165 ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock);
a8ff48d26cca nginx-0.0.1-2003-11-11-00:09:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 177
diff changeset
1166
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1167 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
1168 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
1169 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1170
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1171 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
1172 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
1173 "upstream timed out");
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1174 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1175
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1176 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
1177 status = 0;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1178
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1179 } else {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1180 switch(ft_type) {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1181 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
1182 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
1183 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1184
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1185 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
1186 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
1187 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1188
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1189 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
1190 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
1191 break;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1192
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1193 /*
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1194 * 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
1195 * never reach here
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1196 */
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1197
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1198 default:
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1199 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
1200 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1201 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1202
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1203 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
1204 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
1205 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1206
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
1207 if (p->request->connection->write->eof) {
190
02a715e85df1 nginx-0.0.1-2003-11-19-00:34:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 189
diff changeset
1208 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST);
02a715e85df1 nginx-0.0.1-2003-11-19-00:34:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 189
diff changeset
1209 return;
189
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
1210 }
c966c09be66b nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 188
diff changeset
1211
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1212 if (status) {
172
caa57ddf6d77 nginx-0.0.1-2003-11-04-01:20:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
1213 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
1214
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1215 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
1216 {
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1217 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
1218 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
1219 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
1220 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1221 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1222
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1223 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
1224 return;
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1225 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1226 }
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1227
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 175
diff changeset
1228 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
1229 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
1230 } else {
e92c2c647c57 nginx-0.0.1-2003-11-05-20:03:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 174
diff changeset
1231 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
1232 }
171
aff0e5d32af8 nginx-0.0.1-2003-11-03-20:33:31 import
Igor Sysoev <igor@sysoev.ru>
parents: 170
diff changeset
1233 }