annotate src/http/ngx_http.c @ 4034:e2c075e774b6

Cache size accounting fix: actual cache size on disk was less than needed by sum of sizes of files loaded by worker processes themselves while cache loader was running. The bug has been introduced in r3900.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 25 Aug 2011 17:29:34 +0000
parents 3770119af0b5
children 59b99f217c6d d3568507db51
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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>
2
ffffe1499bce nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
ffffe1499bce nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
11
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
12 static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
13 static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
14 ngx_http_core_main_conf_t *cmcf);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
15 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
16 ngx_http_core_main_conf_t *cmcf);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
17 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
18 ngx_http_core_main_conf_t *cmcf);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
19
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
20 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
21 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
22 ngx_http_listen_opt_t *lsopt);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
23 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
24 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
25 ngx_http_listen_opt_t *lsopt);
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
26 static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
27 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
28
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
29 static char *ngx_http_merge_servers(ngx_conf_t *cf,
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
30 ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
31 ngx_uint_t ctx_index);
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 368
diff changeset
32 static char *ngx_http_merge_locations(ngx_conf_t *cf,
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
33 ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
34 ngx_uint_t ctx_index);
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
35 static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
36 ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
37 static ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
38 ngx_http_core_loc_conf_t *pclcf);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
39 static ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
40 const ngx_queue_t *two);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
41 static ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
42 ngx_queue_t *locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
43 static void ngx_http_create_locations_list(ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
44 ngx_queue_t *q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
45 static ngx_http_location_tree_node_t *
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
46 ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
47 size_t prefix);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
48
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
49 static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
50 ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
51 static ngx_int_t ngx_http_server_names(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
52 ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
53 static ngx_int_t ngx_http_cmp_conf_addrs(const void *one, const void *two);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
54 static int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one,
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
55 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
56
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
57 static ngx_int_t ngx_http_init_listening(ngx_conf_t *cf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
58 ngx_http_conf_port_t *port);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
59 static ngx_listening_t *ngx_http_add_listening(ngx_conf_t *cf,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
60 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
61 static ngx_int_t ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
62 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
63 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
64 static ngx_int_t ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
65 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
66 #endif
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
67
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
68 ngx_uint_t ngx_http_max_module;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
69
45
f1ee46c036a4 nginx-0.0.1-2003-01-10-09:09:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
70
356
2e3cbc1bbe3c nginx-0.0.7-2004-06-16-19:32:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 311
diff changeset
71 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
72 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
73
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
74
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
75 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
76 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
77 ngx_null_string
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
78 };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
79
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
80
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
81 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
82
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
83 { ngx_string("http"),
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
84 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
85 ngx_http_block,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
86 0,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
87 0,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
88 NULL },
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
89
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
90 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
91 };
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
92
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
93
311
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
94 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
95 ngx_string("http"),
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
96 NULL,
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
97 NULL
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
98 };
311
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
99
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
100
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
101 ngx_module_t ngx_http_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
102 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
103 &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
104 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
105 NGX_CORE_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
106 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
107 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
108 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
109 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
110 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
111 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
112 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
113 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
114 };
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
115
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
116
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
117 static char *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
118 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
119 {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
120 char *rv;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
121 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
122 ngx_conf_t pcf;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
123 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
124 ngx_http_conf_ctx_t *ctx;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
125 ngx_http_core_loc_conf_t *clcf;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
126 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
127 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
128
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
129 /* the main http context */
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
130
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
131 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
132 if (ctx == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
133 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
134 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
135
90
37530da31268 nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
136 *(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
137
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
138
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
139 /* 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
140
71
59229033ae93 nginx-0.0.1-2003-04-08-19:40:10 import
Igor Sysoev <igor@sysoev.ru>
parents: 69
diff changeset
141 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
142 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
143 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
144 continue;
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
145 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
146
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
147 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
148 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
149
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
150
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
151 /* 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
152
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
153 ctx->main_conf = ngx_pcalloc(cf->pool,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
154 sizeof(void *) * ngx_http_max_module);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
155 if (ctx->main_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
156 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
157 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
158
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
159
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
160 /*
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
161 * the http null srv_conf context, it is used to merge
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
162 * the server{}s' srv_conf's
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
163 */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
164
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
165 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
166 if (ctx->srv_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
167 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
168 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
169
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
170
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
171 /*
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
172 * the http null loc_conf context, it is used to merge
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
173 * the server{}s' loc_conf's
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
174 */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
175
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
176 ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
177 if (ctx->loc_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
178 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
179 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
180
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
181
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
182 /*
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
183 * create the main_conf's, the null srv_conf's, and the null loc_conf's
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
184 * of the all http modules
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
185 */
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
186
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
187 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
188 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
189 continue;
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
190 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
191
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
192 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
193 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
194
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
195 if (module->create_main_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
196 ctx->main_conf[mi] = module->create_main_conf(cf);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
197 if (ctx->main_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
198 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
199 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
200 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
201
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
202 if (module->create_srv_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
203 ctx->srv_conf[mi] = module->create_srv_conf(cf);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
204 if (ctx->srv_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
205 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
206 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
207 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
208
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
209 if (module->create_loc_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
210 ctx->loc_conf[mi] = module->create_loc_conf(cf);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
211 if (ctx->loc_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
212 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
213 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
214 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
215 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
216
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
217 pcf = *cf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
218 cf->ctx = ctx;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
219
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
220 for (m = 0; ngx_modules[m]; m++) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
221 if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
222 continue;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
223 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
224
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
225 module = ngx_modules[m]->ctx;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
226
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
227 if (module->preconfiguration) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
228 if (module->preconfiguration(cf) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
229 return NGX_CONF_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
230 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
231 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
232 }
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
233
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
234 /* 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
235
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
236 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
237 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
238 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
239
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
240 if (rv != NGX_CONF_OK) {
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
241 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
242 }
54
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
243
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
244 /*
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
245 * 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
246 * 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
247 */
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
248
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
249 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
250 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
251
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
252 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
253 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
254 continue;
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
98
c9b243802a17 nginx-0.0.1-2003-05-30-18:27:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
257 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
258 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
259
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
260 /* 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
261
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
262 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
263 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
264 if (rv != NGX_CONF_OK) {
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
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
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
269 rv = ngx_http_merge_servers(cf, cmcf, module, mi);
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
270 if (rv != NGX_CONF_OK) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
271 goto failed;
54
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
272 }
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
273 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
274
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
275
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
276 /* create location trees */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
277
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
278 for (s = 0; s < cmcf->servers.nelts; s++) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
279
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
280 clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
281
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
282 if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
283 return NGX_CONF_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
284 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
285
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
286 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
287 return NGX_CONF_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
288 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
289 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
290
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
291
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
292 if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
293 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
294 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
295
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
296 if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) {
649
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
297 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
298 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
299
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
300
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
301 for (m = 0; ngx_modules[m]; m++) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
302 if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
303 continue;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
304 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
305
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
306 module = ngx_modules[m]->ctx;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
307
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
308 if (module->postconfiguration) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
309 if (module->postconfiguration(cf) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
310 return NGX_CONF_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
311 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
312 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
313 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
314
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
315 if (ngx_http_variables_init_vars(cf) != NGX_OK) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
316 return NGX_CONF_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
317 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
318
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
319 /*
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
320 * http{}'s cf->ctx was needed while the configuration merging
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
321 * and in postconfiguration process
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
322 */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
323
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
324 *cf = pcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
325
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
326
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
327 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
328 return NGX_CONF_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
329 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
330
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
331
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
332 /* 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
333
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
334 if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
335 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
336 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
337
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
338 return NGX_CONF_OK;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
339
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
340 failed:
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
341
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
342 *cf = pcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
343
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
344 return rv;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
345 }
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 368
diff changeset
346
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 368
diff changeset
347
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
348 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
349 ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
350 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
351 if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
352 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
353 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
354 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
355 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
356 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
357
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
358 if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
359 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
360 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
361 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
362 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
363 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
364
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
365 if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
366 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
367 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
368 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
369 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
370 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
371
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
372 if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
373 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
374 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
375 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
376 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
377 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
378
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
379 if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
380 cf->pool, 2, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
381 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
382 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
383 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
384 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
385
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
386 if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
387 cf->pool, 4, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
388 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
389 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
390 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
391 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
392
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
393 if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
394 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
395 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
396 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
397 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
398 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
399
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
400 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
401 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
402
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
403
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
404 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
405 ngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
406 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
407 ngx_array_t headers_in;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
408 ngx_hash_key_t *hk;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
409 ngx_hash_init_t hash;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
410 ngx_http_header_t *header;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
411
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
412 if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
413 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
414 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
415 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
416 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
417
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
418 for (header = ngx_http_headers_in; header->name.len; header++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
419 hk = ngx_array_push(&headers_in);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
420 if (hk == NULL) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
421 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
422 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
423
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
424 hk->key = header->name;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
425 hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
426 hk->value = header;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
427 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
428
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
429 hash.hash = &cmcf->headers_in_hash;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
430 hash.key = ngx_hash_key_lc;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
431 hash.max_size = 512;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
432 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
433 hash.name = "headers_in_hash";
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
434 hash.pool = cf->pool;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
435 hash.temp_pool = NULL;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
436
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
437 if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
438 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
439 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
440
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
441 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
442 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
443
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
444
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
445 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
446 ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
447 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
448 ngx_int_t j;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
449 ngx_uint_t i, n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
450 ngx_uint_t find_config_index, use_rewrite, use_access;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
451 ngx_http_handler_pt *h;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
452 ngx_http_phase_handler_t *ph;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
453 ngx_http_phase_handler_pt checker;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
454
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
455 cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
456 cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
457 find_config_index = 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
458 use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
459 use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
460
2407
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
461 n = use_rewrite + use_access + cmcf->try_files + 1 /* find config phase */;
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
462
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
463 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
464 n += cmcf->phases[i].handlers.nelts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
465 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
466
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
467 ph = ngx_pcalloc(cf->pool,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
468 n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
469 if (ph == NULL) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
470 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
471 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
472
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
473 cmcf->phase_engine.handlers = ph;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
474 n = 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
475
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
476 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
477 h = cmcf->phases[i].handlers.elts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
478
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
479 switch (i) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
480
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
481 case NGX_HTTP_SERVER_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
482 if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
483 cmcf->phase_engine.server_rewrite_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
484 }
3633
187783310b65 return code text
Igor Sysoev <igor@sysoev.ru>
parents: 3395
diff changeset
485 checker = ngx_http_core_rewrite_phase;
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
486
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
487 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
488
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
489 case NGX_HTTP_FIND_CONFIG_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
490 find_config_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
491
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
492 ph->checker = ngx_http_core_find_config_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
493 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
494 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
495
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
496 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
497
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
498 case NGX_HTTP_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
499 if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
500 cmcf->phase_engine.location_rewrite_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
501 }
3633
187783310b65 return code text
Igor Sysoev <igor@sysoev.ru>
parents: 3395
diff changeset
502 checker = ngx_http_core_rewrite_phase;
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
503
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
504 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
505
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
506 case NGX_HTTP_POST_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
507 if (use_rewrite) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
508 ph->checker = ngx_http_core_post_rewrite_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
509 ph->next = find_config_index;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
510 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
511 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
512 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
513
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
514 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
515
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
516 case NGX_HTTP_ACCESS_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
517 checker = ngx_http_core_access_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
518 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
519 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
520
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
521 case NGX_HTTP_POST_ACCESS_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
522 if (use_access) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
523 ph->checker = ngx_http_core_post_access_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
524 ph->next = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
525 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
526 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
527
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
528 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
529
2407
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
530 case NGX_HTTP_TRY_FILES_PHASE:
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
531 if (cmcf->try_files) {
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
532 ph->checker = ngx_http_core_try_files_phase;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
533 n++;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
534 ph++;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
535 }
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
536
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
537 continue;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
538
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
539 case NGX_HTTP_CONTENT_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
540 checker = ngx_http_core_content_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
541 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
542
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
543 default:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
544 checker = ngx_http_core_generic_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
545 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
546
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
547 n += cmcf->phases[i].handlers.nelts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
548
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
549 for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
550 ph->checker = checker;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
551 ph->handler = h[j];
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
552 ph->next = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
553 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
554 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
555 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
556
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
557 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
558 }
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
559
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
560
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
561 static char *
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
562 ngx_http_merge_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
563 ngx_http_module_t *module, ngx_uint_t ctx_index)
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
564 {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
565 char *rv;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
566 ngx_uint_t s;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
567 ngx_http_conf_ctx_t *ctx, saved;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
568 ngx_http_core_loc_conf_t *clcf;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
569 ngx_http_core_srv_conf_t **cscfp;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
570
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
571 cscfp = cmcf->servers.elts;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
572 ctx = (ngx_http_conf_ctx_t *) cf->ctx;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
573 saved = *ctx;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
574 rv = NGX_CONF_OK;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
575
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
576 for (s = 0; s < cmcf->servers.nelts; s++) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
577
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
578 /* merge the server{}s' srv_conf's */
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
579
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
580 ctx->srv_conf = cscfp[s]->ctx->srv_conf;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
581
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
582 if (module->merge_srv_conf) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
583 rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
584 cscfp[s]->ctx->srv_conf[ctx_index]);
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
585 if (rv != NGX_CONF_OK) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
586 goto failed;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
587 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
588 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
589
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
590 if (module->merge_loc_conf) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
591
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
592 /* merge the server{}'s loc_conf */
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
593
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
594 ctx->loc_conf = cscfp[s]->ctx->loc_conf;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
595
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
596 rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
597 cscfp[s]->ctx->loc_conf[ctx_index]);
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
598 if (rv != NGX_CONF_OK) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
599 goto failed;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
600 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
601
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
602 /* merge the locations{}' loc_conf's */
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
603
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
604 clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
605
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
606 rv = ngx_http_merge_locations(cf, clcf->locations,
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
607 cscfp[s]->ctx->loc_conf,
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
608 module, ctx_index);
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
609 if (rv != NGX_CONF_OK) {
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
610 goto failed;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
611 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
612 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
613 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
614
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
615 failed:
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
616
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
617 *ctx = saved;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
618
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
619 return rv;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
620 }
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
621
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
622
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
623 static char *
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
624 ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
625 void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
626 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
627 char *rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
628 ngx_queue_t *q;
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
629 ngx_http_conf_ctx_t *ctx, saved;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
630 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
631 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
632
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
633 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
634 return NGX_CONF_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
635 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
636
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
637 ctx = (ngx_http_conf_ctx_t *) cf->ctx;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
638 saved = *ctx;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
639
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
640 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
641 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
642 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
643 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
644 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
645
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
646 clcf = lq->exact ? lq->exact : lq->inclusive;
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
647 ctx->loc_conf = clcf->loc_conf;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
648
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
649 rv = module->merge_loc_conf(cf, loc_conf[ctx_index],
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
650 clcf->loc_conf[ctx_index]);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
651 if (rv != NGX_CONF_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
652 return rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
653 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
654
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
655 rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
656 module, ctx_index);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
657 if (rv != NGX_CONF_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
658 return rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
659 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
660 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
661
3730
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
662 *ctx = saved;
d094e237abf4 ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
Igor Sysoev <igor@sysoev.ru>
parents: 3676
diff changeset
663
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
664 return NGX_CONF_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
665 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
666
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
667
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
668 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
669 ngx_http_init_locations(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
670 ngx_http_core_loc_conf_t *pclcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
671 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
672 ngx_uint_t n;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
673 ngx_queue_t *q, *locations, *named, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
674 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
675 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
676 ngx_http_core_loc_conf_t **clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
677 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
678 ngx_uint_t r;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
679 ngx_queue_t *regex;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
680 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
681
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
682 locations = pclcf->locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
683
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
684 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
685 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
686 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
687
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
688 ngx_queue_sort(locations, ngx_http_cmp_locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
689
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
690 named = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
691 n = 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
692 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
693 regex = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
694 r = 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
695 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
696
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
697 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
698 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
699 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
700 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
701 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
702
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
703 clcf = lq->exact ? lq->exact : lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
704
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
705 if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
706 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
707 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
708
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
709 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
710
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
711 if (clcf->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
712 r++;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
713
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
714 if (regex == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
715 regex = q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
716 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
717
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
718 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
719 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
720
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
721 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
722
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
723 if (clcf->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
724 n++;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
725
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
726 if (named == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
727 named = q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
728 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
729
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
730 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
731 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
732
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
733 if (clcf->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
734 break;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
735 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
736 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
737
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
738 if (q != ngx_queue_sentinel(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
739 ngx_queue_split(locations, q, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
740 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
741
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
742 if (named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
743 clcfp = ngx_palloc(cf->pool,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
744 (n + 1) * sizeof(ngx_http_core_loc_conf_t **));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
745 if (clcfp == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
746 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
747 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
748
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
749 cscf->named_locations = clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
750
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
751 for (q = named;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
752 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
753 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
754 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
755 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
756
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
757 *(clcfp++) = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
758 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
759
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
760 *clcfp = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
761
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
762 ngx_queue_split(locations, named, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
763 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
764
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
765 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
766
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
767 if (regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
768
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
769 clcfp = ngx_palloc(cf->pool,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
770 (r + 1) * sizeof(ngx_http_core_loc_conf_t **));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
771 if (clcfp == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
772 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
773 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
774
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
775 pclcf->regex_locations = clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
776
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
777 for (q = regex;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
778 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
779 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
780 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
781 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
782
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
783 *(clcfp++) = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
784 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
785
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
786 *clcfp = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
787
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
788 ngx_queue_split(locations, regex, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
789 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
790
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
791 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
792
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
793 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
794 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
795
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
796
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
797 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
798 ngx_http_init_static_location_trees(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
799 ngx_http_core_loc_conf_t *pclcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
800 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
801 ngx_queue_t *q, *locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
802 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
803 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
804
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
805 locations = pclcf->locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
806
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
807 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
808 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
809 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
810
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
811 if (ngx_queue_empty(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
812 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
813 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
814
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
815 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
816 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
817 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
818 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
819 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
820
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
821 clcf = lq->exact ? lq->exact : lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
822
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
823 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
824 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
825 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
826 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
827
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
828 if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
829 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
830 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
831
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
832 ngx_http_create_locations_list(locations, ngx_queue_head(locations));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
833
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
834 pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
835 if (pclcf->static_locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
836 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
837 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
838
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
839 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
840 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
841
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
842
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
843 ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
844 ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
845 ngx_http_core_loc_conf_t *clcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
846 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
847 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
848
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
849 if (*locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
850 *locations = ngx_palloc(cf->temp_pool,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
851 sizeof(ngx_http_location_queue_t));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
852 if (*locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
853 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
854 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
855
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
856 ngx_queue_init(*locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
857 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
858
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
859 lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
860 if (lq == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
861 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
862 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
863
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
864 if (clcf->exact_match
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
865 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
866 || clcf->regex
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
867 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
868 || clcf->named || clcf->noname)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
869 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
870 lq->exact = clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
871 lq->inclusive = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
872
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
873 } else {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
874 lq->exact = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
875 lq->inclusive = clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
876 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
877
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
878 lq->name = &clcf->name;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
879 lq->file_name = cf->conf_file->file.name.data;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
880 lq->line = cf->conf_file->line;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
881
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
882 ngx_queue_init(&lq->list);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
883
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
884 ngx_queue_insert_tail(*locations, &lq->queue);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
885
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
886 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
887 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
888
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
889
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
890 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
891 ngx_http_cmp_locations(const ngx_queue_t *one, const ngx_queue_t *two)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
892 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
893 ngx_int_t rc;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
894 ngx_http_core_loc_conf_t *first, *second;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
895 ngx_http_location_queue_t *lq1, *lq2;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
896
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
897 lq1 = (ngx_http_location_queue_t *) one;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
898 lq2 = (ngx_http_location_queue_t *) two;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
899
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
900 first = lq1->exact ? lq1->exact : lq1->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
901 second = lq2->exact ? lq2->exact : lq2->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
902
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
903 if (first->noname && !second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
904 /* shift no named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
905 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
906 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
907
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
908 if (!first->noname && second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
909 /* shift no named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
910 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
911 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
912
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
913 if (first->noname || second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
914 /* do not sort no named locations */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
915 return 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
916 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
917
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
918 if (first->named && !second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
919 /* shift named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
920 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
921 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
922
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
923 if (!first->named && second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
924 /* shift named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
925 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
926 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
927
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
928 if (first->named && second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
929 return ngx_strcmp(first->name.data, second->name.data);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
930 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
931
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
932 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
933
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
934 if (first->regex && !second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
935 /* shift the regex matches to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
936 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
937 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
938
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
939 if (!first->regex && second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
940 /* shift the regex matches to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
941 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
942 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
943
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
944 if (first->regex || second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
945 /* do not sort the regex matches */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
946 return 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
947 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
948
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
949 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
950
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
951 rc = ngx_strcmp(first->name.data, second->name.data);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
952
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
953 if (rc == 0 && !first->exact_match && second->exact_match) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
954 /* an exact match must be before the same inclusive one */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
955 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
956 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
957
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
958 return rc;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
959 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
960
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
961
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
962 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
963 ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
964 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
965 ngx_queue_t *q, *x;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
966 ngx_http_location_queue_t *lq, *lx;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
967
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
968 q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
969
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
970 while (q != ngx_queue_last(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
971
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
972 x = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
973
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
974 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
975 lx = (ngx_http_location_queue_t *) x;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
976
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
977 if (ngx_strcmp(lq->name->data, lx->name->data) == 0) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
978
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
979 if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
980 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
981 "duplicate location \"%V\" in %s:%ui",
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
982 lx->name, lx->file_name, lx->line);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
983
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
984 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
985 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
986
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
987 lq->inclusive = lx->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
988
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
989 ngx_queue_remove(x);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
990
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
991 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
992 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
993
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
994 q = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
995 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
996
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
997 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
998 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
999
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1000
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1001 static void
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1002 ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1003 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1004 u_char *name;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1005 size_t len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1006 ngx_queue_t *x, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1007 ngx_http_location_queue_t *lq, *lx;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1008
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1009 if (q == ngx_queue_last(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1010 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1011 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1012
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1013 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1014
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1015 if (lq->inclusive == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1016 ngx_http_create_locations_list(locations, ngx_queue_next(q));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1017 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1018 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1019
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1020 len = lq->name->len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1021 name = lq->name->data;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1022
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1023 for (x = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1024 x != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1025 x = ngx_queue_next(x))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1026 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1027 lx = (ngx_http_location_queue_t *) x;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1028
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1029 if (len > lx->name->len
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1030 || (ngx_strncmp(name, lx->name->data, len) != 0))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1031 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1032 break;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1033 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1034 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1035
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1036 q = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1037
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1038 if (q == x) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1039 ngx_http_create_locations_list(locations, x);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1040 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1041 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1042
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1043 ngx_queue_split(locations, q, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1044 ngx_queue_add(&lq->list, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1045
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1046 if (x == ngx_queue_sentinel(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1047 ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1048 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1049 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1050
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1051 ngx_queue_split(&lq->list, x, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1052 ngx_queue_add(locations, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1053
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1054 ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1055
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1056 ngx_http_create_locations_list(locations, x);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1057 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1058
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1059
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1060 /*
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1061 * to keep cache locality for left leaf nodes, allocate nodes in following
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1062 * order: node, left subtree, right subtree, inclusive subtree
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1063 */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1064
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1065 static ngx_http_location_tree_node_t *
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1066 ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1067 size_t prefix)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1068 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1069 size_t len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1070 ngx_queue_t *q, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1071 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1072 ngx_http_location_tree_node_t *node;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1073
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1074 q = ngx_queue_middle(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1075
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1076 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1077 len = lq->name->len - prefix;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1078
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2042
diff changeset
1079 node = ngx_palloc(cf->pool,
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2042
diff changeset
1080 offsetof(ngx_http_location_tree_node_t, name) + len);
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1081 if (node == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1082 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1083 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1084
2039
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1085 node->left = NULL;
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1086 node->right = NULL;
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1087 node->tree = NULL;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1088 node->exact = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1089 node->inclusive = lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1090
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1091 node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1092 || (lq->inclusive && lq->inclusive->auto_redirect));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1093
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1094 node->len = (u_char) len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1095 ngx_memcpy(node->name, &lq->name->data[prefix], len);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1096
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1097 ngx_queue_split(locations, q, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1098
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1099 if (ngx_queue_empty(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1100 /*
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1101 * ngx_queue_split() insures that if left part is empty,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1102 * then right one is empty too
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1103 */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1104 goto inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1105 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1106
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1107 node->left = ngx_http_create_locations_tree(cf, locations, prefix);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1108 if (node->left == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1109 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1110 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1111
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1112 ngx_queue_remove(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1113
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1114 if (ngx_queue_empty(&tail)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1115 goto inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1116 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1117
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1118 node->right = ngx_http_create_locations_tree(cf, &tail, prefix);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1119 if (node->right == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1120 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1121 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1122
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1123 inclusive:
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1124
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1125 if (ngx_queue_empty(&lq->list)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1126 return node;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1127 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1128
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1129 node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1130 if (node->tree == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1131 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1132 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1133
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1134 return node;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1135 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1136
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1137
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1138 ngx_int_t
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1139 ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1140 ngx_http_listen_opt_t *lsopt)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1141 {
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1142 in_port_t p;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1143 ngx_uint_t i;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1144 struct sockaddr *sa;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1145 struct sockaddr_in *sin;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1146 ngx_http_conf_port_t *port;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1147 ngx_http_core_main_conf_t *cmcf;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1148 #if (NGX_HAVE_INET6)
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1149 struct sockaddr_in6 *sin6;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1150 #endif
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1151
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1152 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1153
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1154 if (cmcf->ports == NULL) {
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1155 cmcf->ports = ngx_array_create(cf->temp_pool, 2,
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1156 sizeof(ngx_http_conf_port_t));
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1157 if (cmcf->ports == NULL) {
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1158 return NGX_ERROR;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1159 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1160 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1161
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1162 sa = &lsopt->u.sockaddr;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1163
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1164 switch (sa->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1165
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1166 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1167 case AF_INET6:
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1168 sin6 = &lsopt->u.sockaddr_in6;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1169 p = sin6->sin6_port;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1170 break;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1171 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1172
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1173 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1174 case AF_UNIX:
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1175 p = 0;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1176 break;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1177 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1178
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1179 default: /* AF_INET */
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1180 sin = &lsopt->u.sockaddr_in;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1181 p = sin->sin_port;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1182 break;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1183 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1184
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1185 port = cmcf->ports->elts;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1186 for (i = 0; i < cmcf->ports->nelts; i++) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1187
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1188 if (p != port[i].port || sa->sa_family != port[i].family) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1189 continue;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1190 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1191
2852
dfe04af9d30b update comments missed in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2851
diff changeset
1192 /* a port is already in the port list */
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1193
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1194 return ngx_http_add_addresses(cf, cscf, &port[i], lsopt);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1195 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1196
2852
dfe04af9d30b update comments missed in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2851
diff changeset
1197 /* add a port to the port list */
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1198
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1199 port = ngx_array_push(cmcf->ports);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1200 if (port == NULL) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1201 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1202 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1203
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1204 port->family = sa->sa_family;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1205 port->port = p;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1206 port->addrs.elts = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1207
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1208 return ngx_http_add_address(cf, cscf, port, lsopt);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1209 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1210
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1211
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1212 static ngx_int_t
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1213 ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1214 ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1215 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1216 u_char *p;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1217 size_t len, off;
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1218 ngx_uint_t i, default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1219 struct sockaddr *sa;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1220 ngx_http_conf_addr_t *addr;
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1221 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1222 struct sockaddr_un *saun;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1223 #endif
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1224 #if (NGX_HTTP_SSL)
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1225 ngx_uint_t ssl;
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1226 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1227
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1228 /*
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1229 * we can not compare whole sockaddr struct's as kernel
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1230 * may fill some fields in inherited sockaddr struct's
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1231 */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1232
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1233 sa = &lsopt->u.sockaddr;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1234
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1235 switch (sa->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1236
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1237 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1238 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1239 off = offsetof(struct sockaddr_in6, sin6_addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1240 len = 16;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1241 break;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1242 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1243
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1244 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1245 case AF_UNIX:
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1246 off = offsetof(struct sockaddr_un, sun_path);
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1247 len = sizeof(saun->sun_path);
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1248 break;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1249 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 3229
diff changeset
1250
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1251 default: /* AF_INET */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1252 off = offsetof(struct sockaddr_in, sin_addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1253 len = 4;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1254 break;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1255 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1256
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1257 p = lsopt->u.sockaddr_data + off;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1258
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1259 addr = port->addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1260
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1261 for (i = 0; i < port->addrs.nelts; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1262
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1263 if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1264 continue;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1265 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1266
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1267 /* the address is already in the address list */
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1268
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1269 if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1270 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1271 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1272
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1273 /* preserve default_server bit during listen options overwriting */
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1274 default_server = addr[i].opt.default_server;
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1275
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1276 #if (NGX_HTTP_SSL)
3768
098cd8119861 nginx uses SSL mode for a listen socket with any option set,
Igor Sysoev <igor@sysoev.ru>
parents: 3764
diff changeset
1277 ssl = lsopt->ssl || addr[i].opt.ssl;
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1278 #endif
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1279
3226
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1280 if (lsopt->set) {
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1281
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1282 if (addr[i].opt.set) {
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1283 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3224
8e76e636ae3b allow to set listen options in any server
Igor Sysoev <igor@sysoev.ru>
parents: 3223
diff changeset
1284 "a duplicate listen options for %s", addr[i].opt.addr);
3226
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1285 return NGX_ERROR;
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1286 }
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1287
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1288 addr[i].opt = *lsopt;
3224
8e76e636ae3b allow to set listen options in any server
Igor Sysoev <igor@sysoev.ru>
parents: 3223
diff changeset
1289 }
8e76e636ae3b allow to set listen options in any server
Igor Sysoev <igor@sysoev.ru>
parents: 3223
diff changeset
1290
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1291 /* check the duplicate "default" server for this address:port */
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1292
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1293 if (lsopt->default_server) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1294
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1295 if (default_server) {
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1296 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3223
bfcc1a6dd184 add listen address in error message
Igor Sysoev <igor@sysoev.ru>
parents: 3221
diff changeset
1297 "a duplicate default server for %s", addr[i].opt.addr);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1298 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1299 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1300
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1301 default_server = 1;
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1302 addr[i].default_server = cscf;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1303 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1304
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1305 addr[i].opt.default_server = default_server;
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1306 #if (NGX_HTTP_SSL)
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1307 addr[i].opt.ssl = ssl;
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1308 #endif
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1309
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1310 return NGX_OK;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1311 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1312
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1313 /* add the address to the addresses list that bound to this port */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1314
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1315 return ngx_http_add_address(cf, cscf, port, lsopt);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1316 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1317
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1318
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1319 /*
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1320 * add the server address, the server names and the server core module
2852
dfe04af9d30b update comments missed in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2851
diff changeset
1321 * configurations to the port list
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1322 */
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1323
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1324 static ngx_int_t
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1325 ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1326 ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1327 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1328 ngx_http_conf_addr_t *addr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1329
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1330 if (port->addrs.elts == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1331 if (ngx_array_init(&port->addrs, cf->temp_pool, 4,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1332 sizeof(ngx_http_conf_addr_t))
1385
4612daca9dc1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1353
diff changeset
1333 != NGX_OK)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1334 {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1335 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1336 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1337 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1338
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1339 addr = ngx_array_push(&port->addrs);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1340 if (addr == NULL) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1341 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1342 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1343
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1344 addr->opt = *lsopt;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1345 addr->hash.buckets = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1346 addr->hash.size = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1347 addr->wc_head = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1348 addr->wc_tail = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1349 #if (NGX_PCRE)
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1350 addr->nregex = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1351 addr->regex = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1352 #endif
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1353 addr->default_server = cscf;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1354 addr->servers.elts = NULL;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1355
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1356 return ngx_http_add_server(cf, cscf, addr);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1357 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1358
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1359
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1360 /* add the server core module configuration to the address:port */
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1361
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1362 static ngx_int_t
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1363 ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1364 ngx_http_conf_addr_t *addr)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1365 {
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1366 ngx_uint_t i;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1367 ngx_http_core_srv_conf_t **server;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1368
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1369 if (addr->servers.elts == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1370 if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1371 sizeof(ngx_http_core_srv_conf_t *))
1385
4612daca9dc1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1353
diff changeset
1372 != NGX_OK)
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1373 {
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1374 return NGX_ERROR;
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1375 }
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1376
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1377 } else {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1378 server = addr->servers.elts;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1379 for (i = 0; i < addr->servers.nelts; i++) {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1380 if (server[i] == cscf) {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1381 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1382 "a duplicate listen %s", addr->opt.addr);
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1383 return NGX_ERROR;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1384 }
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1385 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1386 }
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1387
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1388 server = ngx_array_push(&addr->servers);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1389 if (server == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1390 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1391 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1392
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1393 *server = cscf;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1394
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1395 return NGX_OK;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1396 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1397
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1398
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1910
diff changeset
1399 static ngx_int_t
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1400 ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1401 ngx_array_t *ports)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1402 {
3258
77db9440d970 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3257
diff changeset
1403 ngx_uint_t p, a;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1404 ngx_http_conf_port_t *port;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1405 ngx_http_conf_addr_t *addr;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1406
3257
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1407 if (ports == NULL) {
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1408 return NGX_OK;
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1409 }
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1410
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1411 port = ports->elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1412 for (p = 0; p < ports->nelts; p++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1413
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1414 ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1415 sizeof(ngx_http_conf_addr_t), ngx_http_cmp_conf_addrs);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1416
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1417 /*
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1418 * check whether all name-based servers have the same
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1419 * configuraiton as a default server for given address:port
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1420 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1421
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1422 addr = port[p].addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1423 for (a = 0; a < port[p].addrs.nelts; a++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1424
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1425 if (addr[a].servers.nelts > 1
2583
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1426 #if (NGX_PCRE)
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1427 || addr[a].default_server->captures
2583
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1428 #endif
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1429 )
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1430 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1431 if (ngx_http_server_names(cf, cmcf, &addr[a]) != NGX_OK) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1432 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1433 }
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1437 if (ngx_http_init_listening(cf, &port[p]) != NGX_OK) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1438 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1439 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1440 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1441
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1442 return NGX_OK;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1443 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1444
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1445
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1446 static ngx_int_t
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1447 ngx_http_server_names(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1448 ngx_http_conf_addr_t *addr)
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1449 {
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1450 ngx_int_t rc;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1451 ngx_uint_t n, s;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1452 ngx_hash_init_t hash;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1453 ngx_hash_keys_arrays_t ha;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1454 ngx_http_server_name_t *name;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1455 ngx_http_core_srv_conf_t **cscfp;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1456 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1457 ngx_uint_t regex, i;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1458
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1459 regex = 0;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1460 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1461
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1462 ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1463
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1464 ha.temp_pool = ngx_create_pool(16384, cf->log);
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1465 if (ha.temp_pool == NULL) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1466 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1467 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1468
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1469 ha.pool = cf->pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1470
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1471 if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1472 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1473 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1474
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1475 cscfp = addr->servers.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1476
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1477 for (s = 0; s < addr->servers.nelts; s++) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1478
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1479 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1480
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1481 for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1482
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1483 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1484 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1485 regex++;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1486 continue;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1487 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1488 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1489
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1490 rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1491 NGX_HASH_WILDCARD_KEY);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1492
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1493 if (rc == NGX_ERROR) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1494 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1495 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1496
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1497 if (rc == NGX_DECLINED) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1498 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1499 "invalid server name or wildcard \"%V\" on %s",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1500 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1501 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1502 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1503
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1504 if (rc == NGX_BUSY) {
3823
b1add8bfad83 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3768
diff changeset
1505 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1506 "conflicting server name \"%V\" on %s, ignored",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1507 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1508 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1509 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1510 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1512 hash.key = ngx_hash_key_lc;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1513 hash.max_size = cmcf->server_names_hash_max_size;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1514 hash.bucket_size = cmcf->server_names_hash_bucket_size;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1515 hash.name = "server_names_hash";
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1516 hash.pool = cf->pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1517
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1518 if (ha.keys.nelts) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1519 hash.hash = &addr->hash;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1520 hash.temp_pool = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1521
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1522 if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1523 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1524 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1525 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1526
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1527 if (ha.dns_wc_head.nelts) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1528
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1529 ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1530 sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1531
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1532 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1533 hash.temp_pool = ha.temp_pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1534
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1535 if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1536 ha.dns_wc_head.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1537 != NGX_OK)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1538 {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1539 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1540 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1541
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1542 addr->wc_head = (ngx_hash_wildcard_t *) hash.hash;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1543 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1544
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1545 if (ha.dns_wc_tail.nelts) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1546
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1547 ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1548 sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1549
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1550 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1551 hash.temp_pool = ha.temp_pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1552
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1553 if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1554 ha.dns_wc_tail.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1555 != NGX_OK)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1556 {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1557 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1558 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1559
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1560 addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1561 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1562
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1563 ngx_destroy_pool(ha.temp_pool);
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1564
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1565 #if (NGX_PCRE)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1566
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1567 if (regex == 0) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1568 return NGX_OK;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1569 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1570
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1571 addr->nregex = regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1572 addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_http_server_name_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1573 if (addr->regex == NULL) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1574 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1575 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1576
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1577 i = 0;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1578
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1579 for (s = 0; s < addr->servers.nelts; s++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1580
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1581 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1582
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1583 for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1584 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1585 addr->regex[i++] = name[n];
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1586 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1587 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1588 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1589
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1590 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1591
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1592 return NGX_OK;
2022
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 failed:
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 ngx_destroy_pool(ha.temp_pool);
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1597
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1598 return NGX_ERROR;
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
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1602 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1603 ngx_http_cmp_conf_addrs(const void *one, const void *two)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1604 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1605 ngx_http_conf_addr_t *first, *second;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1606
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1607 first = (ngx_http_conf_addr_t *) one;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1608 second = (ngx_http_conf_addr_t *) two;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1609
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1610 if (first->opt.wildcard) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1611 /* a wildcard address must be the last resort, shift it to the end */
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1612 return 1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1613 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1614
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1615 if (first->opt.bind && !second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1616 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1617 return -1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1618 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1619
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1620 if (!first->opt.bind && second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1621 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1622 return 1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1623 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1624
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1625 /* do not sort by default */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1626
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1627 return 0;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1628 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1629
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1630
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1631 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1632 ngx_http_cmp_dns_wildcards(const void *one, const void *two)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1633 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1634 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1635
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1636 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1637 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1638
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2852
diff changeset
1639 return ngx_dns_strcmp(first->key.data, second->key.data);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1640 }
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1641
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1642
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1643 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1644 ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1645 {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1646 ngx_uint_t i, last, bind_wildcard;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1647 ngx_listening_t *ls;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1648 ngx_http_port_t *hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1649 ngx_http_conf_addr_t *addr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1650
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1651 addr = port->addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1652 last = port->addrs.nelts;
2022
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 /*
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1655 * If there is a binding to an "*:port" then we need to bind() to
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1656 * the "*:port" only and ignore other implicit bindings. The bindings
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1657 * have been already sorted: explicit bindings are on the start, then
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1658 * implicit bindings go, and wildcard binding is in the end.
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1659 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1660
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1661 if (addr[last - 1].opt.wildcard) {
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1662 addr[last - 1].opt.bind = 1;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1663 bind_wildcard = 1;
2022
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 } else {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1666 bind_wildcard = 0;
2022
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
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1669 i = 0;
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1670
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1671 while (i < last) {
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1672
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1673 if (bind_wildcard && !addr[i].opt.bind) {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1674 i++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1675 continue;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1676 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1677
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1678 ls = ngx_http_add_listening(cf, &addr[i]);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1679 if (ls == NULL) {
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1680 return NGX_ERROR;
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1683 hport = ngx_pcalloc(cf->pool, sizeof(ngx_http_port_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1684 if (hport == NULL) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1685 return NGX_ERROR;
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1688 ls->servers = hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1689
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1690 if (i == last - 1) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1691 hport->naddrs = last;
2022
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 } else {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1694 hport->naddrs = 1;
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1695 i = 0;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1696 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1697
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1698 switch (ls->sockaddr->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1699
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1700 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1701 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1702 if (ngx_http_add_addrs6(cf, hport, addr) != NGX_OK) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1703 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1704 }
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1705 break;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1706 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1707 default: /* AF_INET */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1708 if (ngx_http_add_addrs(cf, hport, addr) != NGX_OK) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1709 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1710 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1711 break;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1712 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1713
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1714 addr++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1715 last--;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1716 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1717
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1718 return NGX_OK;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1719 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1720
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1721
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1722 static ngx_listening_t *
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1723 ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1724 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1725 ngx_listening_t *ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1726 ngx_http_core_loc_conf_t *clcf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1727 ngx_http_core_srv_conf_t *cscf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1728
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1729 ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1730 if (ls == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1731 return NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1732 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1733
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1734 ls->addr_ntop = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1735
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1736 ls->handler = ngx_http_init_connection;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1737
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1738 cscf = addr->default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1739 ls->pool_size = cscf->connection_pool_size;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1740 ls->post_accept_timeout = cscf->client_header_timeout;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1741
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1742 clcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index];
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1743
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2689
diff changeset
1744 ls->logp = clcf->error_log;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1745 ls->log.data = &ls->addr_text;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1746 ls->log.handler = ngx_accept_log_error;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1747
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1748 #if (NGX_WIN32)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1749 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1750 ngx_iocp_conf_t *iocpcf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1751
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1752 iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1753 if (iocpcf->acceptex_read) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1754 ls->post_accept_buffer_size = cscf->client_header_buffer_size;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1755 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1756 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1757 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1758
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1759 ls->backlog = addr->opt.backlog;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1760 ls->rcvbuf = addr->opt.rcvbuf;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1761 ls->sndbuf = addr->opt.sndbuf;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1762
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1763 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1764 ls->accept_filter = addr->opt.accept_filter;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1765 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1766
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1767 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1768 ls->deferred_accept = addr->opt.deferred_accept;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1769 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1770
2562
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1771 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1772 ls->ipv6only = addr->opt.ipv6only;
2562
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1773 #endif
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1774
3676
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1775 #if (NGX_HAVE_SETFIB)
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1776 ls->setfib = addr->opt.setfib;
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1777 #endif
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1778
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1779 return ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1780 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1781
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1782
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1783 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1784 ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1785 ngx_http_conf_addr_t *addr)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1786 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1787 ngx_uint_t i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1788 ngx_http_in_addr_t *addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1789 struct sockaddr_in *sin;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1790 ngx_http_virtual_names_t *vn;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1791
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1792 hport->addrs = ngx_pcalloc(cf->pool,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1793 hport->naddrs * sizeof(ngx_http_in_addr_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1794 if (hport->addrs == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1795 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1796 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1797
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1798 addrs = hport->addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1799
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1800 for (i = 0; i < hport->naddrs; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1801
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1802 sin = &addr[i].opt.u.sockaddr_in;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1803 addrs[i].addr = sin->sin_addr.s_addr;
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1804 addrs[i].conf.default_server = addr[i].default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1805 #if (NGX_HTTP_SSL)
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1806 addrs[i].conf.ssl = addr[i].opt.ssl;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1807 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1808
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1809 if (addr[i].hash.buckets == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1810 && (addr[i].wc_head == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1811 || addr[i].wc_head->hash.buckets == NULL)
2580
684ca3b0ae14 test wildcard tail hash existance
Igor Sysoev <igor@sysoev.ru>
parents: 2562
diff changeset
1812 && (addr[i].wc_tail == NULL
2583
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1813 || addr[i].wc_tail->hash.buckets == NULL)
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1814 #if (NGX_PCRE)
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1815 && addr[i].nregex == 0
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1816 #endif
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1817 )
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1818 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1819 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1820 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1821
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1822 vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1823 if (vn == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1824 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1825 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1826
2689
6caf687a831f backout r2535: virtual names is a property of address:port pair,
Igor Sysoev <igor@sysoev.ru>
parents: 2688
diff changeset
1827 addrs[i].conf.virtual_names = vn;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1828
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1829 vn->names.hash = addr[i].hash;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1830 vn->names.wc_head = addr[i].wc_head;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1831 vn->names.wc_tail = addr[i].wc_tail;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1832 #if (NGX_PCRE)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1833 vn->nregex = addr[i].nregex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1834 vn->regex = addr[i].regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1835 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1836 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1837
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1838 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1839 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1840
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1841
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1842 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1843
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1844 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1845 ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1846 ngx_http_conf_addr_t *addr)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1847 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1848 ngx_uint_t i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1849 ngx_http_in6_addr_t *addrs6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1850 struct sockaddr_in6 *sin6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1851 ngx_http_virtual_names_t *vn;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1852
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1853 hport->addrs = ngx_pcalloc(cf->pool,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1854 hport->naddrs * sizeof(ngx_http_in6_addr_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1855 if (hport->addrs == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1856 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1857 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1858
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1859 addrs6 = hport->addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1860
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1861 for (i = 0; i < hport->naddrs; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1862
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1863 sin6 = &addr[i].opt.u.sockaddr_in6;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1864 addrs6[i].addr6 = sin6->sin6_addr;
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1865 addrs6[i].conf.default_server = addr[i].default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1866 #if (NGX_HTTP_SSL)
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1867 addrs6[i].conf.ssl = addr[i].opt.ssl;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1868 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1869
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1870 if (addr[i].hash.buckets == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1871 && (addr[i].wc_head == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1872 || addr[i].wc_head->hash.buckets == NULL)
3824
4ee02b872591 test wildcard tail hash existance for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3823
diff changeset
1873 && (addr[i].wc_tail == NULL
3825
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1874 || addr[i].wc_tail->hash.buckets == NULL)
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1875 #if (NGX_PCRE)
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1876 && addr[i].nregex == 0
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1877 #endif
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1878 )
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1879 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1880 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1881 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1882
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1883 vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1884 if (vn == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1885 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1886 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1887
2689
6caf687a831f backout r2535: virtual names is a property of address:port pair,
Igor Sysoev <igor@sysoev.ru>
parents: 2688
diff changeset
1888 addrs6[i].conf.virtual_names = vn;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1889
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1890 vn->names.hash = addr[i].hash;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1891 vn->names.wc_head = addr[i].wc_head;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1892 vn->names.wc_tail = addr[i].wc_tail;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1893 #if (NGX_PCRE)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1894 vn->nregex = addr[i].nregex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1895 vn->regex = addr[i].regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1896 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1897 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1898
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1899 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1900 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1901
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1902 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1903
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1904
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1905 char *
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1906 ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1907 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1908 char *p = conf;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1909
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1910 ngx_array_t **types;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1911 ngx_str_t *value, *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1912 ngx_uint_t i, n, hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1913 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1914
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1915 types = (ngx_array_t **) (p + cmd->offset);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1916
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1917 if (*types == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1918 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1919 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1920
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1921 default_type = cmd->post;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1922
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1923 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1924 *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1925 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1926 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1927 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1928
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1929 if (default_type) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1930 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1931 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1932 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1933 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1934
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1935 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1936 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1937 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1938 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1939 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1940 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1941
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1942 value = cf->args->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1943
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1944 for (i = 1; i < cf->args->nelts; i++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1945
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1946 if (value[i].len == 1 && value[i].data[0] == '*') {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1947 *types = (void *) -1;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1948 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1949 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1950
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1951 hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1952 value[i].data[value[i].len] = '\0';
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1953
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1954 type = (*types)->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1955 for (n = 0; n < (*types)->nelts; n++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1956
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1957 if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1958 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1959 "duplicate MIME type \"%V\"", &value[i]);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1960 continue;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1961 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1962 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1963
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1964 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1965 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1966 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1967 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1968
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1969 type->key = value[i];
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1970 type->key_hash = hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1971 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1972 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1973
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1974 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1975 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1976
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1977
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1978 char *
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1979 ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys, ngx_hash_t *types_hash,
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1980 ngx_array_t **prev_keys, ngx_hash_t *prev_types_hash,
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1981 ngx_str_t *default_types)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1982 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1983 ngx_hash_init_t hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1984
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1985 if (*keys) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1986
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1987 if (*keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1988 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1989 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1990
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1991 hash.hash = types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1992 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1993 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1994 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1995 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1996 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1997 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1998
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1999 if (ngx_hash_init(&hash, (*keys)->elts, (*keys)->nelts) != NGX_OK) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2000 return NGX_CONF_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2001 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2002
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2003 return NGX_CONF_OK;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2004 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2005
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2006 if (prev_types_hash->buckets == NULL) {
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2007
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2008 if (*prev_keys == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2009
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2010 if (ngx_http_set_default_types(cf, prev_keys, default_types)
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2011 != NGX_OK)
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2012 {
2223
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2013 return NGX_CONF_ERROR;
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2014 }
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2015
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2016 } else if (*prev_keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2017 *keys = *prev_keys;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2018 return NGX_CONF_OK;
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2019 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2020
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2021 hash.hash = prev_types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2022 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2023 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2024 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2025 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2026 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2027 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2028
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2029 if (ngx_hash_init(&hash, (*prev_keys)->elts, (*prev_keys)->nelts)
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2030 != NGX_OK)
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2031 {
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2032 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2033 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2034 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2035
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2036 *types_hash = *prev_types_hash;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2037
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2038 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2039
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2040 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2041
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2042
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2043 ngx_int_t
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2044 ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2045 ngx_str_t *default_type)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2046 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2047 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2048
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2049 *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2050 if (*types == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2051 return NGX_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2052 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2053
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2054 while (default_type->len) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2055
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2056 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2057 if (type == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2058 return NGX_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2059 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2060
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2061 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2062 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2063 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2064 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2065
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2066 default_type++;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2067 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2068
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2069 return NGX_OK;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2070 }