Mercurial > hg > nginx
annotate src/http/ngx_http.c @ 2173:11c59ecbd04f
exit on libxslt test failure
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 13 Aug 2008 08:32:35 +0000 |
parents | 723df5089c05 |
children | a69886fc2864 |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
5 |
2
ffffe1499bce
nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
6 |
3
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
2
diff
changeset
|
7 #include <ngx_config.h> |
100
7ebc8b7fb816
nginx-0.0.1-2003-06-03-19:42:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
98
diff
changeset
|
8 #include <ngx_core.h> |
103
6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
9 #include <ngx_event.h> |
2
ffffe1499bce
nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 #include <ngx_http.h> |
ffffe1499bce
nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
11 |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
12 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
13 static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
2021 | 14 static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf, |
15 ngx_http_core_main_conf_t *cmcf); | |
16 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf, | |
17 ngx_http_core_main_conf_t *cmcf); | |
18 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf, | |
19 ngx_http_core_main_conf_t *cmcf); | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
20 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
21 static ngx_int_t ngx_http_init_server_lists(ngx_conf_t *cf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
22 ngx_array_t *servers, ngx_array_t *in_ports); |
455 | 23 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf, |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
24 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_in_port_t *in_port, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
25 ngx_http_listen_t *listen); |
455 | 26 static ngx_int_t ngx_http_add_names(ngx_conf_t *cf, |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
27 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_in_addr_t *in_addr); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
28 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
29 static char *ngx_http_merge_locations(ngx_conf_t *cf, |
2027 | 30 ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module, |
499 | 31 ngx_uint_t ctx_index); |
2027 | 32 static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf, |
33 ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf); | |
34 static ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf, | |
35 ngx_http_core_loc_conf_t *pclcf); | |
36 static ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one, | |
37 const ngx_queue_t *two); | |
38 static ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf, | |
39 ngx_queue_t *locations); | |
40 static void ngx_http_create_locations_list(ngx_queue_t *locations, | |
41 ngx_queue_t *q); | |
42 static ngx_http_location_tree_node_t * | |
43 ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations, | |
44 size_t prefix); | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
45 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
46 static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
47 ngx_http_core_main_conf_t *cmcf, ngx_array_t *in_ports); |
1956
cb8c0c8e0c27
use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents:
1910
diff
changeset
|
48 static ngx_int_t ngx_http_cmp_conf_in_addrs(const void *one, const void *two); |
593 | 49 static int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one, |
50 const void *two); | |
212
679f60139863
nginx-0.0.1-2003-12-19-11:15:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
201
diff
changeset
|
51 |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
52 static ngx_int_t ngx_http_init_listening(ngx_conf_t *cf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
53 ngx_http_conf_in_port_t *in_port); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
54 |
593 | 55 ngx_uint_t ngx_http_max_module; |
56 | |
45
f1ee46c036a4
nginx-0.0.1-2003-01-10-09:09:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
44
diff
changeset
|
57 |
356
2e3cbc1bbe3c
nginx-0.0.7-2004-06-16-19:32:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
311
diff
changeset
|
58 ngx_int_t (*ngx_http_top_header_filter) (ngx_http_request_t *r); |
2e3cbc1bbe3c
nginx-0.0.7-2004-06-16-19:32:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
311
diff
changeset
|
59 ngx_int_t (*ngx_http_top_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch); |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
60 |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
61 |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
62 ngx_str_t ngx_http_html_default_types[] = { |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
63 ngx_string("text/html"), |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
64 ngx_null_string |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
65 }; |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
66 |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2138
diff
changeset
|
67 |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
68 static ngx_command_t ngx_http_commands[] = { |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
69 |
499 | 70 { ngx_string("http"), |
71 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, | |
72 ngx_http_block, | |
73 0, | |
74 0, | |
75 NULL }, | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
76 |
499 | 77 ngx_null_command |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
78 }; |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
79 |
577 | 80 |
311
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
81 static ngx_core_module_t ngx_http_module_ctx = { |
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
82 ngx_string("http"), |
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
83 NULL, |
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
84 NULL |
577 | 85 }; |
311
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
86 |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
87 |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
88 ngx_module_t ngx_http_module = { |
509 | 89 NGX_MODULE_V1, |
311
11ff50a35d6d
nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
90 &ngx_http_module_ctx, /* module context */ |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
91 ngx_http_commands, /* module directives */ |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
92 NGX_CORE_MODULE, /* module type */ |
541 | 93 NULL, /* init master */ |
116
571bcbff82c5
nginx-0.0.1-2003-07-11-08:50:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
114
diff
changeset
|
94 NULL, /* init module */ |
541 | 95 NULL, /* init process */ |
96 NULL, /* init thread */ | |
97 NULL, /* exit thread */ | |
98 NULL, /* exit process */ | |
99 NULL, /* exit master */ | |
100 NGX_MODULE_V1_PADDING | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
101 }; |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
102 |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
103 |
499 | 104 static char * |
105 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
106 { |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
107 char *rv; |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
108 ngx_uint_t mi, m, s; |
216
f1d0e5f09c1e
nginx-0.0.1-2003-12-25-23:26:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
213
diff
changeset
|
109 ngx_conf_t pcf; |
2021 | 110 ngx_array_t in_ports; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
111 ngx_http_module_t *module; |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
112 ngx_http_conf_ctx_t *ctx; |
2027 | 113 ngx_http_core_loc_conf_t *clcf; |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
114 ngx_http_core_srv_conf_t **cscfp; |
216
f1d0e5f09c1e
nginx-0.0.1-2003-12-25-23:26:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
213
diff
changeset
|
115 ngx_http_core_main_conf_t *cmcf; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
116 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
117 /* the main http context */ |
477 | 118 |
501 | 119 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); |
120 if (ctx == NULL) { | |
485 | 121 return NGX_CONF_ERROR; |
122 } | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
123 |
90
37530da31268
nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
124 *(ngx_http_conf_ctx_t **) conf = ctx; |
37530da31268
nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
125 |
485 | 126 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
127 /* count the number of the http modules and set up their indices */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
128 |
71
59229033ae93
nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
69
diff
changeset
|
129 ngx_http_max_module = 0; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
130 for (m = 0; ngx_modules[m]; m++) { |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
131 if (ngx_modules[m]->type != NGX_HTTP_MODULE) { |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
132 continue; |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
133 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
134 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
135 ngx_modules[m]->ctx_index = ngx_http_max_module++; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
136 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
137 |
477 | 138 |
485 | 139 /* the http main_conf context, it is the same in the all http contexts */ |
90
37530da31268
nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
140 |
485 | 141 ctx->main_conf = ngx_pcalloc(cf->pool, |
142 sizeof(void *) * ngx_http_max_module); | |
143 if (ctx->main_conf == NULL) { | |
144 return NGX_CONF_ERROR; | |
145 } | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
146 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
147 |
485 | 148 /* |
149 * the http null srv_conf context, it is used to merge | |
150 * the server{}s' srv_conf's | |
151 */ | |
152 | |
153 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); | |
154 if (ctx->srv_conf == NULL) { | |
155 return NGX_CONF_ERROR; | |
156 } | |
157 | |
158 | |
159 /* | |
160 * the http null loc_conf context, it is used to merge | |
161 * the server{}s' loc_conf's | |
162 */ | |
163 | |
164 ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); | |
165 if (ctx->loc_conf == NULL) { | |
166 return NGX_CONF_ERROR; | |
167 } | |
168 | |
169 | |
170 /* | |
171 * create the main_conf's, the null srv_conf's, and the null loc_conf's | |
172 * of the all http modules | |
173 */ | |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
174 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
175 for (m = 0; ngx_modules[m]; m++) { |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
176 if (ngx_modules[m]->type != NGX_HTTP_MODULE) { |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
177 continue; |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
178 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
179 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
180 module = ngx_modules[m]->ctx; |
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
181 mi = ngx_modules[m]->ctx_index; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
182 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
183 if (module->create_main_conf) { |
501 | 184 ctx->main_conf[mi] = module->create_main_conf(cf); |
185 if (ctx->main_conf[mi] == NULL) { | |
485 | 186 return NGX_CONF_ERROR; |
187 } | |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
188 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
189 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
190 if (module->create_srv_conf) { |
501 | 191 ctx->srv_conf[mi] = module->create_srv_conf(cf); |
192 if (ctx->srv_conf[mi] == NULL) { | |
485 | 193 return NGX_CONF_ERROR; |
194 } | |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
195 } |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
196 |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
197 if (module->create_loc_conf) { |
501 | 198 ctx->loc_conf[mi] = module->create_loc_conf(cf); |
199 if (ctx->loc_conf[mi] == NULL) { | |
485 | 200 return NGX_CONF_ERROR; |
201 } | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
202 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
203 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
204 |
509 | 205 pcf = *cf; |
206 cf->ctx = ctx; | |
207 | |
208 for (m = 0; ngx_modules[m]; m++) { | |
209 if (ngx_modules[m]->type != NGX_HTTP_MODULE) { | |
210 continue; | |
211 } | |
212 | |
213 module = ngx_modules[m]->ctx; | |
214 | |
215 if (module->preconfiguration) { | |
216 if (module->preconfiguration(cf) != NGX_OK) { | |
217 return NGX_CONF_ERROR; | |
218 } | |
219 } | |
220 } | |
485 | 221 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
222 /* parse inside the http{} block */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
223 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
224 cf->module_type = NGX_HTTP_MODULE; |
88
674d333f4296
nginx-0.0.1-2003-05-14-21:13:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
81
diff
changeset
|
225 cf->cmd_type = NGX_HTTP_MAIN_CONF; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
226 rv = ngx_conf_parse(cf, NULL); |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
227 |
176
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
228 if (rv != NGX_CONF_OK) { |
2027 | 229 goto failed; |
176
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
230 } |
54
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
231 |
176
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
232 /* |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
233 * init http{} main_conf's, merge the server{}s' srv_conf's |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
234 * and its location{}s' loc_conf's |
c0552e5ab567
nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents:
144
diff
changeset
|
235 */ |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
236 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
237 cmcf = ctx->main_conf[ngx_http_core_module.ctx_index]; |
98
c9b243802a17
nginx-0.0.1-2003-05-30-18:27:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
238 cscfp = cmcf->servers.elts; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
239 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
240 for (m = 0; ngx_modules[m]; m++) { |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
241 if (ngx_modules[m]->type != NGX_HTTP_MODULE) { |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
242 continue; |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
243 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
244 |
98
c9b243802a17
nginx-0.0.1-2003-05-30-18:27:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
245 module = ngx_modules[m]->ctx; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
246 mi = ngx_modules[m]->ctx_index; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
247 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
248 /* init http{} main_conf's */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
249 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
250 if (module->init_main_conf) { |
119
cd54bcbaf3b5
nginx-0.0.1-2003-07-21-01:15:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
116
diff
changeset
|
251 rv = module->init_main_conf(cf, ctx->main_conf[mi]); |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
252 if (rv != NGX_CONF_OK) { |
2027 | 253 goto failed; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
254 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
255 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
256 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
257 for (s = 0; s < cmcf->servers.nelts; s++) { |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
258 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
259 /* merge the server{}s' srv_conf's */ |
54
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
260 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
261 if (module->merge_srv_conf) { |
2027 | 262 rv = module->merge_srv_conf(cf, ctx->srv_conf[mi], |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
263 cscfp[s]->ctx->srv_conf[mi]); |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
264 if (rv != NGX_CONF_OK) { |
2027 | 265 goto failed; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
266 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
267 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
268 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
269 if (module->merge_loc_conf) { |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
270 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
271 /* merge the server{}'s loc_conf */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
272 |
2027 | 273 rv = module->merge_loc_conf(cf, ctx->loc_conf[mi], |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
274 cscfp[s]->ctx->loc_conf[mi]); |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
275 if (rv != NGX_CONF_OK) { |
2027 | 276 goto failed; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
277 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
278 |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
279 /* merge the locations{}' loc_conf's */ |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
280 |
2027 | 281 clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index]; |
282 | |
283 rv = ngx_http_merge_locations(cf, clcf->locations, | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
284 cscfp[s]->ctx->loc_conf, |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
285 module, mi); |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
286 if (rv != NGX_CONF_OK) { |
2027 | 287 goto failed; |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
288 } |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
289 } |
54
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
290 } |
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
291 } |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
90
diff
changeset
|
292 |
485 | 293 |
2027 | 294 /* create location trees */ |
295 | |
296 for (s = 0; s < cmcf->servers.nelts; s++) { | |
297 | |
298 clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index]; | |
299 | |
300 if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) { | |
301 return NGX_CONF_ERROR; | |
302 } | |
303 | |
304 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) { | |
305 return NGX_CONF_ERROR; | |
306 } | |
307 } | |
308 | |
309 | |
2021 | 310 if (ngx_http_init_phases(cf, cmcf) != NGX_OK) { |
485 | 311 return NGX_CONF_ERROR; |
312 } | |
313 | |
2021 | 314 if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) { |
649 | 315 return NGX_CONF_ERROR; |
316 } | |
317 | |
509 | 318 |
319 for (m = 0; ngx_modules[m]; m++) { | |
320 if (ngx_modules[m]->type != NGX_HTTP_MODULE) { | |
321 continue; | |
322 } | |
323 | |
324 module = ngx_modules[m]->ctx; | |
325 | |
326 if (module->postconfiguration) { | |
327 if (module->postconfiguration(cf) != NGX_OK) { | |
328 return NGX_CONF_ERROR; | |
329 } | |
330 } | |
331 } | |
332 | |
573 | 333 if (ngx_http_variables_init_vars(cf) != NGX_OK) { |
334 return NGX_CONF_ERROR; | |
335 } | |
509 | 336 |
337 /* | |
338 * http{}'s cf->ctx was needed while the configuration merging | |
339 * and in postconfiguration process | |
340 */ | |
341 | |
342 *cf = pcf; | |
343 | |
507 | 344 |
2021 | 345 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) { |
681 | 346 return NGX_CONF_ERROR; |
347 } | |
348 | |
349 | |
238
674f85a4d00f
nginx-0.0.1-2004-01-23-12:26:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
236
diff
changeset
|
350 /* |
455 | 351 * create the lists of ports, addresses and server names |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
352 * to find quickly the server core module configuration at run-time |
238
674f85a4d00f
nginx-0.0.1-2004-01-23-12:26:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
236
diff
changeset
|
353 */ |
54
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
354 |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
355 /* AF_INET only */ |
455 | 356 |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
357 if (ngx_http_init_server_lists(cf, &cmcf->servers, &in_ports) != NGX_OK) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
358 return NGX_CONF_ERROR; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
359 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
360 |
455 | 361 |
362 /* optimize the lists of ports, addresses and server names */ | |
54
27b628ef907e
nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
45
diff
changeset
|
363 |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
364 /* AF_INET only */ |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
365 |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
366 if (ngx_http_optimize_servers(cf, cmcf, &in_ports) != NGX_OK) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
367 return NGX_CONF_ERROR; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
368 } |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
369 |
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
370 return NGX_CONF_OK; |
2027 | 371 |
372 failed: | |
373 | |
374 *cf = pcf; | |
375 | |
376 return rv; | |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
377 } |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
378 |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
379 |
2021 | 380 static ngx_int_t |
381 ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf) | |
382 { | |
383 if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers, | |
384 cf->pool, 1, sizeof(ngx_http_handler_pt)) | |
385 != NGX_OK) | |
386 { | |
387 return NGX_ERROR; | |
388 } | |
389 | |
390 if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers, | |
391 cf->pool, 1, sizeof(ngx_http_handler_pt)) | |
392 != NGX_OK) | |
393 { | |
394 return NGX_ERROR; | |
395 } | |
396 | |
397 if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers, | |
398 cf->pool, 1, sizeof(ngx_http_handler_pt)) | |
399 != NGX_OK) | |
400 { | |
401 return NGX_ERROR; | |
402 } | |
403 | |
404 if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers, | |
405 cf->pool, 1, sizeof(ngx_http_handler_pt)) | |
406 != NGX_OK) | |
407 { | |
408 return NGX_ERROR; | |
409 } | |
410 | |
411 if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers, | |
412 cf->pool, 2, sizeof(ngx_http_handler_pt)) | |
413 != NGX_OK) | |
414 { | |
415 return NGX_ERROR; | |
416 } | |
417 | |
418 if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers, | |
419 cf->pool, 4, sizeof(ngx_http_handler_pt)) | |
420 != NGX_OK) | |
421 { | |
422 return NGX_ERROR; | |
423 } | |
424 | |
425 if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers, | |
426 cf->pool, 1, sizeof(ngx_http_handler_pt)) | |
427 != NGX_OK) | |
428 { | |
429 return NGX_ERROR; | |
430 } | |
431 | |
432 return NGX_OK; | |
433 } | |
434 | |
435 | |
436 static ngx_int_t | |
437 ngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf) | |
438 { | |
439 ngx_array_t headers_in; | |
440 ngx_hash_key_t *hk; | |
441 ngx_hash_init_t hash; | |
442 ngx_http_header_t *header; | |
443 | |
444 if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t)) | |
445 != NGX_OK) | |
446 { | |
447 return NGX_ERROR; | |
448 } | |
449 | |
450 for (header = ngx_http_headers_in; header->name.len; header++) { | |
451 hk = ngx_array_push(&headers_in); | |
452 if (hk == NULL) { | |
453 return NGX_ERROR; | |
454 } | |
455 | |
456 hk->key = header->name; | |
457 hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len); | |
458 hk->value = header; | |
459 } | |
460 | |
461 hash.hash = &cmcf->headers_in_hash; | |
462 hash.key = ngx_hash_key_lc; | |
463 hash.max_size = 512; | |
464 hash.bucket_size = ngx_align(64, ngx_cacheline_size); | |
465 hash.name = "headers_in_hash"; | |
466 hash.pool = cf->pool; | |
467 hash.temp_pool = NULL; | |
468 | |
469 if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) { | |
470 return NGX_ERROR; | |
471 } | |
472 | |
473 return NGX_OK; | |
474 } | |
475 | |
476 | |
477 static ngx_int_t | |
478 ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf) | |
479 { | |
480 ngx_int_t j; | |
481 ngx_uint_t i, n; | |
482 ngx_uint_t find_config_index, use_rewrite, use_access; | |
483 ngx_http_handler_pt *h; | |
484 ngx_http_phase_handler_t *ph; | |
485 ngx_http_phase_handler_pt checker; | |
486 | |
487 cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1; | |
488 cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1; | |
489 find_config_index = 0; | |
490 use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0; | |
491 use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0; | |
492 | |
493 n = use_rewrite + use_access + 1; /* find config phase */ | |
494 | |
495 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) { | |
496 n += cmcf->phases[i].handlers.nelts; | |
497 } | |
498 | |
499 ph = ngx_pcalloc(cf->pool, | |
500 n * sizeof(ngx_http_phase_handler_t) + sizeof(void *)); | |
501 if (ph == NULL) { | |
502 return NGX_ERROR; | |
503 } | |
504 | |
505 cmcf->phase_engine.handlers = ph; | |
506 n = 0; | |
507 | |
508 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) { | |
509 h = cmcf->phases[i].handlers.elts; | |
510 | |
511 switch (i) { | |
512 | |
513 case NGX_HTTP_SERVER_REWRITE_PHASE: | |
514 if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) { | |
515 cmcf->phase_engine.server_rewrite_index = n; | |
516 } | |
517 checker = ngx_http_core_generic_phase; | |
518 | |
519 break; | |
520 | |
521 case NGX_HTTP_FIND_CONFIG_PHASE: | |
522 find_config_index = n; | |
523 | |
524 ph->checker = ngx_http_core_find_config_phase; | |
525 n++; | |
526 ph++; | |
527 | |
528 continue; | |
529 | |
530 case NGX_HTTP_REWRITE_PHASE: | |
531 if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) { | |
532 cmcf->phase_engine.location_rewrite_index = n; | |
533 } | |
534 checker = ngx_http_core_generic_phase; | |
535 | |
536 break; | |
537 | |
538 case NGX_HTTP_POST_REWRITE_PHASE: | |
539 if (use_rewrite) { | |
540 ph->checker = ngx_http_core_post_rewrite_phase; | |
541 ph->next = find_config_index; | |
542 n++; | |
543 ph++; | |
544 } | |
545 | |
546 continue; | |
547 | |
548 case NGX_HTTP_ACCESS_PHASE: | |
549 checker = ngx_http_core_access_phase; | |
550 n++; | |
551 break; | |
552 | |
553 case NGX_HTTP_POST_ACCESS_PHASE: | |
554 if (use_access) { | |
555 ph->checker = ngx_http_core_post_access_phase; | |
556 ph->next = n; | |
557 ph++; | |
558 } | |
559 | |
560 continue; | |
561 | |
562 case NGX_HTTP_CONTENT_PHASE: | |
563 checker = ngx_http_core_content_phase; | |
564 break; | |
565 | |
566 default: | |
567 checker = ngx_http_core_generic_phase; | |
568 } | |
569 | |
570 n += cmcf->phases[i].handlers.nelts; | |
571 | |
572 for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) { | |
573 ph->checker = checker; | |
574 ph->handler = h[j]; | |
575 ph->next = n; | |
576 ph++; | |
577 } | |
578 } | |
579 | |
580 return NGX_OK; | |
581 } | |
582 | |
583 | |
2027 | 584 static char * |
585 ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations, | |
586 void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index) | |
587 { | |
588 char *rv; | |
589 ngx_queue_t *q; | |
590 ngx_http_core_loc_conf_t *clcf; | |
591 ngx_http_location_queue_t *lq; | |
592 | |
593 if (locations == NULL) { | |
594 return NGX_CONF_OK; | |
595 } | |
596 | |
597 for (q = ngx_queue_head(locations); | |
598 q != ngx_queue_sentinel(locations); | |
599 q = ngx_queue_next(q)) | |
600 { | |
601 lq = (ngx_http_location_queue_t *) q; | |
602 | |
603 clcf = lq->exact ? lq->exact : lq->inclusive; | |
604 | |
605 rv = module->merge_loc_conf(cf, loc_conf[ctx_index], | |
606 clcf->loc_conf[ctx_index]); | |
607 if (rv != NGX_CONF_OK) { | |
608 return rv; | |
609 } | |
610 | |
611 rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf, | |
612 module, ctx_index); | |
613 if (rv != NGX_CONF_OK) { | |
614 return rv; | |
615 } | |
616 } | |
617 | |
618 return NGX_CONF_OK; | |
619 } | |
620 | |
621 | |
622 static ngx_int_t | |
623 ngx_http_init_locations(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, | |
624 ngx_http_core_loc_conf_t *pclcf) | |
625 { | |
626 ngx_uint_t n; | |
627 ngx_queue_t *q, *locations, *named, tail; | |
628 ngx_http_core_loc_conf_t *clcf; | |
629 ngx_http_location_queue_t *lq; | |
630 ngx_http_core_loc_conf_t **clcfp; | |
631 #if (NGX_PCRE) | |
632 ngx_uint_t r; | |
633 ngx_queue_t *regex; | |
634 #endif | |
635 | |
636 locations = pclcf->locations; | |
637 | |
638 if (locations == NULL) { | |
639 return NGX_OK; | |
640 } | |
641 | |
642 ngx_queue_sort(locations, ngx_http_cmp_locations); | |
643 | |
644 named = NULL; | |
645 n = 0; | |
646 #if (NGX_PCRE) | |
647 regex = NULL; | |
648 r = 0; | |
649 #endif | |
650 | |
651 for (q = ngx_queue_head(locations); | |
652 q != ngx_queue_sentinel(locations); | |
653 q = ngx_queue_next(q)) | |
654 { | |
655 lq = (ngx_http_location_queue_t *) q; | |
656 | |
657 clcf = lq->exact ? lq->exact : lq->inclusive; | |
658 | |
659 if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) { | |
660 return NGX_ERROR; | |
661 } | |
662 | |
663 #if (NGX_PCRE) | |
664 | |
665 if (clcf->regex) { | |
666 r++; | |
667 | |
668 if (regex == NULL) { | |
669 regex = q; | |
670 } | |
671 | |
672 continue; | |
673 } | |
674 | |
675 #endif | |
676 | |
677 if (clcf->named) { | |
678 n++; | |
679 | |
680 if (named == NULL) { | |
681 named = q; | |
682 } | |
683 | |
684 continue; | |
685 } | |
686 | |
687 if (clcf->noname) { | |
688 break; | |
689 } | |
690 } | |
691 | |
692 if (q != ngx_queue_sentinel(locations)) { | |
693 ngx_queue_split(locations, q, &tail); | |
694 } | |
695 | |
696 if (named) { | |
697 clcfp = ngx_palloc(cf->pool, | |
698 (n + 1) * sizeof(ngx_http_core_loc_conf_t **)); | |
699 if (clcfp == NULL) { | |
700 return NGX_ERROR; | |
701 } | |
702 | |
703 cscf->named_locations = clcfp; | |
704 | |
705 for (q = named; | |
706 q != ngx_queue_sentinel(locations); | |
707 q = ngx_queue_next(q)) | |
708 { | |
709 lq = (ngx_http_location_queue_t *) q; | |
710 | |
711 *(clcfp++) = lq->exact; | |
712 } | |
713 | |
714 *clcfp = NULL; | |
715 | |
716 ngx_queue_split(locations, named, &tail); | |
717 } | |
718 | |
719 #if (NGX_PCRE) | |
720 | |
721 if (regex) { | |
722 | |
723 clcfp = ngx_palloc(cf->pool, | |
724 (r + 1) * sizeof(ngx_http_core_loc_conf_t **)); | |
725 if (clcfp == NULL) { | |
726 return NGX_ERROR; | |
727 } | |
728 | |
729 pclcf->regex_locations = clcfp; | |
730 | |
731 for (q = regex; | |
732 q != ngx_queue_sentinel(locations); | |
733 q = ngx_queue_next(q)) | |
734 { | |
735 lq = (ngx_http_location_queue_t *) q; | |
736 | |
737 *(clcfp++) = lq->exact; | |
738 } | |
739 | |
740 *clcfp = NULL; | |
741 | |
742 ngx_queue_split(locations, regex, &tail); | |
743 } | |
744 | |
745 #endif | |
746 | |
747 return NGX_OK; | |
748 } | |
749 | |
750 | |
751 static ngx_int_t | |
752 ngx_http_init_static_location_trees(ngx_conf_t *cf, | |
753 ngx_http_core_loc_conf_t *pclcf) | |
754 { | |
755 ngx_queue_t *q, *locations; | |
756 ngx_http_core_loc_conf_t *clcf; | |
757 ngx_http_location_queue_t *lq; | |
758 | |
759 locations = pclcf->locations; | |
760 | |
761 if (locations == NULL) { | |
762 return NGX_OK; | |
763 } | |
764 | |
765 if (ngx_queue_empty(locations)) { | |
766 return NGX_OK; | |
767 } | |
768 | |
769 for (q = ngx_queue_head(locations); | |
770 q != ngx_queue_sentinel(locations); | |
771 q = ngx_queue_next(q)) | |
772 { | |
773 lq = (ngx_http_location_queue_t *) q; | |
774 | |
775 clcf = lq->exact ? lq->exact : lq->inclusive; | |
776 | |
777 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) { | |
778 return NGX_ERROR; | |
779 } | |
780 } | |
781 | |
782 if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) { | |
783 return NGX_ERROR; | |
784 } | |
785 | |
786 ngx_http_create_locations_list(locations, ngx_queue_head(locations)); | |
787 | |
788 pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0); | |
789 if (pclcf->static_locations == NULL) { | |
790 return NGX_ERROR; | |
791 } | |
792 | |
793 return NGX_OK; | |
794 } | |
795 | |
796 | |
797 ngx_int_t | |
798 ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations, | |
799 ngx_http_core_loc_conf_t *clcf) | |
800 { | |
801 ngx_http_location_queue_t *lq; | |
802 | |
803 if (*locations == NULL) { | |
804 *locations = ngx_palloc(cf->temp_pool, | |
805 sizeof(ngx_http_location_queue_t)); | |
806 if (*locations == NULL) { | |
807 return NGX_ERROR; | |
808 } | |
809 | |
810 ngx_queue_init(*locations); | |
811 } | |
812 | |
813 lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t)); | |
814 if (lq == NULL) { | |
815 return NGX_ERROR; | |
816 } | |
817 | |
818 if (clcf->exact_match | |
819 #if (NGX_PCRE) | |
820 || clcf->regex | |
821 #endif | |
822 || clcf->named || clcf->noname) | |
823 { | |
824 lq->exact = clcf; | |
825 lq->inclusive = NULL; | |
826 | |
827 } else { | |
828 lq->exact = NULL; | |
829 lq->inclusive = clcf; | |
830 } | |
831 | |
832 lq->name = &clcf->name; | |
833 lq->file_name = cf->conf_file->file.name.data; | |
834 lq->line = cf->conf_file->line; | |
835 | |
836 ngx_queue_init(&lq->list); | |
837 | |
838 ngx_queue_insert_tail(*locations, &lq->queue); | |
839 | |
840 return NGX_OK; | |
841 } | |
842 | |
843 | |
844 static ngx_int_t | |
845 ngx_http_cmp_locations(const ngx_queue_t *one, const ngx_queue_t *two) | |
846 { | |
847 ngx_int_t rc; | |
848 ngx_http_core_loc_conf_t *first, *second; | |
849 ngx_http_location_queue_t *lq1, *lq2; | |
850 | |
851 lq1 = (ngx_http_location_queue_t *) one; | |
852 lq2 = (ngx_http_location_queue_t *) two; | |
853 | |
854 first = lq1->exact ? lq1->exact : lq1->inclusive; | |
855 second = lq2->exact ? lq2->exact : lq2->inclusive; | |
856 | |
857 if (first->noname && !second->noname) { | |
858 /* shift no named locations to the end */ | |
859 return 1; | |
860 } | |
861 | |
862 if (!first->noname && second->noname) { | |
863 /* shift no named locations to the end */ | |
864 return -1; | |
865 } | |
866 | |
867 if (first->noname || second->noname) { | |
868 /* do not sort no named locations */ | |
869 return 0; | |
870 } | |
871 | |
872 if (first->named && !second->named) { | |
873 /* shift named locations to the end */ | |
874 return 1; | |
875 } | |
876 | |
877 if (!first->named && second->named) { | |
878 /* shift named locations to the end */ | |
879 return -1; | |
880 } | |
881 | |
882 if (first->named && second->named) { | |
883 return ngx_strcmp(first->name.data, second->name.data); | |
884 } | |
885 | |
886 #if (NGX_PCRE) | |
887 | |
888 if (first->regex && !second->regex) { | |
889 /* shift the regex matches to the end */ | |
890 return 1; | |
891 } | |
892 | |
893 if (!first->regex && second->regex) { | |
894 /* shift the regex matches to the end */ | |
895 return -1; | |
896 } | |
897 | |
898 if (first->regex || second->regex) { | |
899 /* do not sort the regex matches */ | |
900 return 0; | |
901 } | |
902 | |
903 #endif | |
904 | |
905 rc = ngx_strcmp(first->name.data, second->name.data); | |
906 | |
907 if (rc == 0 && !first->exact_match && second->exact_match) { | |
908 /* an exact match must be before the same inclusive one */ | |
909 return 1; | |
910 } | |
911 | |
912 return rc; | |
913 } | |
914 | |
915 | |
916 static ngx_int_t | |
917 ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations) | |
918 { | |
919 ngx_queue_t *q, *x; | |
920 ngx_http_location_queue_t *lq, *lx; | |
921 | |
922 q = ngx_queue_head(locations); | |
923 | |
924 while (q != ngx_queue_last(locations)) { | |
925 | |
926 x = ngx_queue_next(q); | |
927 | |
928 lq = (ngx_http_location_queue_t *) q; | |
929 lx = (ngx_http_location_queue_t *) x; | |
930 | |
931 if (ngx_strcmp(lq->name->data, lx->name->data) == 0) { | |
932 | |
933 if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) { | |
934 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
935 "duplicate location \"%V\" in %s:%ui", | |
936 lx->name, lx->file_name, lx->line); | |
937 | |
938 return NGX_ERROR; | |
939 } | |
940 | |
941 lq->inclusive = lx->inclusive; | |
942 | |
943 ngx_queue_remove(x); | |
944 | |
945 continue; | |
946 } | |
947 | |
948 q = ngx_queue_next(q); | |
949 } | |
950 | |
951 return NGX_OK; | |
952 } | |
953 | |
954 | |
955 static void | |
956 ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q) | |
957 { | |
958 u_char *name; | |
959 size_t len; | |
960 ngx_queue_t *x, tail; | |
961 ngx_http_location_queue_t *lq, *lx; | |
962 | |
963 if (q == ngx_queue_last(locations)) { | |
964 return; | |
965 } | |
966 | |
967 lq = (ngx_http_location_queue_t *) q; | |
968 | |
969 if (lq->inclusive == NULL) { | |
970 ngx_http_create_locations_list(locations, ngx_queue_next(q)); | |
971 return; | |
972 } | |
973 | |
974 len = lq->name->len; | |
975 name = lq->name->data; | |
976 | |
977 for (x = ngx_queue_next(q); | |
978 x != ngx_queue_sentinel(locations); | |
979 x = ngx_queue_next(x)) | |
980 { | |
981 lx = (ngx_http_location_queue_t *) x; | |
982 | |
983 if (len > lx->name->len | |
984 || (ngx_strncmp(name, lx->name->data, len) != 0)) | |
985 { | |
986 break; | |
987 } | |
988 } | |
989 | |
990 q = ngx_queue_next(q); | |
991 | |
992 if (q == x) { | |
993 ngx_http_create_locations_list(locations, x); | |
994 return; | |
995 } | |
996 | |
997 ngx_queue_split(locations, q, &tail); | |
998 ngx_queue_add(&lq->list, &tail); | |
999 | |
1000 if (x == ngx_queue_sentinel(locations)) { | |
1001 ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list)); | |
1002 return; | |
1003 } | |
1004 | |
1005 ngx_queue_split(&lq->list, x, &tail); | |
1006 ngx_queue_add(locations, &tail); | |
1007 | |
1008 ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list)); | |
1009 | |
1010 ngx_http_create_locations_list(locations, x); | |
1011 } | |
1012 | |
1013 | |
1014 /* | |
1015 * to keep cache locality for left leaf nodes, allocate nodes in following | |
1016 * order: node, left subtree, right subtree, inclusive subtree | |
1017 */ | |
1018 | |
1019 static ngx_http_location_tree_node_t * | |
1020 ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations, | |
1021 size_t prefix) | |
1022 { | |
1023 size_t len; | |
1024 ngx_queue_t *q, tail; | |
1025 ngx_http_location_queue_t *lq; | |
1026 ngx_http_location_tree_node_t *node; | |
1027 | |
1028 q = ngx_queue_middle(locations); | |
1029 | |
1030 lq = (ngx_http_location_queue_t *) q; | |
1031 len = lq->name->len - prefix; | |
1032 | |
2049 | 1033 node = ngx_palloc(cf->pool, |
1034 offsetof(ngx_http_location_tree_node_t, name) + len); | |
2027 | 1035 if (node == NULL) { |
1036 return NULL; | |
1037 } | |
1038 | |
2039
4d8140271204
*) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents:
2029
diff
changeset
|
1039 node->left = NULL; |
4d8140271204
*) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents:
2029
diff
changeset
|
1040 node->right = NULL; |
4d8140271204
*) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents:
2029
diff
changeset
|
1041 node->tree = NULL; |
2027 | 1042 node->exact = lq->exact; |
1043 node->inclusive = lq->inclusive; | |
1044 | |
1045 node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect) | |
1046 || (lq->inclusive && lq->inclusive->auto_redirect)); | |
1047 | |
1048 node->len = (u_char) len; | |
1049 ngx_memcpy(node->name, &lq->name->data[prefix], len); | |
1050 | |
1051 ngx_queue_split(locations, q, &tail); | |
1052 | |
1053 if (ngx_queue_empty(locations)) { | |
1054 /* | |
1055 * ngx_queue_split() insures that if left part is empty, | |
1056 * then right one is empty too | |
1057 */ | |
1058 goto inclusive; | |
1059 } | |
1060 | |
1061 node->left = ngx_http_create_locations_tree(cf, locations, prefix); | |
1062 if (node->left == NULL) { | |
1063 return NULL; | |
1064 } | |
1065 | |
1066 ngx_queue_remove(q); | |
1067 | |
1068 if (ngx_queue_empty(&tail)) { | |
1069 goto inclusive; | |
1070 } | |
1071 | |
1072 node->right = ngx_http_create_locations_tree(cf, &tail, prefix); | |
1073 if (node->right == NULL) { | |
1074 return NULL; | |
1075 } | |
1076 | |
1077 inclusive: | |
1078 | |
1079 if (ngx_queue_empty(&lq->list)) { | |
1080 return node; | |
1081 } | |
1082 | |
1083 node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len); | |
1084 if (node->tree == NULL) { | |
1085 return NULL; | |
1086 } | |
1087 | |
1088 return node; | |
1089 } | |
1090 | |
1091 | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1092 static ngx_int_t |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1093 ngx_http_init_server_lists(ngx_conf_t *cf, ngx_array_t *servers, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1094 ngx_array_t *in_ports) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1095 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1096 ngx_uint_t s, l, p, a; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1097 ngx_http_listen_t *listen; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1098 ngx_http_conf_in_port_t *in_port; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1099 ngx_http_conf_in_addr_t *in_addr; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1100 ngx_http_core_srv_conf_t **cscfp; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1101 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1102 if (ngx_array_init(in_ports, cf->temp_pool, 2, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1103 sizeof(ngx_http_conf_in_port_t)) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1104 != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1105 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1106 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1107 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1108 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1109 /* "server" directives */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1110 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1111 cscfp = servers->elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1112 for (s = 0; s < servers->nelts; s++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1113 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1114 /* "listen" directives */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1115 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1116 listen = cscfp[s]->listen.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1117 for (l = 0; l < cscfp[s]->listen.nelts; l++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1118 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1119 /* AF_INET only */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1120 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1121 in_port = in_ports->elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1122 for (p = 0; p < in_ports->nelts; p++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1123 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1124 if (listen[l].port != in_port[p].port) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1125 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1126 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1127 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1128 /* the port is already in the port list */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1129 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1130 in_addr = in_port[p].addrs.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1131 for (a = 0; a < in_port[p].addrs.nelts; a++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1132 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1133 if (listen[l].addr != in_addr[a].addr) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1134 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1135 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1136 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1137 /* the address is already in the address list */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1138 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1139 if (ngx_http_add_names(cf, cscfp[s], &in_addr[a]) != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1140 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1141 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1142 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1143 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1144 /* |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1145 * check the duplicate "default" server |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1146 * for this address:port |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1147 */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1148 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1149 if (listen[l].conf.default_server) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1150 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1151 if (in_addr[a].default_server) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1152 ngx_log_error(NGX_LOG_ERR, cf->log, 0, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1153 "the duplicate default server in %s:%ui", |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1154 listen[l].file_name, listen[l].line); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1155 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1156 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1157 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1158 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1159 in_addr[a].core_srv_conf = cscfp[s]; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1160 in_addr[a].default_server = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1161 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1162 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1163 goto found; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1164 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1165 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1166 /* |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1167 * add the address to the addresses list that |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1168 * bound to this port |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1169 */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1170 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1171 if (ngx_http_add_address(cf, cscfp[s], &in_port[p], &listen[l]) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1172 != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1173 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1174 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1175 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1176 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1177 goto found; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1178 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1179 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1180 /* add the port to the in_port list */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1181 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1182 in_port = ngx_array_push(in_ports); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1183 if (in_port == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1184 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1185 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1186 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1187 in_port->port = listen[l].port; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1188 in_port->addrs.elts = NULL; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1189 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1190 if (ngx_http_add_address(cf, cscfp[s], in_port, &listen[l]) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1191 != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1192 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1193 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1194 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1195 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1196 found: |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1197 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1198 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1199 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1200 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1201 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1202 return NGX_OK; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1203 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1204 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1205 |
455 | 1206 /* |
1207 * add the server address, the server names and the server core module | |
1208 * configurations to the port (in_port) | |
1209 */ | |
1210 | |
499 | 1211 static ngx_int_t |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1212 ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1213 ngx_http_conf_in_port_t *in_port, ngx_http_listen_t *listen) |
455 | 1214 { |
593 | 1215 ngx_http_conf_in_addr_t *in_addr; |
455 | 1216 |
1217 if (in_port->addrs.elts == NULL) { | |
593 | 1218 if (ngx_array_init(&in_port->addrs, cf->temp_pool, 4, |
1385 | 1219 sizeof(ngx_http_conf_in_addr_t)) |
1220 != NGX_OK) | |
455 | 1221 { |
1222 return NGX_ERROR; | |
1223 } | |
1224 } | |
1225 | |
501 | 1226 in_addr = ngx_array_push(&in_port->addrs); |
1227 if (in_addr == NULL) { | |
455 | 1228 return NGX_ERROR; |
1229 } | |
1230 | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1231 in_addr->addr = listen->addr; |
593 | 1232 in_addr->hash.buckets = NULL; |
1233 in_addr->hash.size = 0; | |
1253
8ef04207c84f
the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents:
1236
diff
changeset
|
1234 in_addr->wc_head = NULL; |
8ef04207c84f
the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents:
1236
diff
changeset
|
1235 in_addr->wc_tail = NULL; |
455 | 1236 in_addr->names.elts = NULL; |
1387 | 1237 #if (NGX_PCRE) |
1238 in_addr->nregex = 0; | |
1239 in_addr->regex = NULL; | |
1240 #endif | |
455 | 1241 in_addr->core_srv_conf = cscf; |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1242 in_addr->default_server = listen->conf.default_server; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1243 in_addr->bind = listen->conf.bind; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1244 in_addr->listen_conf = &listen->conf; |
455 | 1245 |
1246 #if (NGX_DEBUG) | |
1247 { | |
1248 u_char text[20]; | |
1249 ngx_inet_ntop(AF_INET, &in_addr->addr, text, 20); | |
1250 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, cf->log, 0, "address: %s:%d", | |
1251 text, in_port->port); | |
1252 } | |
1253 #endif | |
1254 | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1255 return ngx_http_add_names(cf, cscf, in_addr); |
455 | 1256 } |
1257 | |
1258 | |
1259 /* | |
1260 * add the server names and the server core module | |
1261 * configurations to the address:port (in_addr) | |
1262 */ | |
1263 | |
499 | 1264 static ngx_int_t |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1265 ngx_http_add_names(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1266 ngx_http_conf_in_addr_t *in_addr) |
455 | 1267 { |
2135 | 1268 ngx_uint_t i; |
455 | 1269 ngx_http_server_name_t *server_names, *name; |
1270 | |
1271 if (in_addr->names.elts == NULL) { | |
593 | 1272 if (ngx_array_init(&in_addr->names, cf->temp_pool, 4, |
1385 | 1273 sizeof(ngx_http_server_name_t)) |
1274 != NGX_OK) | |
477 | 1275 { |
1276 return NGX_ERROR; | |
1277 } | |
1278 } | |
1279 | |
455 | 1280 server_names = cscf->server_names.elts; |
1387 | 1281 |
455 | 1282 for (i = 0; i < cscf->server_names.nelts; i++) { |
1283 | |
2135 | 1284 ngx_strlow(server_names[i].name.data, server_names[i].name.data, |
1285 server_names[i].name.len); | |
477 | 1286 |
455 | 1287 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, cf->log, 0, |
461 | 1288 "name: %V", &server_names[i].name); |
455 | 1289 |
593 | 1290 name = ngx_array_push(&in_addr->names); |
501 | 1291 if (name == NULL) { |
455 | 1292 return NGX_ERROR; |
1293 } | |
1294 | |
1295 *name = server_names[i]; | |
1296 } | |
1297 | |
1298 return NGX_OK; | |
1299 } | |
1300 | |
1301 | |
1956
cb8c0c8e0c27
use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents:
1910
diff
changeset
|
1302 static ngx_int_t |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1303 ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1304 ngx_array_t *in_ports) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1305 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1306 ngx_int_t rc; |
2042
6389d4accacf
fix building without PCRE introduced in r2023
Igor Sysoev <igor@sysoev.ru>
parents:
2039
diff
changeset
|
1307 ngx_uint_t s, p, a; |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1308 ngx_hash_init_t hash; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1309 ngx_http_server_name_t *name; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1310 ngx_hash_keys_arrays_t ha; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1311 ngx_http_conf_in_port_t *in_port; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1312 ngx_http_conf_in_addr_t *in_addr; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1313 #if (NGX_PCRE) |
2042
6389d4accacf
fix building without PCRE introduced in r2023
Igor Sysoev <igor@sysoev.ru>
parents:
2039
diff
changeset
|
1314 ngx_uint_t regex, i; |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1315 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1316 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1317 in_port = in_ports->elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1318 for (p = 0; p < in_ports->nelts; p++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1319 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1320 ngx_sort(in_port[p].addrs.elts, (size_t) in_port[p].addrs.nelts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1321 sizeof(ngx_http_conf_in_addr_t), ngx_http_cmp_conf_in_addrs); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1322 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1323 /* |
2029
c036922f6f07
*) remove optimize_host_names
Igor Sysoev <igor@sysoev.ru>
parents:
2027
diff
changeset
|
1324 * check whether all name-based servers have |
c036922f6f07
*) remove optimize_host_names
Igor Sysoev <igor@sysoev.ru>
parents:
2027
diff
changeset
|
1325 * the same configuraiton as the default server |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1326 */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1327 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1328 in_addr = in_port[p].addrs.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1329 for (a = 0; a < in_port[p].addrs.nelts; a++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1330 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1331 name = in_addr[a].names.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1332 for (s = 0; s < in_addr[a].names.nelts; s++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1333 |
2029
c036922f6f07
*) remove optimize_host_names
Igor Sysoev <igor@sysoev.ru>
parents:
2027
diff
changeset
|
1334 if (in_addr[a].core_srv_conf != name[s].core_srv_conf) { |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1335 goto virtual_names; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1336 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1337 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1338 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1339 /* |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1340 * if all name-based servers have the same configuration |
2029
c036922f6f07
*) remove optimize_host_names
Igor Sysoev <igor@sysoev.ru>
parents:
2027
diff
changeset
|
1341 * as the default server, then we do not need to check |
c036922f6f07
*) remove optimize_host_names
Igor Sysoev <igor@sysoev.ru>
parents:
2027
diff
changeset
|
1342 * them at run-time at all |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1343 */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1344 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1345 in_addr[a].names.nelts = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1346 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1347 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1348 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1349 virtual_names: |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1350 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1351 ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t)); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1352 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1353 ha.temp_pool = ngx_create_pool(16384, cf->log); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1354 if (ha.temp_pool == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1355 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1356 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1357 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1358 ha.pool = cf->pool; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1359 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1360 if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1361 goto failed; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1362 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1363 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1364 #if (NGX_PCRE) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1365 regex = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1366 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1367 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1368 name = in_addr[a].names.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1369 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1370 for (s = 0; s < in_addr[a].names.nelts; s++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1371 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1372 #if (NGX_PCRE) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1373 if (name[s].regex) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1374 regex++; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1375 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1376 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1377 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1378 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1379 rc = ngx_hash_add_key(&ha, &name[s].name, name[s].core_srv_conf, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1380 NGX_HASH_WILDCARD_KEY); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1381 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1382 if (rc == NGX_ERROR) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1383 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1384 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1385 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1386 if (rc == NGX_DECLINED) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1387 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1388 "invalid server name or wildcard \"%V\" on %s", |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1389 &name[s].name, in_addr[a].listen_conf->addr); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1390 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1391 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1392 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1393 if (rc == NGX_BUSY) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1394 ngx_log_error(NGX_LOG_WARN, cf->log, 0, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1395 "conflicting server name \"%V\" on %s, ignored", |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1396 &name[s].name, in_addr[a].listen_conf->addr); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1397 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1398 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1399 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1400 hash.key = ngx_hash_key_lc; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1401 hash.max_size = cmcf->server_names_hash_max_size; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1402 hash.bucket_size = cmcf->server_names_hash_bucket_size; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1403 hash.name = "server_names_hash"; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1404 hash.pool = cf->pool; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1405 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1406 if (ha.keys.nelts) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1407 hash.hash = &in_addr[a].hash; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1408 hash.temp_pool = NULL; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1409 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1410 if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1411 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1412 goto failed; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1413 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1414 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1415 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1416 if (ha.dns_wc_head.nelts) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1417 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1418 ngx_qsort(ha.dns_wc_head.elts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1419 (size_t) ha.dns_wc_head.nelts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1420 sizeof(ngx_hash_key_t), |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1421 ngx_http_cmp_dns_wildcards); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1422 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1423 hash.hash = NULL; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1424 hash.temp_pool = ha.temp_pool; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1425 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1426 if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1427 ha.dns_wc_head.nelts) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1428 != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1429 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1430 goto failed; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1431 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1432 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1433 in_addr[a].wc_head = (ngx_hash_wildcard_t *) hash.hash; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1434 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1435 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1436 if (ha.dns_wc_tail.nelts) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1437 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1438 ngx_qsort(ha.dns_wc_tail.elts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1439 (size_t) ha.dns_wc_tail.nelts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1440 sizeof(ngx_hash_key_t), |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1441 ngx_http_cmp_dns_wildcards); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1442 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1443 hash.hash = NULL; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1444 hash.temp_pool = ha.temp_pool; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1445 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1446 if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1447 ha.dns_wc_tail.nelts) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1448 != NGX_OK) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1449 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1450 goto failed; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1451 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1452 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1453 in_addr[a].wc_tail = (ngx_hash_wildcard_t *) hash.hash; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1454 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1455 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1456 ngx_destroy_pool(ha.temp_pool); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1457 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1458 #if (NGX_PCRE) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1459 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1460 if (regex == 0) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1461 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1462 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1463 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1464 in_addr[a].nregex = regex; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1465 in_addr[a].regex = ngx_palloc(cf->pool, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1466 regex * sizeof(ngx_http_server_name_t)); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1467 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1468 if (in_addr[a].regex == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1469 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1470 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1471 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1472 for (i = 0, s = 0; s < in_addr[a].names.nelts; s++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1473 if (name[s].regex) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1474 in_addr[a].regex[i++] = name[s]; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1475 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1476 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1477 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1478 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1479 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1480 if (ngx_http_init_listening(cf, &in_port[p]) != NGX_OK) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1481 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1482 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1483 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1484 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1485 return NGX_OK; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1486 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1487 failed: |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1488 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1489 ngx_destroy_pool(ha.temp_pool); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1490 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1491 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1492 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1493 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1494 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1495 static ngx_int_t |
593 | 1496 ngx_http_cmp_conf_in_addrs(const void *one, const void *two) |
1497 { | |
1498 ngx_http_conf_in_addr_t *first, *second; | |
1499 | |
1500 first = (ngx_http_conf_in_addr_t *) one; | |
1501 second = (ngx_http_conf_in_addr_t *) two; | |
1502 | |
1503 if (first->addr == INADDR_ANY) { | |
1504 /* the INADDR_ANY must be the last resort, shift it to the end */ | |
1505 return 1; | |
1506 } | |
1507 | |
1508 if (first->bind && !second->bind) { | |
1509 /* shift explicit bind()ed addresses to the start */ | |
1510 return -1; | |
1511 } | |
1512 | |
1513 if (!first->bind && second->bind) { | |
1514 /* shift explicit bind()ed addresses to the start */ | |
1515 return 1; | |
1516 } | |
1517 | |
1518 /* do not sort by default */ | |
1519 | |
1520 return 0; | |
1521 } | |
1522 | |
1523 | |
1524 static int ngx_libc_cdecl | |
1525 ngx_http_cmp_dns_wildcards(const void *one, const void *two) | |
1526 { | |
1527 ngx_hash_key_t *first, *second; | |
1528 | |
1529 first = (ngx_hash_key_t *) one; | |
1530 second = (ngx_hash_key_t *) two; | |
1531 | |
1532 return ngx_strcmp(first->key.data, second->key.data); | |
1533 } | |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1534 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1535 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1536 static ngx_int_t |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1537 ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_in_port_t *in_port) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1538 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1539 ngx_uint_t i, a, last, bind_all, done; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1540 ngx_listening_t *ls; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1541 ngx_http_in_port_t *hip; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1542 ngx_http_conf_in_addr_t *in_addr; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1543 ngx_http_virtual_names_t *vn; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1544 ngx_http_core_loc_conf_t *clcf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1545 ngx_http_core_srv_conf_t *cscf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1546 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1547 in_addr = in_port->addrs.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1548 last = in_port->addrs.nelts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1549 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1550 /* |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1551 * if there is a binding to a "*:port" then we need to bind() |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1552 * to the "*:port" only and ignore other bindings |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1553 */ |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1554 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1555 if (in_addr[last - 1].addr == INADDR_ANY) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1556 in_addr[last - 1].bind = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1557 bind_all = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1558 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1559 } else { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1560 bind_all = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1561 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1562 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1563 a = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1564 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1565 while (a < last) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1566 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1567 if (!bind_all && !in_addr[a].bind) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1568 a++; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1569 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1570 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1571 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1572 ls = ngx_listening_inet_stream_socket(cf, in_addr[a].addr, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1573 in_port->port); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1574 if (ls == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1575 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1576 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1577 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1578 ls->addr_ntop = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1579 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1580 ls->handler = ngx_http_init_connection; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1581 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1582 cscf = in_addr[a].core_srv_conf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1583 ls->pool_size = cscf->connection_pool_size; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1584 ls->post_accept_timeout = cscf->client_header_timeout; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1585 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1586 clcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index]; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1587 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1588 ls->log = *clcf->err_log; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1589 ls->log.data = &ls->addr_text; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1590 ls->log.handler = ngx_accept_log_error; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1591 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1592 #if (NGX_WIN32) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1593 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1594 ngx_iocp_conf_t *iocpcf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1595 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1596 iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1597 if (iocpcf->acceptex_read) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1598 ls->post_accept_buffer_size = cscf->client_header_buffer_size; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1599 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1600 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1601 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1602 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1603 ls->backlog = in_addr[a].listen_conf->backlog; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1604 ls->rcvbuf = in_addr[a].listen_conf->rcvbuf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1605 ls->sndbuf = in_addr[a].listen_conf->sndbuf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1606 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1607 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1608 ls->accept_filter = in_addr[a].listen_conf->accept_filter; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1609 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1610 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1611 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1612 ls->deferred_accept = in_addr[a].listen_conf->deferred_accept; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1613 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1614 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1615 hip = ngx_palloc(cf->pool, sizeof(ngx_http_in_port_t)); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1616 if (hip == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1617 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1618 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1619 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1620 hip->port = in_port->port; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1621 |
2049 | 1622 hip->port_text.data = ngx_pnalloc(cf->pool, 7); |
2022
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1623 if (hip->port_text.data == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1624 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1625 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1626 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1627 ls->servers = hip; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1628 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1629 hip->port_text.len = ngx_sprintf(hip->port_text.data, ":%d", hip->port) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1630 - hip->port_text.data; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1631 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1632 in_addr = in_port->addrs.elts; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1633 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1634 if (in_addr[a].bind && in_addr[a].addr != INADDR_ANY) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1635 hip->naddrs = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1636 done = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1637 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1638 } else if (in_port->addrs.nelts > 1 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1639 && in_addr[last - 1].addr == INADDR_ANY) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1640 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1641 hip->naddrs = last; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1642 done = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1643 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1644 } else { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1645 hip->naddrs = 1; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1646 done = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1647 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1648 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1649 hip->addrs = ngx_pcalloc(cf->pool, |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1650 hip->naddrs * sizeof(ngx_http_in_addr_t)); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1651 if (hip->addrs == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1652 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1653 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1654 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1655 for (i = 0; i < hip->naddrs; i++) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1656 hip->addrs[i].addr = in_addr[i].addr; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1657 hip->addrs[i].core_srv_conf = in_addr[i].core_srv_conf; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1658 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1659 if (in_addr[i].hash.buckets == NULL |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1660 && (in_addr[i].wc_head == NULL |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1661 || in_addr[i].wc_head->hash.buckets == NULL) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1662 && (in_addr[i].wc_head == NULL |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1663 || in_addr[i].wc_head->hash.buckets == NULL)) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1664 { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1665 continue; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1666 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1667 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1668 vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t)); |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1669 if (vn == NULL) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1670 return NGX_ERROR; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1671 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1672 hip->addrs[i].virtual_names = vn; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1673 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1674 vn->names.hash = in_addr[i].hash; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1675 vn->names.wc_head = in_addr[i].wc_head; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1676 vn->names.wc_tail = in_addr[i].wc_tail; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1677 #if (NGX_PCRE) |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1678 vn->nregex = in_addr[i].nregex; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1679 vn->regex = in_addr[i].regex; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1680 #endif |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1681 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1682 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1683 if (done) { |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1684 return NGX_OK; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1685 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1686 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1687 in_addr++; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1688 in_port->addrs.elts = in_addr; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1689 last--; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1690 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1691 a = 0; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1692 } |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1693 |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1694 return NGX_OK; |
35b35b84f5ef
split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents:
2021
diff
changeset
|
1695 } |
2138 | 1696 |
1697 | |
1698 char * | |
1699 ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1700 { | |
1701 char *p = conf; | |
1702 | |
1703 ngx_array_t **types; | |
1704 ngx_str_t *value, *default_type; | |
1705 ngx_uint_t i, n, hash; | |
1706 ngx_hash_key_t *type; | |
1707 | |
1708 types = (ngx_array_t **) (p + cmd->offset); | |
1709 | |
1710 default_type = cmd->post; | |
1711 | |
1712 if (*types == NULL) { | |
1713 *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t)); | |
1714 if (*types == NULL) { | |
1715 return NGX_CONF_ERROR; | |
1716 } | |
1717 | |
1718 if (default_type) { | |
1719 type = ngx_array_push(*types); | |
1720 if (type == NULL) { | |
1721 return NGX_CONF_ERROR; | |
1722 } | |
1723 | |
1724 type->key = *default_type; | |
1725 type->key_hash = ngx_hash_key(default_type->data, | |
1726 default_type->len); | |
1727 type->value = (void *) 4; | |
1728 } | |
1729 } | |
1730 | |
1731 value = cf->args->elts; | |
1732 | |
1733 for (i = 1; i < cf->args->nelts; i++) { | |
1734 | |
1735 hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len); | |
1736 value[i].data[value[i].len] = '\0'; | |
1737 | |
1738 type = (*types)->elts; | |
1739 for (n = 0; n < (*types)->nelts; n++) { | |
1740 | |
1741 if (ngx_strcmp(value[i].data, type[n].key.data) == 0) { | |
1742 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | |
1743 "duplicate MIME type \"%V\"", &value[i]); | |
1744 continue; | |
1745 } | |
1746 } | |
1747 | |
1748 type = ngx_array_push(*types); | |
1749 if (type == NULL) { | |
1750 return NGX_CONF_ERROR; | |
1751 } | |
1752 | |
1753 type->key = value[i]; | |
1754 type->key_hash = hash; | |
1755 type->value = (void *) 4; | |
1756 } | |
1757 | |
1758 return NGX_CONF_OK; | |
1759 } | |
1760 | |
1761 | |
1762 char * | |
1763 ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t *keys, ngx_hash_t *types_hash, | |
1764 ngx_array_t *prev_keys, ngx_hash_t *prev_types_hash, | |
1765 ngx_str_t *default_types) | |
1766 { | |
1767 ngx_hash_init_t hash; | |
1768 | |
1769 if (keys == NULL) { | |
1770 | |
1771 if (prev_keys) { | |
1772 *types_hash = *prev_types_hash; | |
1773 return NGX_CONF_OK; | |
1774 } | |
1775 | |
1776 if (ngx_http_set_default_types(cf, &keys, default_types) | |
1777 != NGX_CONF_OK) | |
1778 { | |
1779 return NGX_CONF_ERROR; | |
1780 } | |
1781 } | |
1782 | |
1783 hash.hash = types_hash; | |
1784 hash.key = NULL; | |
1785 hash.max_size = 2048; | |
1786 hash.bucket_size = 64; | |
1787 hash.name = "test_types_hash"; | |
1788 hash.pool = cf->pool; | |
1789 hash.temp_pool = NULL; | |
1790 | |
1791 if (ngx_hash_init(&hash, keys->elts, keys->nelts) != NGX_OK) { | |
1792 return NGX_CONF_ERROR; | |
1793 } | |
1794 | |
1795 return NGX_CONF_OK; | |
1796 | |
1797 } | |
1798 | |
1799 | |
1800 char * | |
1801 ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types, | |
1802 ngx_str_t *default_type) | |
1803 { | |
1804 ngx_hash_key_t *type; | |
1805 | |
1806 *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t)); | |
1807 if (*types == NULL) { | |
1808 return NGX_CONF_ERROR; | |
1809 } | |
1810 | |
1811 while (default_type->len) { | |
1812 | |
1813 type = ngx_array_push(*types); | |
1814 if (type == NULL) { | |
1815 return NGX_CONF_ERROR; | |
1816 } | |
1817 | |
1818 type->key = *default_type; | |
1819 type->key_hash = ngx_hash_key(default_type->data, | |
1820 default_type->len); | |
1821 type->value = (void *) 4; | |
1822 | |
1823 default_type++; | |
1824 } | |
1825 | |
1826 return NGX_CONF_OK; | |
1827 } |