annotate src/http/modules/proxy/ngx_http_event_proxy_handler.c @ 86:3973260705cc

nginx-0.0.1-2003-05-12-19:52:24 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 12 May 2003 15:52:24 +0000
parents fab4cb00fe5b
children
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>
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
10 #include <ngx_event_proxy.h>
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
11
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
12 #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
13 #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
14 #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
15 #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
16 #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
17
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
18
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
19 /* STUB */
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
20 typedef struct {
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
21 int type;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
22 } ngx_cache_header_t;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
23
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
24
71
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_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
26
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
27 static int ngx_http_proxy_read_client_body(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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
37 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
38 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
39 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
40
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
41 static int ngx_http_proxy_read_upstream_body(ngx_http_proxy_ctx_t *p);
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
42 static int ngx_http_proxy_write_upstream_body(ngx_http_proxy_ctx_t *p);
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
43
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
44
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
45 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
46 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
47
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
48 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
49
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
50 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
51 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
52
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
53 static int ngx_http_proxy_init(ngx_pool_t *pool);
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
54 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
55
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
56 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
57 char *conf);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
58
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
59 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
60 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
61
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
62
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
63 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
64
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
65 {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
66 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
67 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
68 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
69 0},
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
70
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
71 {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
72 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
73 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
74 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
75 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
76
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
77 {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
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
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
81 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
82 NGX_HTTP_MODULE,
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
83
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
84 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
85 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
86
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
87 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
88 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
89 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
90
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
91
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
92 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
93 0, /* module index */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
94 &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
95 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
96 NGX_HTTP_MODULE_TYPE, /* module type */
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
97 ngx_http_proxy_init /* init module */
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
98 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
99
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
100
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
101 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
102 ngx_string("GET "),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
103 ngx_string("HEAD "),
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
104 ngx_string("POST ")
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
105 };
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
106
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
107
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
108 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
109 "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
110 "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
111 "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
112 };
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
113
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 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
116 { 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
117 { 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
118 { ngx_string("Connection"),
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
119 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
120 { 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
121 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
122 { 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
123 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
124 { 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
125 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
126
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
127 { 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
128 };
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
129
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
130
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
131 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
132 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
133 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
134
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
135
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
136 /* AF_INET only */
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
137
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
138
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
139 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
140 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
141 int rc;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
142 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
143 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
144 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
145 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
146 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
147 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
148
41
59e7c7f30d49 nginx-0.0.1-2002-12-26-19:26:23 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
149 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
150 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
151
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
152 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
153 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
154 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
155 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
156 }
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
157
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
158 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
159 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
160 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
161
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
162 p->lcf = lcf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
163 p->request = r;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
164 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
165 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
166 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
167 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
168
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
169 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
170 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
171 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
172 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
173 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
174
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
175 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
176 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
177 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
178 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
179
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
180 r->proxy = 1;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
181 p->accel = 1;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
182
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
183 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
184 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
185
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
186 if (r->headers_in.content_length_n > 0) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
187 if (ngx_http_proxy_read_client_body(p) == NGX_ERROR) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
188 return NGX_HTTP_INTERNAL_SERVER_ERROR;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
189 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
190 }
71
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 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
193 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
194 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
195 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
196
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
197 /* TODO: duplicate the hunks and chain if there is backend farm */
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
198 p->request_hunks = chain;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
199
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
200 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
201 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
202
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
203 /* 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
204 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
205 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
206 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
207
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
208 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
209 }
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
210
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
211
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
212 static int ngx_http_proxy_read_client_body(ngx_http_proxy_ctx_t *p)
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
213 {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
214 int size, first_part;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
215 ngx_hunk_t *h;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
216 ngx_http_request_t *r;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
217
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
218 r = p->request;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
219
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
220 first_part = r->header_in->last - r->header_in->pos;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
221
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
222 if (first_part > r->headers_in.content_length_n) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
223 first_part = r->headers_in.content_length_n;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
224 size = 0;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
225
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
226 } else {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
227 size = r->headers_in.content_length_n - first_part;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
228 if (size > p->lcf->client_request_buffer_size) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
229 size = p->lcf->client_request_buffer_size;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
230
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
231 } else if (size > NGX_PAGE_SIZE) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
232 size = ((size + NGX_PAGE_SIZE) / NGX_PAGE_SIZE) * NGX_PAGE_SIZE;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
233 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
234
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
235 if (size) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
236 ngx_test_null(p->client_request_hunk, ngx_palloc(r->pool, size),
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
237 NGX_ERROR);
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
238 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
239 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
240
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
241 if (first_part) {
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
242 ngx_test_null(h, ngx_alloc_hunk(r->pool), NGX_ERROR);
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
243
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
244 h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
245 h->pos = h->start = h->pre_start = r->header_in->pos;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
246 h->last = h->end = h->post_end = r->header_in->pos + first_part;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
247 h->file_pos = h->file_last = 0;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
248 h->file = NULL;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
249 h->shadow = NULL;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
250 h->tag = 0;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
251
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
252 p->client_first_part_hunk = h;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
253 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
254
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
255 return NGX_OK;
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
256 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
257
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 81
diff changeset
258
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
259 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
260 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
261 int i;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
262 size_t len;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
263 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
264 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
265 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
266 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
267
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
268 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
269
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
270 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
271 + 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
272 + (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
273 + 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
274 + 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
275 + 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
276 + 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
277 + 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
278
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
279 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
280 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
281
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
282 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
283 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
284 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
285
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
286 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
287 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
288 }
22
aa3b53e74728 nginx-0.0.1-2002-12-05-19:21:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 21
diff changeset
289
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
290 /* 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
291 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
292 }
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 /* STUB */ len++;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
295
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
296 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
297 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
298
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
299 /* the request line */
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
300
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
301 hunk->last = ngx_cpymem(hunk->last, http_methods[p->method - 1].data,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
302 http_methods[p->method - 1].len);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
303
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
304 hunk->last = ngx_cpymem(hunk->last, p->upstream_url->uri.data,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
305 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
306
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
307 hunk->last = ngx_cpymem(hunk->last,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
308 r->uri.data + p->upstream_url->location->len,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
309 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
310
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
311 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
312 *(hunk->last++) = '?';
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
313 hunk->last = ngx_cpymem(hunk->last, r->args.data, 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
314 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
315
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
316 hunk->last = ngx_cpymem(hunk->last, http_version, sizeof(http_version) - 1);
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 /* 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
319
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
320 hunk->last = ngx_cpymem(hunk->last, host_header, sizeof(host_header) - 1);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
321
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
322 hunk->last = ngx_cpymem(hunk->last, p->upstream_url->host.data,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
323 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
324
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
325 *(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
326
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
327 /* 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
328
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
329 hunk->last = ngx_cpymem(hunk->last, conn_close_header,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
330 sizeof(conn_close_header) - 1);
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
331
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
332 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
333
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
334 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
335 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
336 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
337
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
338 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
339 continue;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
340 }
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
341
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
342 hunk->last = ngx_cpymem(hunk->last, header[i].key.data,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
343 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
344
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
345 *(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
346
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
347 hunk->last = ngx_cpymem(hunk->last, header[i].value.data,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
348 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
349
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
350 *(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
351
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
352 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
353 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
354 }
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
355
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
356 /* 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
357 *(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
358
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
359 /* 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
360 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
361
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
362 return chain;
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
363 }
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
364
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
365
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
366 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
367 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
368 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
369 int rc;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
370 time_t now;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
371 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
372 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
373
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
374 for ( ;; ) {
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
375
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
376 if (ev == NULL) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
377 /* 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
378 c = NULL;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
379
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
380 if (c) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
381 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
382 p->connection = c;
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
383 c->write->event_handler = c->read->event_handler =
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
384 ngx_http_proxy_process_upstream_event;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
385 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
386
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
387 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
388 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
389 p->connection = NULL;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
390 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
391 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
392
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
393 if (p->connection) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
394 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
395 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
396
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
397 } else {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
398
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
399 if (ev->timedout) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
400 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
401
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
402 } 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
403
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
404 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
405
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
406 } else { /* ev->read */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
407
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
408 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
409 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
410 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
411
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
412 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
413 return rc;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
414 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
415
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
416 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
417 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
418 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
419 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
420 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
421
80
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
422 if (p->tries > 1
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
423 && (rc == NGX_HTTP_BAD_GATEWAY
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
424 || rc == NGX_HTTP_GATEWAY_TIME_OUT
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
425 || (rc == NGX_OK
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
426 && p->status == NGX_HTTP_INTERNAL_SERVER_ERROR
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
427 && 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
428 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
429 if (ev) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
430 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
431 ev = NULL;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
432 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
433
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
434 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
435 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
436 now = ngx_time();
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
437 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
438
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
439 /* 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
440 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
441
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
442 u->fails++;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
443 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
444
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
445 /* */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
446 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
447
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
448 p->tries--;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
449 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
450 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
451
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
452 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
453 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
454 return NGX_ERROR;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
455 }
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
456
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
457 /* reinitialize the proxy context for the next upstream */
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
458
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
459 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
460 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
461 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
462 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
463 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
464
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
465 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
466 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
467
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
468 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
469 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
470 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
471 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
472
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
473 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
474 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
475 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
476
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
477 return NGX_DONE;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
478 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
479 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
480
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
481
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
482 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
483 {
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
484 int rc, event, instance;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
485 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
486 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
487 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
488 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
489 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
490 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
491 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
492
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
493 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
494 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
495
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
496 /* Here is the race condition
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
497 when the upstreams are shared between
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
498 the threads or the processes but it should not be serious */
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
499
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
500 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
501
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
502 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
503 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
504 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
505
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
506 /* */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
507
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
508 #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
509 /* 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
510 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
511 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
512 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
513 #endif
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
514 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
515
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
516 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
517
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
518 for ( ;; ) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
519 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
520
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
521
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
522 /* Here is the race condition
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
523 when the upstreams are shared between
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
524 the threads or the processes but it should not be serious */
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
525
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
526 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
527 || 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
528 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
529 break;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
530 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
531
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
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
534 p->cur_upstream++;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
535
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
536 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
537 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
538 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
539
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
540 p->tries--;
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 (p->tries == 0) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
543 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
544 }
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 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
547 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
548
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
549 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
550 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
551 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
552 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
553
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
554 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
555
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
556 if (s == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
557 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
558 ngx_socket_n " failed");
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
559 return NGX_HTTP_INTERNAL_SERVER_ERROR;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
560 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
561
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
562 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
563 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
564 (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
565 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
566 "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
567
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
568 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
569 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
570 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
571 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
572
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
573 return NGX_HTTP_INTERNAL_SERVER_ERROR;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
574 }
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
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
577 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
578 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
579 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
580
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
581 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
582 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
583 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
584 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
585
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
586 return NGX_HTTP_INTERNAL_SERVER_ERROR;
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
587 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
588
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
589 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
590 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
591 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
592
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
593 instance = rev->instance;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
594
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
595 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
596 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
597 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
598
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
599 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
600 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
601 c->read = rev;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
602 c->write = wev;
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
603
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
604 rev->instance = wev->instance = !instance;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
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 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
607 c->fd = s;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
608 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
609
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
610 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
611 if (ngx_edge_add_event(wev) != NGX_OK) {
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
612 return 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
613 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
614 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
615
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
616 ngx_test_null(c->pool, ngx_create_pool(p->lcf->conn_pool_size, p->log),
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
617 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
618
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
619 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
620 ngx_pcalloc(c->pool, sizeof(struct sockaddr_in)),
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
621 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
622
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
623 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
624
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
625 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
626 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
627 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
628
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
629 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
630
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
631 if (rc == -1) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
632 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
633 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
634 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
635
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
636 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
637 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
638 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
639 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
640
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
641 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
642 }
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
643 }
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
644
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
645 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
646 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
647
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
648 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
649
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
650 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { /* kqueue */
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
651 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
652
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
653 } else { /* select, poll, /dev/poll */
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
654 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
655 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
656
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
657 /* 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
658
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
659 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
660 return 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
661 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
662 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
663
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
664 rev->event_handler = ngx_http_proxy_process_upstream_event;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
665 p->request->connection->write->event_handler = NULL;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
666
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
667 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
668 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
669
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
670 /* 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
671 if (rc == 0) {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
672 wev->write = 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
673 wev->ready = 1;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
674
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
675 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
676 }
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
677
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
678 /* 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
679
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
680 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
681 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
682
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
683 /* TODO: aio, iocp */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
684
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
685 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
686 return NGX_DONE;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
687 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
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 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
79
eacfdd1c31b9 nginx-0.0.1-2003-04-22-19:02:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 77
diff changeset
690 return 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
691 }
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 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
694 }
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
695
21
df7fb216a149 nginx-0.0.1-2002-12-04-19:29:40 import
Igor Sysoev <igor@sysoev.ru>
parents: 20
diff changeset
696
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
697 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
698 {
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
699 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
700 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
701 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
702
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
703 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
704 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
705 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
706 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
707
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
708 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
709 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
710
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
711
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
712 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
713 {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
714 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
715 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
716
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
717 chain = ngx_write_chain(p->connection, p->request_hunks, 0);
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
718 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
719 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
720 }
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
721
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
722 p->request_hunks = chain;
20
a649c0a0adb3 nginx-0.0.1-2002-12-03-18:45:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 19
diff changeset
723
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
724 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
725
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
726 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
727
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
728 if (chain) {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
729 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
730 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
731
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
732 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
733 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
734 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
735
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
736 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
737 }
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
738
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
739
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
740 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
741 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
742 int n;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
743 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
744 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
745
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
746 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
747
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
748 ngx_test_null(p->header_in,
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
749 ngx_create_temp_hunk(r->pool, p->lcf->header_size, 0, 0),
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
750 NGX_ERROR);
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
751
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
752 #if 0
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
753 ngx_test_null(p->header_in,
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
754 ngx_create_temp_hunk(r->pool,
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
755 p->lcf->header_size
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
756 - sizeof(ngx_cache_header_t),
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
757 sizeof(ngx_cache_header_t),
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
758 0),
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
759 NGX_ERROR);
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 p->header_in->type = NGX_HUNK_MEMORY|NGX_HUNK_IN_MEMORY;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
762 #endif
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
763
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
764 #if 0
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
765 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
766 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
767 NGX_ERROR);
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
768 #endif
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
769
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
770 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
771 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
772 p->nhunks++;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
773 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
774
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
775 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
776 NGX_ERROR);
67
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 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
779 *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
780
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
781 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
782
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
783 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
784 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
785
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
786
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
787 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
788 {
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
789 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
790 ngx_event_t *rev;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
791 ngx_chain_t *temp;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
792 ngx_table_elt_t *ch, *ph;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
793 ngx_event_proxy_t *ep;
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
794 ngx_http_request_t *r;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
795 ngx_http_proxy_log_ctx_t *lcx;
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
796
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
797 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
798
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
799 do {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
800 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
801 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
802
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
803 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
804 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
805 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
806 } else {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
807 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
808 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
809
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
810 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
811 return NGX_AGAIN;
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
812 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
813
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
814 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
815 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
816 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
817
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
818 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
819
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
820 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
821 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
822 "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
823 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
824 }
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
825
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
826 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
827
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
828 /* 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
829 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
830 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
831
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
832 do {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
833 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
834 } 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
835
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
836 } 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
837 && (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
838
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
839 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
840
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
841 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
842
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
843 /* 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
844
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
845 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
846 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
847
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
848 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
849 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
850 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
851
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
852 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
853 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
854 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
855
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
856 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
857 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
858
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
859 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
860 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
861 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
862 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
863 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
864
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
865 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
866 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
867 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
868
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
869 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
870 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
871 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
872
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
873 /* 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
874 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
875
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
876 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
877
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
878 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
879
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
880 #if 1
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
881 #if 0
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
882 rc = ngx_http_output_filter(r, p->header_in);
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
883 #endif
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
884
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
885 ngx_test_null(ep, ngx_pcalloc(r->pool, sizeof(ngx_event_proxy_t)),
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
886 NGX_ERROR);
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
887
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
888 ep->output_filter = (ngx_event_proxy_output_filter_pt)
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
889 ngx_http_output_filter;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
890 ep->output_data = r;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
891 ep->block_size = p->lcf->block_size;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
892 ep->max_block_size = p->lcf->max_block_size;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
893 ep->upstream = p->connection;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
894 ep->downstream = r->connection;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
895 ep->pool = r->pool;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
896 ep->log = p->log;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
897 ep->temp_path = p->lcf->temp_path;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
898
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
899 ngx_test_null(ep->temp_file, ngx_palloc(r->pool, sizeof(ngx_file_t)),
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
900 NGX_ERROR);
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
901 ep->temp_file->fd = NGX_INVALID_FILE;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
902 ep->temp_file->log = p->log;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
903
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
904 ep->max_temp_file_size = p->lcf->max_temp_file_size;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
905 ep->temp_file_write_size = p->lcf->temp_file_write_size;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
906 ep->temp_file_warn = "an upstream response is buffered "
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
907 "to a temporary file";
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
908
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
909 ngx_test_null(ep->preread_hunks, ngx_alloc_chain_entry(r->pool),
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
910 NGX_ERROR);
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
911 ep->preread_hunks->hunk = p->header_in;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
912 ep->preread_hunks->next = NULL;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
913 #if 0
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
914 ep->last_preread_hunk = ep->preread_hunks;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
915 #endif
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
916
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
917 ep->preread_size = p->header_in->last - p->header_in->pos;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
918
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
919 p->event_proxy = ep;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
920
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
921 lcx = p->log->data;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
922 lcx->action = "reading an upstream";
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
923
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
924 p->state_read_upstream_handler = ngx_http_proxy_read_upstream_body;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
925 p->state_write_upstream_handler = ngx_http_proxy_write_upstream_body;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
926
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
927 ngx_http_proxy_read_upstream_body(p);
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
928 #endif
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
929
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
930 #if 0
73
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
931 /* STUB */
4534060fde92 nginx-0.0.1-2003-04-10-19:08:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 72
diff changeset
932 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
933 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
934 ngx_http_proxy_finalize_request(p, NGX_OK);
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
935 #endif
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
936
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
937 /* 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
938 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
939
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
940 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
941 return rc;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
942 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
943
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
944 /* 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
945 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
946
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
947
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
948 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
949 {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
950 int rc;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
951
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
952 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
953
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
954 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
955 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
956 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
957 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
958 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
959
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
960 } 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
961 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
962 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
963
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
964 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
965 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
966 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
967 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
968 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
969
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
970 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
971 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
972
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
973 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
974 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
975 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
976
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
977 } else {
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
978 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
979 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
980 *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
981
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
982 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
983 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
984 "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
985 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
986 }
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
987 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
988
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
989 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
990 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
991
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
992 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
993 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
994
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
995 /* rc == NGX_AGAIN */
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
996
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
997 return NGX_AGAIN;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
998 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
999
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1000
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1001 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
1002 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1003 int rc, offset;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1004 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
1005
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1006 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1007
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1008 for ( ;; ) {
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
1009 rc = ngx_parse_http_header_line(r, p->header_in);
72
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 /* 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
1012
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1013 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
1014 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
1015 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
1016 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1017
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1018 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
1019 && 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
1020 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1021 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
1022 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1023
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1024 return NGX_AGAIN;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1025
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1026 /* 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
1027
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1028 } 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
1029 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
1030
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1031 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
1032 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
1033
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1034 /* 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
1035
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1036 } 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
1037 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
1038 "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
1039 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
1040 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1041
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1042 /* 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
1043
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1044 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
1045 /* 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
1046 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
1047
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1048 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
1049 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
1050
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1051 if (offset == 0) {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1052 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
1053 "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
1054 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
1055 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1056
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1057 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
1058 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
1059
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1060 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
1061 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
1062 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
1063 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
1064 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
1065 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
1066
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1067 } else {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1068 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
1069 "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
1070 /* 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
1071 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
1072 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1073 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1074
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1075 return NGX_AGAIN;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1076 }
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1077 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1078
72
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1079
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1080 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
1081 {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1082 int i;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1083 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
1084 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
1085
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1086 r = p->request;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1087
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1088 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
1089
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1090 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
1091 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
1092
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1093 /* 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
1094 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
1095
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1096 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
1097 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
1098 NGX_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1099 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
1100 NGX_ERROR);
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1101 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
1102 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
1103
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1104 } else {
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1105 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
1106 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
1107 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
1108 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
1109 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1110
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1111 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
1112 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
1113 continue;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1114 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1115
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1116 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
1117 *((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
1118 ((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
1119 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1120 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1121
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1122 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
1123 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
1124
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1125 return NGX_OK;
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1126 }
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1127
66de3f065886 nginx-0.0.1-2003-04-09-19:42:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 71
diff changeset
1128
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1129 static int ngx_http_proxy_read_upstream_body(ngx_http_proxy_ctx_t *p)
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1130 {
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1131 int rc;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1132
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1133 rc = ngx_event_proxy_read_upstream(p->event_proxy);
80
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
1134
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
1135 if (p->event_proxy->fatal_error) {
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
1136 return NGX_HTTP_INTERNAL_SERVER_ERROR;
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
1137 }
939bc7cd9a90 nginx-0.0.1-2003-04-23-18:34:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 79
diff changeset
1138
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1139 if (p->event_proxy->upstream_eof || p->event_proxy->upstream_error) {
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1140 rc = ngx_event_close_connection(p->connection->read);
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1141 }
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1142
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1143 return rc;
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1144 }
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1145
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1146
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1147 static int ngx_http_proxy_process_client_event(ngx_event_t *ev)
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1148 {
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1149 ngx_connection_t *c;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1150 ngx_http_request_t *r;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1151 ngx_http_proxy_ctx_t *p;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1152
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1153 c = (ngx_connection_t *) ev->data;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1154 r = (ngx_http_request_t *) c->data;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1155 p = (ngx_http_proxy_ctx_t *)
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1156 ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1157
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1158 return ngx_http_proxy_process_upstream(p, ev);
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1159 }
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1160
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1161
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1162 static int ngx_http_proxy_write_upstream_body(ngx_http_proxy_ctx_t *p)
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1163 {
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1164 return ngx_event_proxy_write_to_downstream(p->event_proxy);
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1165 }
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1166
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1167
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
1168
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1169
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1170 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
1171 {
81
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1172 #if 0
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1173
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1174 if (p->event_proxy->upstream_eof) {
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1175 rc = ngx_event_close_connection(p->connection->read);
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1176 link cache;
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1177 }
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1178
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1179 if (p->event_proxy->upstream_error) {
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1180 rc = ngx_event_close_connection(p->connection->read);
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1181 }
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1182
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1183 if (p->event_proxy->downstream_error) {
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1184 rc = ngx_event_close_connection(p->request->connection->write);
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1185 }
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1186
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1187 #endif
b2ece31c976a nginx-0.0.1-2003-04-24-18:46:08 import
Igor Sysoev <igor@sysoev.ru>
parents: 80
diff changeset
1188
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1189 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
1190 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1191
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1192
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1193 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
1194 int error)
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1195 {
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1196 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
1197
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1198 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
1199 }
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1200
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1201
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1202 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
1203 {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1204 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
1205
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1206 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
1207 " 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
1208 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
1209 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1210
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1211
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1212
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1213 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
1214 {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1215 char ch;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1216 char *p;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1217 enum {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1218 sw_start = 0,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1219 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
1220 sw_major_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1221 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
1222 sw_minor_digit,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1223 sw_status,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1224 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
1225 sw_status_text,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1226 sw_almost_done,
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1227 sw_done
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1228 } state;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1229
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1230 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
1231 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
1232
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1233 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
1234 ch = *p++;
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1235
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1236 switch (state) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1237
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1238 /* "HTTP/" */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1239 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
1240 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
1241 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
1242 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1243
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1244 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
1245 || *(p + 3) != '/')
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1246 {
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1247 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
1248 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1249
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1250 p += 4;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1251 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
1252 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1253
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1254 /* 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
1255 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
1256 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
1257 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
1258 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1259
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1260 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
1261 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1262
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1263 /* 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
1264 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
1265 if (ch == '.') {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1266 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
1267 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1268 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1269
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1270 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
1271 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
1272 }
23
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 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1275
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1276 /* 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
1277 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
1278 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
1279 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
1280 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1281
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1282 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
1283 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1284
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1285 /* 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
1286 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
1287 if (ch == ' ') {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1288 state = sw_status;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1289 break;
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
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1292 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
1293 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
1294 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1295
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1296 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1297
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1298 /* HTTP status code */
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1299 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
1300 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
1301 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
1302 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1303
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1304 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
1305
24
77c7629a2627 nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 23
diff changeset
1306 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
1307 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
1308 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
1309 }
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1310
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1311 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1312
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1313 /* 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
1314 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
1315 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1316 case ' ':
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1317 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
1318 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1319 case CR:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1320 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
1321 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1322 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1323 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1324 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1325 default:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1326 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
1327 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1328 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1329
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1330 /* 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
1331 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
1332 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1333 case CR:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1334 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
1335 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1336 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1337 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1338 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1339 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1340 break;
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 /* 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
1343 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
1344 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
1345 switch (ch) {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1346 case LF:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1347 state = sw_done;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1348 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1349 default:
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1350 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
1351 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1352 break;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1353 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1354 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1355
67
5a7d1aaa1618 nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 60
diff changeset
1356 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
1357
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1358 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
1359 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
1360 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
1361 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
1362
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1363 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
1364 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
1365
23
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1366 } else {
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1367 ctx->state = state;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1368 return NGX_AGAIN;
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1369 }
f540a63026c9 nginx-0.0.1-2002-12-06-19:32:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 22
diff changeset
1370 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1371
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1372
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1373 static int ngx_http_proxy_init(ngx_pool_t *pool)
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1374 {
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1375 int i;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1376 ngx_file_t file;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1377 ngx_path_t path;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1378
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1379 file.log = pool->log;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1380
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1381 path.name.data = "temp";
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1382 path.name.len = 4;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1383 path.level[0] = 1;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1384 path.level[1] = 2;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1385 path.level[2] = 3;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1386 path.len = 0;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1387
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1388 for (i = 0; i < 3; i++) {
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1389 if (path.level[i] == 0) {
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1390 break;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1391 }
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1392 path.len += path.level[i] + 1;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1393 }
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1394
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
1395 return ngx_create_temp_file(&file, &path, pool, 0);
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1396 }
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1397
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1398
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1399 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
1400 {
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1401 int i;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1402 ngx_http_proxy_loc_conf_t *conf;
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1403
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1404 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
1405 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
1406 NULL);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1407
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1408 /* STUB */
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1409 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
1410 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
1411 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
1412 conf->read_timeout = 10000;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1413 conf->header_size = 2048;
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1414
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1415 #if 1
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1416 conf->block_size = 4096;
75
869b10be682f nginx-0.0.1-2003-04-14-21:04:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 74
diff changeset
1417 conf->max_block_size = 4096 * 3;
76
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1418 conf->max_temp_file_size = 4096 * 5;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1419 conf->temp_file_write_size = 4096 * 2;
76
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1420 #else
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1421 conf->block_size = 2048;
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1422 conf->max_block_size = 4096 * 6;
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1423 conf->max_temp_file_size = 4096 * 5;
77
57c2e18d3572 nginx-0.0.1-2003-04-17-21:59:35 import
Igor Sysoev <igor@sysoev.ru>
parents: 76
diff changeset
1424 conf->temp_file_write_size = 4096 * 5;
76
6127d7075471 nginx-0.0.1-2003-04-15-19:06:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
1425 #endif
74
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1426
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1427 ngx_test_null(conf->temp_path, ngx_pcalloc(pool, sizeof(ngx_path_t)), NULL);
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1428
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1429 conf->temp_path->name.data = "temp";
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1430 conf->temp_path->name.len = 4;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1431 conf->temp_path->level[0] = 1;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1432 conf->temp_path->level[1] = 2;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1433 conf->temp_path->level[2] = 3;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1434 conf->temp_path->len = 0;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1435
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1436 for (i = 0; i < 3; i++) {
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1437 if (conf->temp_path->level[i] == 0) {
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1438 break;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1439 }
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1440 conf->temp_path->len += conf->temp_path->level[i] + 1;
17ab1af8c3dd nginx-0.0.1-2003-04-11-20:01:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 73
diff changeset
1441 }
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1442 /**/
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1443
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1444 return conf;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1445 }
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1446
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1447
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1448 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
1449 char *conf)
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1450 {
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1451 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
1452
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1453 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
1454 char *err, *host;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1455 struct hostent *h;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1456 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
1457 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
1458 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
1459 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
1460
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1461 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
1462
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1463 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
1464 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
1465 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1466
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1467 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
1468 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
1469 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1470
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1471 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
1472 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
1473
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1474 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
1475
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1476 if (err) {
70
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1477 return err;
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1478 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1479
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1480 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
1481 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
1482 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1483
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1484 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
1485 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1486 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
1487 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
1488
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1489 /* 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
1490
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1491 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
1492 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
1493 h = gethostbyname(host);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1494
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1495 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
1496 /* 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
1497 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
1498 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1499
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1500 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
1501 /* void */
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1502 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1503
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1504 /* 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
1505
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1506 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
1507 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
1508 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
1509 + 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
1510 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1511
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1512 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
1513
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1514 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
1515 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
1516 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
1517 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
1518 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
1519
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1520 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
1521 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
1522 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
1523 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1524
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1525 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
1526 (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
1527 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
1528 len);
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 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
1531
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1532 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
1533 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
1534 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
1535
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1536 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
1537 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
1538 }
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1539
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1540 } else {
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1541
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1542 /* 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
1543
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1544 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
1545 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
1546 NGX_CONF_ERROR);
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1547
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1548 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
1549
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1550 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
1551 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
1552 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
1553 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
1554
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1555 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
1556 + 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
1557
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1558 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
1559 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
1560 NGX_CONF_ERROR);
e320bf51c4e3 nginx-0.0.1-2003-03-25-18:40:51 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
1561
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1562 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
1563 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
1564 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
1565
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1566 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
1567
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1568 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
1569
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1570 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
1571 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
1572 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
1573
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[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
1575 }
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1576
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1577 ctx = cf->ctx;
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1578 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
1579 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
1580 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
1581
69
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1582 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1583 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1584
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1585
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1586 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
1587 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
1588 {
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1589 size_t i;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1590
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1591 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
1592 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
1593 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
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 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
1596 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
1597
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1598 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
1599 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
1600 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
1601 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
1602 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1603
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1604 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
1605 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
1606 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
1607 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
1608
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1609 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
1610 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
1611 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1612
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1613 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
1614 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1615 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1616
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1617 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
1618
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1619 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
1620 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
1621 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
1622 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1623 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1624 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1625
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1626 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
1627 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1628 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1629
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1630 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
1631 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
1632 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1633
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1634 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
1635
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1636 uu->uri.data = "/";
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1637 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
1638
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1639 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
1640 return NULL;
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1641 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1642
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1643 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
1644
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 70
diff changeset
1645 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
1646 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
1647 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
1648 return NULL;
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 }
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1651
e43f406e4525 nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 67
diff changeset
1652 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
1653 }