annotate src/http/modules/proxy/ngx_http_event_proxy_handler.c @ 73:4534060fde92

nginx-0.0.1-2003-04-10-19:08:54 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 10 Apr 2003 15:08:54 +0000
parents 66de3f065886
children 17ab1af8c3dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 #include <ngx_config.h>
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 #include <ngx_core.h>
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 #include <ngx_string.h>
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 #include <ngx_file.h>
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 #include <ngx_hunk.h>
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
7 #include <ngx_inet.h>
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
8 #include <ngx_conf_file.h>
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
9 #include <ngx_event_write.h>
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
10
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 #include <ngx_http.h>
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
12 #include <ngx_http_config.h>
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
13 #include <ngx_http_core_module.h>
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
14 #include <ngx_http_output_filter.h>
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 #include <ngx_http_event_proxy_handler.h>
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
17
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
18 static int ngx_http_proxy_handler(ngx_http_request_t *r);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
19
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
20 static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
21 static int ngx_http_proxy_process_upstream(ngx_http_proxy_ctx_t *p,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
22 ngx_event_t *ev);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
23 static int ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
24 static int ngx_http_proxy_process_upstream_event(ngx_event_t *ev);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
25 static int ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
26 static int ngx_http_proxy_init_upstream(ngx_http_proxy_ctx_t *p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
27 static int ngx_http_proxy_read_upstream_header(ngx_http_proxy_ctx_t *p);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
28
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
29 static int ngx_http_proxy_process_upstream_status_line(ngx_http_proxy_ctx_t *p);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
30 static int ngx_http_proxy_process_upstream_headers(ngx_http_proxy_ctx_t *p);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
31 static int ngx_http_proxy_process_upstream_header_line(ngx_http_proxy_ctx_t *p);
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
32
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
33
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
34 static int ngx_http_proxy_read_response_body(ngx_event_t *ev);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
35 static int ngx_http_proxy_write_to_client(ngx_event_t *ev);
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
36
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
37 static int ngx_read_http_proxy_status_line(ngx_http_proxy_ctx_t *ctx);
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
38
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
39 static int ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int error);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
40 static size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
41
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
42 static void *ngx_http_proxy_create_loc_conf(ngx_pool_t *pool);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
43
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
44 static char *ngx_http_proxy_set_pass(ngx_conf_t *cf, ngx_command_t *cmd,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
45 char *conf);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
46
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
47 static char *ngx_http_proxy_parse_upstream(ngx_str_t *url,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
48 ngx_http_proxy_upstream_url_t *uu);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
49
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
50
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
51 static ngx_command_t ngx_http_proxy_commands[] = {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
52
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
53 {ngx_string("proxy_pass"),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
54 NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
55 ngx_http_proxy_set_pass,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
56 NGX_HTTP_LOC_CONF_OFFSET,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
57 0},
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
58
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
59 {ngx_string("proxy_large_header"),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
60 NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
61 ngx_conf_set_flag_slot,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
62 NGX_HTTP_LOC_CONF_OFFSET,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
63 offsetof(ngx_http_proxy_loc_conf_t, large_header)},
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
64
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
65 {ngx_null_string, 0, NULL, 0, 0}
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
66 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
67
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
68
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
69 static ngx_http_module_t ngx_http_proxy_module_ctx = {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
70 NGX_HTTP_MODULE,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
71
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
72 NULL, /* create server config */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
73 NULL, /* init server config */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
74
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
75 ngx_http_proxy_create_loc_conf, /* create location config */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
76 NULL /* merge location config */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
77 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
78
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
79
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
80 ngx_module_t ngx_http_proxy_module = {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
81 0, /* module index */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
82 &ngx_http_proxy_module_ctx, /* module context */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
83 ngx_http_proxy_commands, /* module directives */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
84 NGX_HTTP_MODULE_TYPE, /* module type */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
85 NULL /* init module */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
86 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
87
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
88
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
89 static ngx_str_t http_methods[] = {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
90 ngx_string("GET "),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
91 ngx_string("HEAD "),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
92 ngx_string("POST ")
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
93 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
94
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
95
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
96 static char *header_errors[] = {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
97 "upstream sent too long status line",
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
98 "upstream sent invalid header",
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
99 "upstream sent too long header line"
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
100 };
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
101
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
102
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
103 static ngx_http_header_t headers_in[] = {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
104 { ngx_string("Date"), offsetof(ngx_http_proxy_headers_in_t, date) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
105 { ngx_string("Server"), offsetof(ngx_http_proxy_headers_in_t, server) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
106 { ngx_string("Connection"),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
107 offsetof(ngx_http_proxy_headers_in_t, connection) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
108 { ngx_string("Content-Type"),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
109 offsetof(ngx_http_proxy_headers_in_t, content_type) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
110 { ngx_string("Content-Length"),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
111 offsetof(ngx_http_proxy_headers_in_t, content_length) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
112 { ngx_string("Last-Modified"),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
113 offsetof(ngx_http_proxy_headers_in_t, last_modified) },
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
114
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
115 { ngx_null_string, 0 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
116 };
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
117
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
118
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
119 static char http_version[] = " HTTP/1.0" CRLF;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
120 static char host_header[] = "Host: ";
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
121 static char conn_close_header[] = "Connection: close" CRLF;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
124 /* AF_INET only */
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
125
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
126
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
127 static int ngx_http_proxy_handler(ngx_http_request_t *r)
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
129 int rc;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
130 struct sockaddr_in addr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
131 ngx_chain_t *chain;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
132 ngx_http_proxy_ctx_t *p;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
133 ngx_http_log_ctx_t *hcx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
134 ngx_http_proxy_log_ctx_t *lcx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
135 ngx_http_proxy_loc_conf_t *lcf;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
137 p = (ngx_http_proxy_ctx_t *)
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
138 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
140 if (p == NULL) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
141 ngx_http_create_ctx(r, p, ngx_http_proxy_module_ctx,
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
142 sizeof(ngx_http_proxy_ctx_t),
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
143 NGX_HTTP_INTERNAL_SERVER_ERROR);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
144 }
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
146 if (p->upstream_url == NULL) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
147 lcf = (ngx_http_proxy_loc_conf_t *)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
148 ngx_http_get_module_loc_conf(r, ngx_http_proxy_module_ctx);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
149
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
150 p->lcf = lcf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
151 p->request = r;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
152 p->upstream_url = lcf->upstream_url;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
153 p->upstreams = lcf->upstreams;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
154 p->tries = lcf->upstreams->number;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
155 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
156
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
157 ngx_test_null(p->log, ngx_palloc(r->pool, sizeof(ngx_log_t)),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
158 NGX_HTTP_INTERNAL_SERVER_ERROR);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
159 ngx_memcpy(p->log, r->connection->log, sizeof(ngx_log_t));
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
160 ngx_test_null(lcx, ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_log_ctx_t)),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
161 NGX_HTTP_INTERNAL_SERVER_ERROR);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
162
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
163 p->log->data = lcx;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
164 hcx = r->connection->log->data;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
165 lcx->client = hcx->client;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
166 lcx->url = hcx->url;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
167
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
168 r->proxy = 1;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
169 p->accel = 1;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
170
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
171 p->method = r->method;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
172 p->headers_in.headers = ngx_create_table(r->pool, 10);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
173
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
174 /* TODO: read a client's body */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
175
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
176 chain = ngx_http_proxy_create_request(p);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
177 if (chain == NULL) {
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
178 return NGX_HTTP_INTERNAL_SERVER_ERROR;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
179 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
180
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
181 /* TODO: duplicate the hunks and chain if there is backend farm */
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
182 p->out = chain;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
183
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
184 p->last_error = NGX_HTTP_BAD_GATEWAY;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
185 ngx_http_proxy_process_upstream(p, NULL);
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
187 /* On an error ngx_http_proxy_process_upstream() calls
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
188 ngx_http_proxy_finalize_request() so we return NGX_DONE to avoid
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
189 the additional NGX_HTTP_INTERNAL_SERVER_ERROR error
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
190 that would be generated by ngx_http_process_request() */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
191
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
192 return NGX_DONE;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
195
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
196 static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_proxy_ctx_t *p)
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
197 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
198 int i;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
199 size_t len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
200 ngx_hunk_t *hunk;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
201 ngx_chain_t *chain;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
202 ngx_table_elt_t *header;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
203 ngx_http_request_t *r;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
204
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
205 r = p->request;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
206
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
207 len = http_methods[p->method - 1].len
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
208 + p->upstream_url->uri.len
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
209 + (r->uri.len - p->upstream_url->location->len)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
210 + r->args.len + 1 /* 1 is for "?" */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
211 + sizeof(http_version) - 1
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
212 + sizeof(host_header) - 1 + p->upstream_url->host.len + 2
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
213 + sizeof(conn_close_header) - 1
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
214 + 2; /* 2 is for "\r\n" at the header end */
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
215
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
216 header = (ngx_table_elt_t *) r->headers_in.headers->elts;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
217 for (i = 0; i < r->headers_in.headers->nelts; i++) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
218
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
219 if (&header[i] == r->headers_in.host) {
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
220 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
221 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
222
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
223 if (&header[i] == r->headers_in.connection) {
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
224 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
225 }
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
226
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
227 /* 2 is for ": " and 2 is for "\r\n" */
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
228 len += header[i].key.len + 2 + header[i].value.len + 2;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
229 }
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
230
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
231 /* STUB */ len++;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
232
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
233 ngx_test_null(hunk, ngx_create_temp_hunk(r->pool, len, 0, 0), NULL);
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
234 ngx_add_hunk_to_chain(chain, hunk, r->pool, NULL);
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
235
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
236 /* the request line */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
237
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
238 ngx_memcpy(hunk->last, http_methods[p->method - 1].data,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
239 http_methods[p->method - 1].len);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
240 hunk->last += http_methods[p->method - 1].len;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
241
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
242 ngx_memcpy(hunk->last, p->upstream_url->uri.data, p->upstream_url->uri.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
243 hunk->last += p->upstream_url->uri.len;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
244
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
245 ngx_memcpy(hunk->last, r->uri.data + p->upstream_url->location->len,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
246 r->uri.len - p->upstream_url->location->len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
247 hunk->last += r->uri.len - p->upstream_url->location->len;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
248
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
249 if (r->args.len > 0) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
250 *(hunk->last++) = '?';
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
251 ngx_memcpy(hunk->last, r->args.data, r->args.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
252 hunk->last += r->args.len;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
253 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
254
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
255 ngx_memcpy(hunk->last, http_version, sizeof(http_version) - 1);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
256 hunk->last += sizeof(http_version) - 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
257
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
258 /* the "Host" header */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
259
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
260 ngx_memcpy(hunk->last, host_header, sizeof(host_header) - 1);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
261 hunk->last += sizeof(host_header) - 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
262
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
263 ngx_memcpy(hunk->last, p->upstream_url->host.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
264 p->upstream_url->host.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
265 hunk->last += p->upstream_url->host.len;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
266
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
267 *(hunk->last++) = CR; *(hunk->last++) = LF;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
268
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
269 /* the "Connection: close" header */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
270
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
271 ngx_memcpy(hunk->last, conn_close_header, sizeof(conn_close_header) - 1);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
272 hunk->last += sizeof(conn_close_header) - 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
273
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
274 for (i = 0; i < r->headers_in.headers->nelts; i++) {
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
275
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
276 if (&header[i] == r->headers_in.host) {
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
277 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
278 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
279
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
280 if (&header[i] == r->headers_in.connection) {
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
281 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
282 }
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
283
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
284 ngx_memcpy(hunk->last, header[i].key.data, header[i].key.len);
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
285 hunk->last += header[i].key.len;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
286
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
287 *(hunk->last++) = ':'; *(hunk->last++) = ' ';
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
288
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
289 ngx_memcpy(hunk->last, header[i].value.data, header[i].value.len);
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
290 hunk->last += header[i].value.len;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
291
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
292 *(hunk->last++) = CR; *(hunk->last++) = LF;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
293
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
294 ngx_log_debug(r->connection->log, "proxy: '%s: %s'" _
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
295 header[i].key.data _ header[i].value.data);
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
296 }
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
297
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
298 /* add "\r\n" at the header end */
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
299 *(hunk->last++) = CR; *(hunk->last++) = LF;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
300
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
301 /* STUB */ *(hunk->last++) = '\0';
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
302 ngx_log_debug(r->connection->log, "PROXY:\n'%s'" _ hunk->pos);
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
303
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
304 return chain;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
305 }
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
306
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
307
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
308 static int ngx_http_proxy_process_upstream(ngx_http_proxy_ctx_t *p,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
309 ngx_event_t *ev)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
310 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
311 int rc;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
312 time_t now;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
313 ngx_connection_t *c;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
314 ngx_http_proxy_upstream_t *u;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
315
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
316 for ( ;; ) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
317
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
318 if (ev == NULL) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
319 /* STUB: look up cached connection */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
320 c = NULL;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
321
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
322 if (c) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
323 p->cached_connection = 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
324 p->connection = c;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
325 c->write->event_handler = ngx_http_proxy_process_upstream_event;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
326 rc = ngx_http_proxy_send_request(p);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
327
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
328 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
329 p->cached_connection = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
330 p->connection = NULL;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
331 rc = ngx_http_proxy_connect(p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
332 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
333
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
334 if (p->connection) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
335 ev = p->connection->write;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
336 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
337
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
338 } else {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
339
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
340 if (ev->timedout) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
341 rc = NGX_HTTP_GATEWAY_TIME_OUT;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
342
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
343 } else if (ev->write) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
344
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
345 rc = p->state_write_upstream_handler(p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
346
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
347 } else { /* ev->read */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
348
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
349 rc = p->state_read_upstream_handler(p);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
350 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
351 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
352
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
353 if (rc == NGX_DONE || rc == NGX_AGAIN) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
354 return rc;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
355 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
356
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
357 if (rc == NGX_ERROR) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
358 return ngx_http_proxy_finalize_request(p,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
359 NGX_HTTP_INTERNAL_SERVER_ERROR);
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
360 return NGX_DONE;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
361 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
362
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
363 if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
364 || (rc == NGX_OK
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
365 && p->status == NGX_HTTP_INTERNAL_SERVER_ERROR
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
366 && p->lcf->retry_500_error))
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
367 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
368 if (ev) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
369 ngx_event_close_connection(ev);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
370 ev = NULL;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
371 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
372
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
373 if (!p->cached_connection) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
374 if (p->upstreams->number > 1) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
375 now = ngx_time();
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
376 u = &p->upstreams->u[p->cur_upstream];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
377
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
378 /* Here is the race condition when the upstreams are shared
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
379 between threads or processes but it's not serious */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
380
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
381 u->fails++;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
382 u->accessed = now;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
383
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
384 /* */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
385 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
386
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
387 p->tries--;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
388 p->last_error = rc;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
389 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
390
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
391 if (p->tries == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
392 ngx_http_proxy_finalize_request(p, p->last_error);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
393 return NGX_ERROR;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
394 }
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
395
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
396 p->headers_in.server->key.len = 0;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
397 p->headers_in.connection->key.len = 0;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
398 p->headers_in.content_type->key.len = 0;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
399 p->headers_in.content_length->key.len = 0;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
400 p->headers_in.last_modified->key.len = 0;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
401
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
402 p->headers_in.headers->nelts = 0;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
403 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
404
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
405 if (rc == NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
406 ngx_http_proxy_finalize_request(p, p->status);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
407 return NGX_DONE;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
408 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
409
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
410 if (rc > NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
411 ngx_http_proxy_finalize_request(p, rc);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
412 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
413
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
414 return NGX_DONE;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
415 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
416 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
417
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
418
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
419 static int ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p)
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
420 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
421 int rc, event;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
422 struct sockaddr_in *addr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
423 ngx_err_t err;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
424 ngx_socket_t s;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
425 ngx_event_t *rev, *wev;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
426 ngx_connection_t *c;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
427 ngx_http_proxy_log_ctx_t *lcx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
428 ngx_http_proxy_upstream_t *u;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
429
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
430 if (p->upstreams->number > 1) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
431 if (p->tries == p->upstreams->number) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
432
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
433 /* Here is the race condition
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
434 when the upstreams are shared between threads or processes
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
435 but it should not be serious */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
436
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
437 p->cur_upstream = p->upstreams->current++;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
438
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
439 if (p->upstreams->current >= p->upstreams->number) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
440 p->upstreams->current = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
441 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
442
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
443 /* */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
444
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
445 #if (NGX_MULTITHREADED || NGX_MULTIPROCESSED)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
446 /* eliminate the sequences of the race condition */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
447 if (p->cur_upstream >= p->upstreams->number) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
448 p->cur_upstream = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
449 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
450 #endif
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
451 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
452
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
453 if (p->upstreams->max_fails > 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
454
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
455 for ( ;; ) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
456 u = &p->upstreams->u[p->cur_upstream];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
457
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
458 /* Here is the race condition
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
459 when the upstreams are shared between threads or processes
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
460 but it should not be serious */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
461
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
462 if (u->fails > p->upstreams->max_fails
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
463 || u->accessed < p->upstreams->fail_timeout)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
464 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
465 break;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
466 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
467
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
468 /* */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
469
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
470 p->cur_upstream++;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
471
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
472 if (p->cur_upstream >= p->upstreams->number) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
473 p->cur_upstream = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
474 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
475
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
476 p->tries--;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
477
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
478 if (p->tries == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
479 return p->last_error;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
480 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
481 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
482 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
483 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
484
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
485 lcx = p->log->data;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
486 lcx->action = "connecting to an upstream";
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
487 lcx->upstream = p->upstreams->u[p->cur_upstream].addr_port_name.data;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
488 p->log->handler = ngx_http_proxy_log_error;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
489
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
490 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0);
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
491
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
492 if (s == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
493 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
494 ngx_socket_n " failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
495 return NGX_ERROR;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
496 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
497
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
498 if (p->lcf->rcvbuf) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
499 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
500 (const void *) &p->lcf->rcvbuf, sizeof(int)) == -1) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
501 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
502 "setsockopt(SO_RCVBUF) failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
503
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
504 if (ngx_close_socket(s) == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
505 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
506 ngx_close_socket_n " failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
507 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
508
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
509 return NGX_ERROR;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
510 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
511 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
512
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
513 if (ngx_nonblocking(s) == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
514 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
515 ngx_nonblocking_n " failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
516
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
517 if (ngx_close_socket(s) == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
518 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
519 ngx_close_socket_n " failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
520 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
521
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
522 return NGX_ERROR;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
523 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
524
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
525 c = &ngx_connections[s];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
526 rev = &ngx_read_events[s];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
527 wev = &ngx_write_events[s];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
528
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
529 ngx_memzero(c, sizeof(ngx_connection_t));
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
530 ngx_memzero(rev, sizeof(ngx_event_t));
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
531 ngx_memzero(wev, sizeof(ngx_event_t));
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
532
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
533 rev->index = wev->index = NGX_INVALID_INDEX;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
534 rev->data = wev->data = c;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
535 c->read = rev;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
536 c->write = wev;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
537 rev->first = wev->first = 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
538 rev->log = wev->log = c->log = p->log;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
539 c->fd = s;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
540 wev->close_handler = rev->close_handler = ngx_event_close_connection;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
541
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
542 #if !(USE_KQUEUE)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
543
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
544 #if (HAVE_EDGE_EVENT) /* epoll */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
545
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
546 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
547 if (ngx_edge_add_event(wev) != NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
548 return NGX_ERROR;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
549 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
550 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
551
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
552 #endif
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
553
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
554 #endif
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
555
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
556 ngx_test_null(c->pool, ngx_create_pool(p->lcf->conn_pool_size, p->log),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
557 NGX_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
558
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
559 ngx_test_null(p->sockaddr,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
560 ngx_pcalloc(c->pool, sizeof(struct sockaddr_in)),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
561 NGX_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
562
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
563 addr = (struct sockaddr_in *) p->sockaddr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
564
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
565 addr->sin_family = AF_INET;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
566 addr->sin_addr.s_addr = p->upstreams->u[p->cur_upstream].addr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
567 addr->sin_port = htons(p->upstreams->u[p->cur_upstream].port);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
568
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
569 rc = connect(s, p->sockaddr, sizeof(struct sockaddr_in));
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
570
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
571 if (rc == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
572 err = ngx_socket_errno;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
573 if (err != NGX_EINPROGRESS) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
574 ngx_log_error(NGX_LOG_CRIT, p->log, err, "connect() failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
575
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
576 if (ngx_close_socket(s) == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
577 ngx_log_error(NGX_LOG_ALERT, p->log, ngx_socket_errno,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
578 ngx_close_socket_n " failed");
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
579 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
580
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
581 ngx_destroy_pool(c->pool);
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
583 return NGX_HTTP_BAD_GATEWAY;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
587 c->data = p->request;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
588 p->connection = c;
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
589
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
590 ngx_test_null(c->pool, ngx_create_pool(p->lcf->conn_pool_size, p->log),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
591 NGX_ERROR);
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
592
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
593 #if (USE_KQUEUE)
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
594
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
595 if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
596 return NGX_ERROR;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
597 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
598
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
599 #else
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
600
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
601 if ((ngx_event_flags & NGX_HAVE_EDGE_EVENT) == 0) { /* not epoll */
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
602
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
603 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { /* kqueue */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
604 event = NGX_CLEAR_EVENT;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
606 } else { /* select, poll, /dev/poll */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
607 event = NGX_LEVEL_EVENT;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
608 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
609
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
610 /* TODO: aio, iocp */
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
611
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
612 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
613 return NGX_ERROR;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
614 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
615 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
616
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
617 #endif /* USE_KQUEUE */
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
618
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
619 wev->event_handler = rev->event_handler =
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
620 ngx_http_proxy_process_upstream_event;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
621
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
622 p->state_write_upstream_handler = ngx_http_proxy_send_request;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
623 p->state_read_upstream_handler = ngx_http_proxy_init_upstream;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
624
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
625 /* The connection has been established */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
626 if (rc == 0) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
627 wev->write = 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
628 wev->ready = 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
629
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
630 return ngx_http_proxy_send_request(p);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
631 }
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
633 /* The connection is in a progress */
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
635 wev->timer_set = 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
636 ngx_add_timer(wev, p->lcf->connect_timeout);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
637
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
638 #if (USE_KQUEUE)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
639
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
640 if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
641 return NGX_ERROR;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
642 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
643
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
644 #else
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
645
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
646 /* TODO: aio, iocp */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
647
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
648 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
649 return NGX_DONE;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
650 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
651
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
652 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
653 return NGX_ERROR;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
654 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
655
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
656 #endif /* USE_KQUEUE */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
657
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
658 return NGX_DONE;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
661
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
662 static int ngx_http_proxy_process_upstream_event(ngx_event_t *ev)
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 {
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
664 ngx_connection_t *c;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
665 ngx_http_request_t *r;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
666 ngx_http_proxy_ctx_t *p;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
667
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
668 c = (ngx_connection_t *) ev->data;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
669 r = (ngx_http_request_t *) c->data;
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
670 p = (ngx_http_proxy_ctx_t *)
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
671 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
672
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
673 return ngx_http_proxy_process_upstream(p, ev);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
674 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
675
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
676
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
677 static int ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
678 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
679 ngx_chain_t *chain;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
680 ngx_event_t *wev;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
681
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
682 chain = ngx_write_chain(p->connection, p->out, 0);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
683 if (chain == (ngx_chain_t *) -1) {
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
684 return NGX_ERROR;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
685 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
686
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
687 p->out = chain;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
688
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
689 wev = p->connection->write;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
690
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
691 ngx_del_timer(wev);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
692
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
693 if (chain) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
694 ngx_add_timer(wev, p->lcf->send_timeout);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
695 wev->timer_set = 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
696
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
697 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
698 wev->timer_set = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
699 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
700
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
701 return NGX_DONE;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
705 static int ngx_http_proxy_init_upstream(ngx_http_proxy_ctx_t *p)
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
707 int n;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
708 ngx_hunk_t **ph;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
709 ngx_http_request_t *r;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
711 r = p->request;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
712
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
713 ngx_test_null(p->header_in,
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
714 ngx_create_temp_hunk(r->pool, p->lcf->header_size, 0, 0),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
715 NGX_ERROR);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
716
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
717 p->header_in->type = NGX_HUNK_MEMORY|NGX_HUNK_IN_MEMORY;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
718
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
719 #if 0
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
720 ngx_test_null(p->headers_in,
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
721 ngx_palloc(r->pool, sizeof(ngx_http_proxy_headers_in_t)),
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
722 NGX_ERROR);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
723 #endif
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
724
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
725 p->nhunks = p->lcf->max_block_size / p->lcf->block_size;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
726 if (p->nhunks * p->lcf->block_size < p->lcf->max_block_size) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
727 p->nhunks++;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
728 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
729
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
730 ngx_init_array(p->hunks, r->pool, p->nhunks, sizeof(ngx_hunk_t *),
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
731 NGX_ERROR);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
732
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
733 ngx_test_null(ph, ngx_push_array(&p->hunks), NGX_ERROR);
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
734 *ph = p->header_in;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
735
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
736 p->state_handler = ngx_http_proxy_process_upstream_status_line;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
737
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
738 return ngx_http_proxy_read_upstream_header(p);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
739 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
740
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
741
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
742 static int ngx_http_proxy_read_upstream_header(ngx_http_proxy_ctx_t *p)
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
743 {
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
744 int i, n, rc;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
745 ngx_event_t *rev;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
746 ngx_table_elt_t *ch, *ph;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
747 ngx_http_request_t *r;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
748
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
749 rev = p->connection->read;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
750
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
751 do {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
752 n = ngx_event_recv(p->connection, p->header_in->last,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
753 p->header_in->end - p->header_in->last);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
754
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
755 if (n == NGX_AGAIN) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
756 if (rev->timer_set) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
757 ngx_del_timer(rev);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
758 } else {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
759 rev->timer_set = 1;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
760 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
761
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
762 ngx_add_timer(rev, p->lcf->read_timeout);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
763 return NGX_AGAIN;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
764 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
765
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
766 if (n == NGX_ERROR) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
767 return NGX_HTTP_BAD_GATEWAY;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
768 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
769
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
770 ngx_log_debug(p->log, "http proxy read %d" _ n);
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
771
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
772 if (n == 0) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
773 ngx_log_error(NGX_LOG_INFO, p->log, 0,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
774 "upstream closed prematurely connection");
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
775 return NGX_HTTP_BAD_GATEWAY;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
776 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
777
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
778 p->header_in->last += n;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
779
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
780 /* the state handlers are called in the following order:
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
781 ngx_http_proxy_process_upstream_status_line(p)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
782 ngx_http_proxy_process_upstream_headers(p) */
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
783
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
784 do {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
785 rc = p->state_handler(p);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
786 } while (rc == NGX_AGAIN && p->header_in->pos < p->header_in->last);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
787
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
788 } while (rc == NGX_AGAIN
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
789 && (rev->ready || ngx_event_flags & NGX_HAVE_AIO_EVENT));
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
790
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
791 if (rc == NGX_OK) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
792
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
793 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
794
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
795 /* copy an upstream header to r->headers_out */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
796
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
797 ph = (ngx_table_elt_t *) p->headers_in.headers->elts;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
798 for (i = 0; i < p->headers_in.headers->nelts; i++) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
799
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
800 if (&ph[i] == p->headers_in.connection) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
801 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
802 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
803
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
804 if (p->accel && &ph[i] == p->headers_in.date) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
805 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
806 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
807
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
808 ngx_test_null(ch, ngx_push_table(r->headers_out.headers),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
809 NGX_HTTP_INTERNAL_SERVER_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
810
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
811 ch->key.len = ph[i].key.len;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
812 ch->key.data = ph[i].key.data;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
813 ch->value.len = ph[i].value.len;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
814 ch->value.data = ph[i].value.data;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
815 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
816
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
817 if (p->headers_in.server) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
818 r->headers_out.server = p->headers_in.server;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
819 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
820
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
821 if (!p->accel && p->headers_in.date) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
822 r->headers_out.date = p->headers_in.date;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
823 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
824
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
825 /* TODO: look "Content-Length" */
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
826 p->block_size = p->lcf->block_size;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
827
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
828 r->headers_out.status = p->status;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
829
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
830 rc = ngx_http_send_header(r);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
831
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
832 /* STUB */
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
833 p->header_in->type |= NGX_HUNK_LAST;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
834 rc = ngx_http_output_filter(r, p->header_in);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
835 ngx_http_proxy_finalize_request(p, NGX_OK);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
836
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
837 /* STUB */ return NGX_DONE;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
838 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
839
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
840 if (rc > NGX_OK) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
841 return rc;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
842 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
843
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
844 /* STUB */ return NGX_DONE;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
845 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
846
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
847
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
848 static int ngx_http_proxy_process_upstream_status_line(ngx_http_proxy_ctx_t *p)
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
849 {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
850 int rc;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
851
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
852 rc = ngx_read_http_proxy_status_line(p);
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
853
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
854 if (rc == NGX_HTTP_PROXY_PARSE_NO_HEADER) {
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
855 p->status = 200;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
856 p->status_line.len = 0;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
857 p->full_status_line.len = 0;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
858 p->state_handler = ngx_http_proxy_process_upstream_headers;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
859
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
860 } else if (rc == NGX_OK) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
861 p->status_line.len = p->status_end - p->status_start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
862 p->full_status_line.len = p->status_end - p->header_in->start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
863
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
864 if (p->lcf->large_header) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
865 ngx_test_null(p->full_status_line.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
866 ngx_palloc(p->request->pool,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
867 p->full_status_line.len + 1),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
868 NGX_HTTP_INTERNAL_SERVER_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
869
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
870 ngx_cpystrn(p->full_status_line.data, p->header_in->start,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
871 p->full_status_line.len + 1);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
872
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
873 if (p->header_in->pos == p->header_in->end) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
874 p->header_in->pos = p->header_in->last = p->header_in->start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
875 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
876
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
877 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
878 p->status_line.data = p->status_start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
879 p->full_status_line.data = p->header_in->start;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
880 *p->status_end = '\0';
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
881
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
882 if (p->header_in->pos == p->header_in->end) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
883 ngx_log_error(NGX_LOG_ERR, p->log, 0,
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
884 "upstream sent too long status line");
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
885 return NGX_HTTP_BAD_GATEWAY;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
886 }
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
887 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
888
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
889 ngx_log_debug(p->log, "upstream status: %d, '%s'" _
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
890 p->status _ p->full_status_line.data);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
891
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
892 p->state_handler = ngx_http_proxy_process_upstream_headers;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
893 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
894
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
895 /* rc == NGX_AGAIN */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
896
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
897 return NGX_AGAIN;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
898 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
899
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
900
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
901 static int ngx_http_proxy_process_upstream_headers(ngx_http_proxy_ctx_t *p)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
902 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
903 int rc, offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
904 ngx_http_request_t *r;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
905
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
906 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
907
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
908 for ( ;; ) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
909 rc = ngx_read_http_header_line(r, p->header_in);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
910
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
911 /* a header line has been parsed successfully */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
912
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
913 if (rc == NGX_OK) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
914 if (ngx_http_proxy_process_upstream_header_line(p) == NGX_ERROR) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
915 return NGX_HTTP_INTERNAL_SERVER_ERROR;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
916 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
917
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
918 if (p->lcf->large_header
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
919 && p->header_in->pos == p->header_in->last)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
920 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
921 p->header_in->pos = p->header_in->last = p->header_in->start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
922 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
923
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
924 return NGX_AGAIN;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
925
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
926 /* a whole header has been parsed successfully */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
927
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
928 } else if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
929 ngx_log_debug(p->log, "proxy HTTP header done");
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
930
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
931 p->state_handler = NULL;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
932 return NGX_OK;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
933
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
934 /* there was error while a header line parsing */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
935
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
936 } else if (rc != NGX_AGAIN) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
937 ngx_log_error(NGX_LOG_ERR, p->log, 0,
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
938 "upstream sent ERROR %d", rc);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
939 return NGX_HTTP_BAD_GATEWAY;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
940 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
941
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
942 /* NGX_AGAIN: a header line parsing is still not complete */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
943
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
944 if (p->header_in->pos == p->header_in->last) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
945 /* if the large upstream headers are enabled then
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
946 we need to compact p->header_in hunk */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
947
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
948 if (p->lcf->large_header) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
949 offset = r->header_name_start - p->header_in->start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
950
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
951 if (offset == 0) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
952 ngx_log_error(NGX_LOG_ERR, p->log, 0,
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
953 "upstream sent too long header line");
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
954 return NGX_HTTP_BAD_GATEWAY;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
955 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
956
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
957 ngx_memcpy(p->header_in->start, r->header_name_start,
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
958 p->header_in->last - r->header_name_start);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
959
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
960 p->header_in->last -= offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
961 p->header_in->pos -= offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
962 r->header_name_start = p->header_in->start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
963 r->header_name_end -= offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
964 r->header_start -= offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
965 r->header_end -= offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
966
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
967 } else {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
968 ngx_log_error(NGX_LOG_ERR, p->log, 0,
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
969 "upstream sent too long header line");
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
970 /* NGX_HTTP_PARSE_TOO_LONG_HEADER */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
971 return NGX_HTTP_BAD_GATEWAY;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
972 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
973 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
974
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
975 return NGX_AGAIN;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
976 }
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
977 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
978
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
979
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
980 static int ngx_http_proxy_process_upstream_header_line(ngx_http_proxy_ctx_t *p)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
981 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
982 int i;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
983 ngx_table_elt_t *h;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
984 ngx_http_request_t *r;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
985
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
986 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
987
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
988 ngx_test_null(h, ngx_push_table(p->headers_in.headers), NGX_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
989
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
990 h->key.len = r->header_name_end - r->header_name_start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
991 h->value.len = r->header_end - r->header_start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
992
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
993 /* if the large upstream headers are enabled then
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
994 we need to copy the header name and value */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
995
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
996 if (p->lcf->large_header) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
997 ngx_test_null(h->key.data, ngx_palloc(r->pool, h->key.len + 1),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
998 NGX_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
999 ngx_test_null(h->value.data, ngx_palloc(r->pool, h->value.len + 1),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1000 NGX_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1001 ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1002 ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1003
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1004 } else {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1005 h->key.data = r->header_name_start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1006 h->key.data[h->key.len] = '\0';
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1007 h->value.data = r->header_start;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1008 h->value.data[h->value.len] = '\0';
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1009 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1010
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1011 for (i = 0; headers_in[i].name.len != 0; i++) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1012 if (headers_in[i].name.len != h->key.len) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1013 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1014 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1015
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1016 if (ngx_strcasecmp(headers_in[i].name.data, h->key.data) == 0) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1017 *((ngx_table_elt_t **)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1018 ((char *) &p->headers_in + headers_in[i].offset)) = h;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1019 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1020 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1021
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1022 ngx_log_debug(p->log, "proxy HTTP header: '%s: %s'" _
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1023 h->key.data _ h->value.data);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1024
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1025 return NGX_OK;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1026 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1027
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1028
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1029 #if 0
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1030
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1031 static int ngx_http_proxy_read_upstream_body(ngx_event_t *rev)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1032 {
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1033 ngx_hunk_t *h;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1034 ngx_chain_t *chain, ce;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1035 ngx_connection_t *c;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1036 ngx_http_request_t *r;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1037 ngx_http_proxy_ctx_t *p;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1038
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1039 c = (ngx_connection_t *) rev->data;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1040 r = (ngx_http_request_t *) c->data;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1041 p = (ngx_http_proxy_ctx_t *)
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1042 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1043
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1044 ce.next = NULL;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1045
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1046 do {
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1047
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1048 #if (USE_KQUEUE)
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1049
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1050 if (ev->eof && ev->available == 0) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1051 break;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1052 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1053
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1054 #elif (HAVE_KQUEUE)
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1055
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1056 if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1057 && ev->eof && ev->available == 0)
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1058 {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1059 break;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1060 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1061
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1062 #endif
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1063
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1064 if (p->free_hunks) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1065 chain = p->free_hunks;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1066
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1067 } else if (p->allocated < p->lcf->max_block_size) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1068 ngx_test_null(h,
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1069 ngx_create_temp_hunk(r->pool, p->block_size, 50, 50),
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1070 NGX_ERROR);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1071
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1072 p->allocated += p->block_size;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1073 ce.hunk = h;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1074 chain = &ce;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1075
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1076 } else {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1077 if (p->temp_fd == NGX_INVALID_FILE) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1078 rc = ngx_create_temp_file(p->temp_file, r->cachable);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1079
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1080 if (rc != NGX_OK) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1081 return rc;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1082 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1083
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1084 if (p->lcf->temp_file_warn) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1085 ngx_log_error(NGX_LOG_WARN, p->log, 0,
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1086 "an upstream response is buffered "
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1087 "to a temporary file");
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1088 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1089 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1090
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1091 n = ngx_write_chain_to_file(p->temp_file, p->in_hunks,
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1092 p->temp_offset);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1093
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1094 if (n == NGX_ERROR) {
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1095 return NGX_ERROR;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1096 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1097
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1098 ngx_test_null(h, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1099 NGX_ERROR);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1100
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1101 h->type = NGX_HUNK_FILE
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1102 |NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP|NGX_HUNK_RECYCLED;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1103
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1104 h->file_pos = p->temp_offset;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1105 p->temp_offset += n;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1106 h->file_last = p->temp_offset;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1107
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1108 h->file->fd = p->temp_file.fd;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1109 h->file->log = p->log;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1110
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1111 h->pos = p->in_hunks->hunk->pos;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1112 h->last = p->in_hunks->hunk->last;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1113 h->start = p->in_hunks->hunk->start;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1114 h->end = p->in_hunks->hunk->end;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1115 h->pre_start = p->in_hunks->hunk->pre_start;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1116 h->post_end = p->in_hunks->hunk->post_end;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1117
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1118 ngx_add_hunk_to_chain(p->last_out_hunk, h, r->pool, NGX_ERROR);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1119
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1120 ce.hunk = p->in_hunks->next;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1121 p->in_hunks = p->in_hunks->next;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1122 chain = &ce;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1123 }
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1124
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1125 n = ngx_recv_chain(c, chain);
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1126
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1127 h->last += n;
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1128 left = hunk->end - hunk->last;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1129
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1130 } while (n > 0 && left == 0);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1131
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
1132 if (p->out_hunks && p->request->connection->write->ready) {
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1133 ngx_http_proxy_write_upstream_body(p->request->connection->write);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1134 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1135 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1136
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1137
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1138 static int ngx_http_proxy_write_upstream_body(ngx_event_t *wev)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1139 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1140 while (out) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1141 output_filter(r, hunk);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1142 if (again)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1143 return
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1144
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1145 if (hunk done)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1146 remove from out
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1147 if (hunk is memory)
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1148 add it to free
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1149 }
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1152
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1153
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1154 #endif
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1155
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1156
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1157
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
1158
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1159
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160 static int ngx_http_proxy_read_response_body(ngx_event_t *ev)
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161 {
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1162 int n;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1163 char *buf;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1164 size_t left, size;
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1165 ngx_hunk_t *h, **ph;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1166 ngx_connection_t *c;
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167 ngx_http_request_t *r;
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1168 ngx_http_proxy_ctx_t *p;
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1169
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1170 if (ev->timedout) {
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1171 return NGX_ERROR;
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1172 }
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1173
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1174 c = (ngx_connection_t *) ev->data;
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1175 r = (ngx_http_request_t *) c->data;
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
1176 p = (ngx_http_proxy_ctx_t *)
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1177 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1178
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1179 if (p->hunks.nelts > 0) {
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1180 h = ((ngx_hunk_t **) p->hunks.elts)[p->hunks.nelts - 1];
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1181 left = h->end - h->last;
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1182
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1183 } else {
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1184 h = NULL;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1185 left = 0;
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1186 }
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1187
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1188 do {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1189
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1190 #if (USE_KQUEUE)
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1191
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1192 /* do not allocate new block if there is EOF */
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1193 if (ev->eof && ev->available == 0) {
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1194 left = 1;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1195 }
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1196
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1197 #elif (HAVE_KQUEUE)
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1198
60
50186b49f2ad nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 59
diff changeset
1199 if (ngx_event_type == NGX_HAVE_KQUEUE_EVENT) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1200 /* do not allocate new block if there is EOF */
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1201 if (ev->eof && ev->available == 0) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1202 left = 1;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1203 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1204 }
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1205
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1206 #endif
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1207
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1208 if (left == 0) {
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1209 ngx_test_null(ph, ngx_push_array(&p->hunks), NGX_ERROR);
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1210 ngx_test_null(h,
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1211 ngx_create_temp_hunk(r->pool,
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1212 /* STUB */ 4096 /**/, 0, 0),
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1213 NGX_ERROR);
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1214
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1215 h->type = NGX_HUNK_MEMORY|NGX_HUNK_IN_MEMORY;
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1216 *ph = h;
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1217 }
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1218
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1219 if (h != NULL) {
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1220 buf = h->last;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1221 size = h->end - h->last;
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1222
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1223 } else {
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1224 buf = (char *) &buf;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1225 size = 0;
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1226 }
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1227
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1228 n = ngx_event_recv(c, buf, size);
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1229
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1230 ngx_log_debug(c->log, "READ:%d" _ n);
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1231
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1232 if (n == NGX_AGAIN) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1233 return NGX_DONE;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1234 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1235
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1236 if (n == NGX_ERROR) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1237 return NGX_ERROR;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1238 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1239
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1240 h->last += n;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1241 left = h->end - h->last;
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1242
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1243 /* STUB */
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1244 *h->last = '\0';
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1245 ngx_log_debug(c->log, "PROXY:\n'%s'" _ h->pos);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1246 /**/
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1247
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1248 } while (n > 0 && left == 0);
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1249
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1250 if (n == 0) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1251 ngx_log_debug(c->log, "CLOSE proxy");
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 24
diff changeset
1252 #if 0
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 24
diff changeset
1253 ngx_del_event(ev, NGX_READ_EVENT, NGX_CLOSE_EVENT);
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 24
diff changeset
1254 #endif
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1255 ngx_event_close_connection(ev);
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1256
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1257 p->hunk_n = 0;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1258 c->write->event_handler = ngx_http_proxy_write_to_client;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1259 return ngx_http_proxy_write_to_client(c->write);
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1260 }
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
1261
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1262 /* STUB */ return NGX_DONE;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1263 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1264
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1265
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1266 static int ngx_http_proxy_write_to_client(ngx_event_t *ev)
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1267 {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1268 int rc;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1269 ngx_hunk_t *h;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1270 ngx_connection_t *c;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1271 ngx_http_request_t *r;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1272 ngx_http_proxy_ctx_t *p;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1273
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1274 c = (ngx_connection_t *) ev->data;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1275 r = (ngx_http_request_t *) c->data;
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
1276 p = (ngx_http_proxy_ctx_t *)
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1277 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1278
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1279 do {
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1280 h = ((ngx_hunk_t **) p->hunks.elts)[p->hunk_n];
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1281
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1282 rc = ngx_http_output_filter(r, h);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1283 if (rc != NGX_OK) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1284 return rc;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1285 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1286
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
1287 if (p->hunk_n >= p->hunks.nelts) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1288 break;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1289 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1290
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1291 p->hunk_n++;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1292
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1293 } while (rc == NGX_OK);
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1294
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1295 return NGX_OK;
19
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1296 }
d7908993fdeb nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1297
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1298
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1299 static int ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int error)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1300 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1301 return ngx_http_finalize_request(p->request, error);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1302 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1303
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1304
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1305 static int ngx_http_proxy_error(ngx_http_request_t *r, ngx_http_proxy_ctx_t *p,
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1306 int error)
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1307 {
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1308 ngx_event_close_connection(p->connection->read);
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1309
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1310 return ngx_http_error(r, error);
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1311 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1312
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1313
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1314 static size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len)
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1315 {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1316 ngx_http_proxy_log_ctx_t *lcx = (ngx_http_proxy_log_ctx_t *) data;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1317
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1318 return ngx_snprintf(buf, len,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1319 " while %s, upstream: %s, client: %s, URL: %s",
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1320 lcx->action, lcx->upstream, lcx->client, lcx->url);
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1321 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1322
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1323
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1324
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1325 static int ngx_read_http_proxy_status_line(ngx_http_proxy_ctx_t *ctx)
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1326 {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1327 char ch;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1328 char *p;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1329 enum {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1330 sw_start = 0,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1331 sw_first_major_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1332 sw_major_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1333 sw_first_minor_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1334 sw_minor_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1335 sw_status,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1336 sw_space_after_status,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1337 sw_status_text,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1338 sw_almost_done,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1339 sw_done
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1340 } state;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1341
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1342 state = ctx->state;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1343 p = ctx->header_in->pos;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1344
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1345 while (p < ctx->header_in->last && state < sw_done) {
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1346 ch = *p++;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1347
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1348 switch (state) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1349
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1350 /* "HTTP/" */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1351 case sw_start:
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1352 if (p + 3 >= ctx->header_in->last) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1353 return NGX_AGAIN;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1354 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1355
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1356 if (ch != 'H' || *p != 'T' || *(p + 1) != 'T' || *(p + 2) != 'P'
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1357 || *(p + 3) != '/')
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1358 {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1359 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1360 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1361
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1362 p += 4;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1363 state = sw_first_major_digit;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1364 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1365
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1366 /* first digit of major HTTP version */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1367 case sw_first_major_digit:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1368 if (ch < '1' || ch > '9') {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1369 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1370 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1371
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1372 state = sw_major_digit;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1373 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1374
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1375 /* major HTTP version or dot */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1376 case sw_major_digit:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1377 if (ch == '.') {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1378 state = sw_first_minor_digit;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1379 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1380 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1381
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1382 if (ch < '0' || ch > '9') {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1383 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1384 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1385
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1386 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1387
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1388 /* first digit of minor HTTP version */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1389 case sw_first_minor_digit:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1390 if (ch < '0' || ch > '9') {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1391 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1392 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1393
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1394 state = sw_minor_digit;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1395 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1396
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1397 /* minor HTTP version or end of request line */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1398 case sw_minor_digit:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1399 if (ch == ' ') {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1400 state = sw_status;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1401 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1402 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1403
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1404 if (ch < '0' || ch > '9') {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1405 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1406 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1407
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1408 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1409
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1410 /* HTTP status code */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1411 case sw_status:
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1412 if (ch < '0' || ch > '9') {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1413 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1414 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1415
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1416 ctx->status = ctx->status * 10 + ch - '0';
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1417
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
1418 if (++ctx->status_count == 3) {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1419 state = sw_space_after_status;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1420 ctx->status_start = p - 3;
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
1421 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1422
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1423 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1424
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1425 /* space or end of line */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1426 case sw_space_after_status:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1427 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1428 case ' ':
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1429 state = sw_status_text;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1430 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1431 case CR:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1432 state = sw_almost_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1433 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1434 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1435 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1436 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1437 default:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1438 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1439 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1440 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1441
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1442 /* any text until end of line */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1443 case sw_status_text:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1444 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1445 case CR:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1446 state = sw_almost_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1447 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1448 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1449 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1450 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1451 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1452 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1453
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1454 /* end of request line */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1455 case sw_almost_done:
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1456 ctx->status_end = p - 2;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1457 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1458 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1459 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1460 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1461 default:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1462 return NGX_HTTP_PROXY_PARSE_NO_HEADER;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1463 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1464 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1465 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1466 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1467
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1468 ctx->header_in->pos = p;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1469
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1470 if (state == sw_done) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1471 if (ctx->status_end == NULL) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1472 ctx->status_end = p - 1;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1473 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1474
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1475 ctx->state = sw_start;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1476 return NGX_OK;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1477
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1478 } else {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1479 ctx->state = state;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1480 return NGX_AGAIN;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1481 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1482 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1483
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1484
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1485 static void *ngx_http_proxy_create_loc_conf(ngx_pool_t *pool)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1486 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1487 ngx_http_proxy_loc_conf_t *conf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1488
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1489 ngx_test_null(conf,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1490 ngx_pcalloc(pool, sizeof(ngx_http_proxy_loc_conf_t)),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1491 NULL);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1492
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1493 /* STUB */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1494 conf->conn_pool_size = 16384;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1495 conf->connect_timeout = 10000;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1496 conf->send_timeout = 10000;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1497 conf->read_timeout = 10000;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1498 conf->header_size = 1024;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1499 conf->block_size = 4096;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1500 conf->max_block_size = 32768;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1501 /**/
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1502
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1503 return conf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1504 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1505
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1506
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1507 static char *ngx_http_proxy_set_pass(ngx_conf_t *cf, ngx_command_t *cmd,
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1508 char *conf)
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1509 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1510 ngx_http_proxy_loc_conf_t *lcf = (ngx_http_proxy_loc_conf_t *) conf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1511
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1512 int i, s, len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1513 char *err, *host;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1514 struct hostent *h;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1515 u_int32_t addr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1516 ngx_str_t *value;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1517 ngx_http_conf_ctx_t *ctx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1518 ngx_http_core_loc_conf_t *core_lcf;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1519
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1520 value = (ngx_str_t *) cf->args->elts;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1521
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1522 if (ngx_strncasecmp(value[1].data, "http://", 7) != 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1523 return "invalid URL prefix";
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1524 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1525
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1526 ngx_test_null(lcf->upstream_url,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1527 ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_upstream_url_t)),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1528 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1529
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1530 value[1].data += 7;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1531 value[1].len -= 7;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1532
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1533 err = ngx_http_proxy_parse_upstream(&value[1], lcf->upstream_url);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1534
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1535 if (err) {
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1536 return err;
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1537 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1538
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1539 if (lcf->upstream_url->port == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1540 lcf->upstream_url->port = 80;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1541 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1542
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1543 ngx_test_null(host, ngx_palloc(cf->pool, lcf->upstream_url->host.len + 1),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1544 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1545 ngx_cpystrn(host, lcf->upstream_url->host.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1546 lcf->upstream_url->host.len + 1);
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1547
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1548 /* TODO: look up upstreams */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1549
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1550 addr = inet_addr(host);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1551 if (addr == INADDR_NONE) {
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1552 h = gethostbyname(host);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1553
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1554 if (h == NULL || h->h_addr_list[0] == NULL) {
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1555 /* STUB: "host %s not found", host */
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1556 return "host not found";
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1557 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1558
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1559 for (i = 0; h->h_addr_list[i] != NULL; i++) {
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1560 /* void */
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1561 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1562
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1563 /* MP: ngx_shared_palloc() */
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1564
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1565 ngx_test_null(lcf->upstreams,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1566 ngx_pcalloc(cf->pool,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1567 sizeof(ngx_http_proxy_upstreams_t)
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1568 + sizeof(ngx_http_proxy_upstream_t) * (i - 1)),
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1569 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1570
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1571 lcf->upstreams->number = i;
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1572
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1573 for (i = 0; h->h_addr_list[i] != NULL; i++) {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1574 lcf->upstreams->u[i].host.data = host;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1575 lcf->upstreams->u[i].host.len = lcf->upstream_url->host.len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1576 lcf->upstreams->u[i].addr = *(u_int32_t *)(h->h_addr_list[i]);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1577 lcf->upstreams->u[i].port = lcf->upstream_url->port;
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1578
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1579 len = INET_ADDRSTRLEN + lcf->upstream_url->port_name.len + 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1580 ngx_test_null(lcf->upstreams->u[i].addr_port_name.data,
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1581 ngx_palloc(cf->pool, len),
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1582 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1583
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1584 s = ngx_inet_ntop(AF_INET,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1585 (char *) &lcf->upstreams->u[i].addr,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1586 lcf->upstreams->u[i].addr_port_name.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1587 len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1588
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1589 lcf->upstreams->u[i].addr_port_name.data[s++] = ':';
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1590
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1591 ngx_cpystrn(lcf->upstreams->u[i].addr_port_name.data + s,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1592 lcf->upstream_url->port_name.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1593 lcf->upstream_url->port_name.len + 1);
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1594
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1595 lcf->upstreams->u[i].addr_port_name.len =
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1596 s + lcf->upstream_url->port_name.len + 1;
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1597 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1598
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1599 } else {
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1600
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1601 /* MP: ngx_shared_palloc() */
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1602
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1603 ngx_test_null(lcf->upstreams,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1604 ngx_palloc(cf->pool, sizeof(ngx_http_proxy_upstreams_t)),
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1605 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1606
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1607 lcf->upstreams->number = 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1608
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1609 lcf->upstreams->u[0].host.data = host;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1610 lcf->upstreams->u[0].host.len = lcf->upstream_url->host.len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1611 lcf->upstreams->u[0].addr = addr;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1612 lcf->upstreams->u[0].port = lcf->upstream_url->port;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1613
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1614 len = lcf->upstream_url->host.len
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1615 + lcf->upstream_url->port_name.len + 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1616
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1617 ngx_test_null(lcf->upstreams->u[0].addr_port_name.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1618 ngx_palloc(cf->pool, len + 1),
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1619 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1620
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1621 ngx_memcpy(lcf->upstreams->u[0].addr_port_name.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1622 lcf->upstream_url->host.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1623 lcf->upstream_url->host.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1624
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1625 s = lcf->upstream_url->host.len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1626
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1627 lcf->upstreams->u[0].addr_port_name.data[s++] = ':';
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1628
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1629 ngx_cpystrn(lcf->upstreams->u[0].addr_port_name.data + s,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1630 lcf->upstream_url->port_name.data,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1631 lcf->upstream_url->port_name.len + 1);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1632
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1633 lcf->upstreams->u[0].addr_port_name.len = len;
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1634 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1635
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1636 ctx = cf->ctx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1637 core_lcf = ctx->loc_conf[ngx_http_core_module_ctx.index];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1638 core_lcf->handler = ngx_http_proxy_handler;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1639 lcf->upstream_url->location = &core_lcf->name;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1640
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1641 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1642 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1643
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1644
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1645 static char *ngx_http_proxy_parse_upstream(ngx_str_t *url,
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1646 ngx_http_proxy_upstream_url_t *uu)
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1647 {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1648 size_t i;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1649
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1650 if (url->data[0] == ':' || url->data[0] == '/') {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1651 return "invalid upstream URL";
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1652 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1653
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1654 uu->host.data = url->data;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1655 uu->host_header.data = url->data;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1656
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1657 for (i = 1; i < url->len; i++) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1658 if (url->data[i] == ':') {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1659 uu->port_name.data = &url->data[i] + 1;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1660 uu->host.len = i;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1661 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1662
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1663 if (url->data[i] == '/') {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1664 uu->uri.data = &url->data[i];
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1665 uu->uri.len = url->len - i;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1666 uu->host_header.len = i;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1667
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1668 if (uu->host.len == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1669 uu->host.len = i;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1670 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1671
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1672 if (uu->port_name.data == NULL) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1673 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1674 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1675
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1676 uu->port_name.len = &url->data[i] - uu->port_name.data;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1677
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1678 if (uu->port_name.len > 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1679 uu->port = ngx_atoi(uu->port_name.data, uu->port_name.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1680 if (uu->port > 0) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1681 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1682 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1683 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1684
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1685 return "invalid port in upstream URL";
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1686 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1687 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1688
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1689 if (uu->host.len == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1690 uu->host.len = i;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1691 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1692
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1693 uu->host_header.len = i;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1694
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1695 uu->uri.data = "/";
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1696 uu->uri.len = 1;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1697
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1698 if (uu->port_name.data == NULL) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1699 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1700 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1701
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1702 uu->port_name.len = &url->data[i] - uu->port_name.data;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1703
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1704 if (uu->port_name.len > 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1705 uu->port = ngx_atoi(uu->port_name.data, uu->port_name.len);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1706 if (uu->port > 0) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1707 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1708 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1709 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1710
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1711 return "invalid port in upstream URL";
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1712 }