annotate src/http/ngx_http.c @ 6719:cebf5fed00bf

Modules compatibility: removed unneeded IPV6_V6ONLY checks. The IPV6_V6ONLY macro is now checked only while parsing appropriate flag and when using the macro. The ipv6only field in listen structures is always initialized to 1, even if not supported on a given platform. This is expected to prevent a module compiled without IPV6_V6ONLY from accidentally creating dual sockets if loaded into main binary with proper IPV6_V6ONLY support.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 03 Oct 2016 15:58:25 +0300
parents b3b7e33083ac
children 666b2bea3cb9
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4323
diff changeset
4 * Copyright (C) Nginx, Inc.
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
5 */
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
6
2
ffffe1499bce nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents: 2
diff changeset
8 #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
9 #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
10 #include <ngx_http.h>
ffffe1499bce nginx-0.0.1-2002-08-16-19:27:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
12
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
13 static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
14 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
15 ngx_http_core_main_conf_t *cmcf);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
16 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
17 ngx_http_core_main_conf_t *cmcf);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
18 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
19 ngx_http_core_main_conf_t *cmcf);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
20
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
21 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
22 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
23 ngx_http_listen_opt_t *lsopt);
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
24 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
25 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
26 ngx_http_listen_opt_t *lsopt);
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
27 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
28 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
29
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
30 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
31 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
32 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
33 static char *ngx_http_merge_locations(ngx_conf_t *cf,
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
34 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
35 ngx_uint_t ctx_index);
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
36 static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
37 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
38 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
39 ngx_http_core_loc_conf_t *pclcf);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
40 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
41 const ngx_queue_t *two);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
42 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
43 ngx_queue_t *locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
44 static void ngx_http_create_locations_list(ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
45 ngx_queue_t *q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
46 static ngx_http_location_tree_node_t *
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
47 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
48 size_t prefix);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
49
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
50 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
51 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
52 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
53 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
54 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
55 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
56 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
57
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
58 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
59 ngx_http_conf_port_t *port);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
60 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
61 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
62 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
63 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
64 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
65 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
66 ngx_http_conf_addr_t *addr);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
67 #endif
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
68
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
69 ngx_uint_t ngx_http_max_module;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
70
45
f1ee46c036a4 nginx-0.0.1-2003-01-10-09:09:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
71
6049
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5856
diff changeset
72 ngx_http_output_header_filter_pt ngx_http_top_header_filter;
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5856
diff changeset
73 ngx_http_output_body_filter_pt ngx_http_top_body_filter;
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5856
diff changeset
74 ngx_http_request_body_filter_pt ngx_http_top_request_body_filter;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
75
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
76
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
77 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
78 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
79 ngx_null_string
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
80 };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
81
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2138
diff changeset
82
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
83 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
84
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
85 { ngx_string("http"),
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
86 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
87 ngx_http_block,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
88 0,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
89 0,
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
90 NULL },
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
91
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
92 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
93 };
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
94
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
95
311
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
96 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
97 ngx_string("http"),
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
98 NULL,
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
99 NULL
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
100 };
311
11ff50a35d6d nginx-0.0.3-2004-04-12-20:38:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
101
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
102
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
103 ngx_module_t ngx_http_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
104 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
105 &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
106 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
107 NGX_CORE_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
108 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
109 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
110 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
111 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
112 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
113 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
114 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 523
diff changeset
115 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
116 };
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
117
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
118
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
119 static char *
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
120 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
121 {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 417
diff changeset
122 char *rv;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
123 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
124 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
125 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
126 ngx_http_conf_ctx_t *ctx;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
127 ngx_http_core_loc_conf_t *clcf;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
128 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
129 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
130
6193
78c06e5e1d76 Disabled duplicate http, mail, and stream blocks.
Vladimir Homutov <vl@nginx.com>
parents: 6153
diff changeset
131 if (*(ngx_http_conf_ctx_t **) conf) {
78c06e5e1d76 Disabled duplicate http, mail, and stream blocks.
Vladimir Homutov <vl@nginx.com>
parents: 6153
diff changeset
132 return "is duplicate";
78c06e5e1d76 Disabled duplicate http, mail, and stream blocks.
Vladimir Homutov <vl@nginx.com>
parents: 6153
diff changeset
133 }
78c06e5e1d76 Disabled duplicate http, mail, and stream blocks.
Vladimir Homutov <vl@nginx.com>
parents: 6153
diff changeset
134
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
135 /* the main http context */
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
136
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
137 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
138 if (ctx == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
139 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
140 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
141
90
37530da31268 nginx-0.0.1-2003-05-16-19:27:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 89
diff changeset
142 *(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
143
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
144
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
145 /* 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
146
6378
0f203a2af17c Dynamic modules: moved module-related stuff to separate files.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6331
diff changeset
147 ngx_http_max_module = ngx_count_modules(cf->cycle, 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
148
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
149
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
150 /* 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
151
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
152 ctx->main_conf = ngx_pcalloc(cf->pool,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
153 sizeof(void *) * ngx_http_max_module);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
154 if (ctx->main_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
155 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
156 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
157
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
158
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
159 /*
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
160 * 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
161 * the server{}s' srv_conf's
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
162 */
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 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
165 if (ctx->srv_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
166 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
167 }
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 * 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
172 * the server{}s' loc_conf's
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
173 */
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 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
176 if (ctx->loc_conf == NULL) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
177 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
178 }
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 * 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
183 * of the all http modules
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
184 */
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
185
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
186 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
187 if (cf->cycle->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
188 continue;
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
189 }
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
190
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
191 module = cf->cycle->modules[m]->ctx;
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
192 mi = cf->cycle->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
193
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
194 if (module->create_main_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
195 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
196 if (ctx->main_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
197 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
198 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
199 }
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 if (module->create_srv_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
202 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
203 if (ctx->srv_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
204 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
205 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
206 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
207
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
208 if (module->create_loc_conf) {
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
209 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
210 if (ctx->loc_conf[mi] == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
211 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
212 }
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
213 }
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
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
216 pcf = *cf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
217 cf->ctx = ctx;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
218
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
219 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
220 if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
221 continue;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
222 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
223
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
224 module = cf->cycle->modules[m]->ctx;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
225
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
226 if (module->preconfiguration) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
227 if (module->preconfiguration(cf) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
228 return NGX_CONF_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
229 }
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 }
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
232
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
233 /* 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
234
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
235 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
236 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
237 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
238
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
239 if (rv != NGX_CONF_OK) {
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
240 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
241 }
54
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
242
176
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
243 /*
c0552e5ab567 nginx-0.0.1-2003-11-09-23:03:38 import; separate building
Igor Sysoev <igor@sysoev.ru>
parents: 144
diff changeset
244 * 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
245 * 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
246 */
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
247
96
a23d010f356d nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 95
diff changeset
248 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
249 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
250
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
251 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
252 if (cf->cycle->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
253 continue;
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
254 }
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
255
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
256 module = cf->cycle->modules[m]->ctx;
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
257 mi = cf->cycle->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
258
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
259 /* 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
260
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
261 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
262 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
263 if (rv != NGX_CONF_OK) {
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
264 goto failed;
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
265 }
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
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
268 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
269 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
270 goto failed;
54
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
271 }
27b628ef907e nginx-0.0.1-2003-01-28-18:56:37 import
Igor Sysoev <igor@sysoev.ru>
parents: 45
diff changeset
272 }
91
637625a2acdb nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents: 90
diff changeset
273
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
274
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
275 /* create location trees */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
276
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
277 for (s = 0; s < cmcf->servers.nelts; s++) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
278
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
279 clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
280
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
281 if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
282 return NGX_CONF_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
283 }
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 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
286 return NGX_CONF_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
287 }
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
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
291 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
292 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
293 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 477
diff changeset
294
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
295 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
296 return NGX_CONF_ERROR;
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
297 }
1e720b0be7ec nginx-0.3.46-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
298
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
299
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
300 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
301 if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
302 continue;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
303 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
304
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6378
diff changeset
305 module = cf->cycle->modules[m]->ctx;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
306
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
307 if (module->postconfiguration) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
308 if (module->postconfiguration(cf) != NGX_OK) {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
309 return NGX_CONF_ERROR;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
310 }
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
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
314 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
315 return NGX_CONF_ERROR;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
316 }
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
317
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 * 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
320 * and in postconfiguration process
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
321 */
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 *cf = pcf;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 507
diff changeset
324
507
cd3117ad9aab nginx-0.1.28-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
325
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
326 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
327 return NGX_CONF_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
328 }
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
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
331 /* 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
332
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
333 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
334 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
335 }
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 return NGX_CONF_OK;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
338
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
339 failed:
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
340
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
341 *cf = pcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
342
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
343 return rv;
44
0e81ac0bb3e2 nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 41
diff changeset
344 }
396
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 368
diff changeset
345
6f3b20c1ac50 nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 368
diff changeset
346
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
347 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
348 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
349 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
350 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
351 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
352 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
353 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
354 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
355 }
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 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
358 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
359 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
360 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
361 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
362 }
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 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
365 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
366 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
367 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
368 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
369 }
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 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
372 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
373 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
374 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
375 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
376 }
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 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
379 cf->pool, 2, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
380 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
381 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
382 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
383 }
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 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
386 cf->pool, 4, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
387 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
388 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
389 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
390 }
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 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
393 cf->pool, 1, sizeof(ngx_http_handler_pt))
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
394 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
395 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
396 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
397 }
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 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
400 }
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 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
404 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
405 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
406 ngx_array_t headers_in;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
407 ngx_hash_key_t *hk;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
408 ngx_hash_init_t hash;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
409 ngx_http_header_t *header;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
410
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
411 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
412 != NGX_OK)
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
413 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
414 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
415 }
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 for (header = ngx_http_headers_in; header->name.len; header++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
418 hk = ngx_array_push(&headers_in);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
419 if (hk == NULL) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
420 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
421 }
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 hk->key = header->name;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
424 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
425 hk->value = header;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
426 }
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 hash.hash = &cmcf->headers_in_hash;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
429 hash.key = ngx_hash_key_lc;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
430 hash.max_size = 512;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
431 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
432 hash.name = "headers_in_hash";
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
433 hash.pool = cf->pool;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
434 hash.temp_pool = NULL;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
435
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
436 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
437 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
438 }
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 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
441 }
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 static ngx_int_t
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
445 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
446 {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
447 ngx_int_t j;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
448 ngx_uint_t i, n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
449 ngx_uint_t find_config_index, use_rewrite, use_access;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
450 ngx_http_handler_pt *h;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
451 ngx_http_phase_handler_t *ph;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
452 ngx_http_phase_handler_pt checker;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
453
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
454 cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
455 cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
456 find_config_index = 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
457 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
458 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
459
2407
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
460 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
461
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
462 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
463 n += cmcf->phases[i].handlers.nelts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
464 }
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 ph = ngx_pcalloc(cf->pool,
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
467 n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
468 if (ph == NULL) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
469 return NGX_ERROR;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
470 }
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 cmcf->phase_engine.handlers = ph;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
473 n = 0;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
474
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
475 for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
476 h = cmcf->phases[i].handlers.elts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
477
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
478 switch (i) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
479
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
480 case NGX_HTTP_SERVER_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
481 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
482 cmcf->phase_engine.server_rewrite_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
483 }
3633
187783310b65 return code text
Igor Sysoev <igor@sysoev.ru>
parents: 3395
diff changeset
484 checker = ngx_http_core_rewrite_phase;
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
485
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
486 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
487
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
488 case NGX_HTTP_FIND_CONFIG_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
489 find_config_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
490
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
491 ph->checker = ngx_http_core_find_config_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
492 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
493 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
494
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
495 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
496
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
497 case NGX_HTTP_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
498 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
499 cmcf->phase_engine.location_rewrite_index = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
500 }
3633
187783310b65 return code text
Igor Sysoev <igor@sysoev.ru>
parents: 3395
diff changeset
501 checker = ngx_http_core_rewrite_phase;
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
502
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
503 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
504
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
505 case NGX_HTTP_POST_REWRITE_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
506 if (use_rewrite) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
507 ph->checker = ngx_http_core_post_rewrite_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
508 ph->next = find_config_index;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
509 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
510 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
511 }
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 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
514
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
515 case NGX_HTTP_ACCESS_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
516 checker = ngx_http_core_access_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
517 n++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
518 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
519
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
520 case NGX_HTTP_POST_ACCESS_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
521 if (use_access) {
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
522 ph->checker = ngx_http_core_post_access_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
523 ph->next = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
524 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
525 }
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 continue;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
528
2407
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
529 case NGX_HTTP_TRY_FILES_PHASE:
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
530 if (cmcf->try_files) {
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
531 ph->checker = ngx_http_core_try_files_phase;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
532 n++;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
533 ph++;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
534 }
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 continue;
16d1236bc298 try_files
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
537
2021
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
538 case NGX_HTTP_CONTENT_PHASE:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
539 checker = ngx_http_core_content_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
540 break;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
541
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
542 default:
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
543 checker = ngx_http_core_generic_phase;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
544 }
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 n += cmcf->phases[i].handlers.nelts;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
547
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
548 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
549 ph->checker = checker;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
550 ph->handler = h[j];
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
551 ph->next = n;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
552 ph++;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
553 }
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 return NGX_OK;
2022e71d26d2 split ngx_http_block()
Igor Sysoev <igor@sysoev.ru>
parents: 2020
diff changeset
557 }
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
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
560 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
561 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
562 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
563 {
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 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
565 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
566 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
567 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
568 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
569
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 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
571 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
572 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
573 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
574
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 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
576
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 /* 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
578
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 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
580
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 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
582 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
583 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
584 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
585 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
586 }
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 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
590
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 /* 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
592
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 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
594
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 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
596 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
597 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
598 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
599 }
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 /* 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
602
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 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
604
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 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
606 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
607 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
608 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
609 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
610 }
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 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
615
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 *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
617
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 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
619 }
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 static char *
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
623 ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
624 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
625 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
626 char *rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
627 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
628 ngx_http_conf_ctx_t *ctx, saved;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
629 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
630 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
631
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
632 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
633 return NGX_CONF_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
634 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
635
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
636 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
637 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
638
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
639 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
640 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
641 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
642 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
643 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
644
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
645 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
646 ctx->loc_conf = clcf->loc_conf;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
647
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
648 rv = module->merge_loc_conf(cf, loc_conf[ctx_index],
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
649 clcf->loc_conf[ctx_index]);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
650 if (rv != NGX_CONF_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
651 return rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
652 }
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 rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
655 module, ctx_index);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
656 if (rv != NGX_CONF_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
657 return rv;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
658 }
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
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
661 *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
662
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
663 return NGX_CONF_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
664 }
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 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
668 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
669 ngx_http_core_loc_conf_t *pclcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
670 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
671 ngx_uint_t n;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
672 ngx_queue_t *q, *locations, *named, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
673 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
674 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
675 ngx_http_core_loc_conf_t **clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
676 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
677 ngx_uint_t r;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
678 ngx_queue_t *regex;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
679 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
680
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
681 locations = pclcf->locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
682
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
683 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
684 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
685 }
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 ngx_queue_sort(locations, ngx_http_cmp_locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
688
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
689 named = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
690 n = 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
691 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
692 regex = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
693 r = 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
694 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
695
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
696 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
697 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
698 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
699 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
700 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
701
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
702 clcf = lq->exact ? lq->exact : lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
703
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
704 if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
705 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
706 }
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 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
709
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
710 if (clcf->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
711 r++;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
712
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
713 if (regex == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
714 regex = q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
715 }
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 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
718 }
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 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
721
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
722 if (clcf->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
723 n++;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
724
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
725 if (named == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
726 named = q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
727 }
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 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
730 }
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 if (clcf->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
733 break;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
734 }
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 if (q != ngx_queue_sentinel(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
738 ngx_queue_split(locations, q, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
739 }
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 if (named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
742 clcfp = ngx_palloc(cf->pool,
5741
b490bfbf8cfa Fixed wrong sizeof() in ngx_http_init_locations().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5605
diff changeset
743 (n + 1) * sizeof(ngx_http_core_loc_conf_t *));
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
744 if (clcfp == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
745 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
746 }
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 cscf->named_locations = clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
749
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
750 for (q = named;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
751 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
752 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
753 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
754 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
755
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
756 *(clcfp++) = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
757 }
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 *clcfp = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
760
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
761 ngx_queue_split(locations, named, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
762 }
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 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
765
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
766 if (regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
767
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
768 clcfp = ngx_palloc(cf->pool,
5741
b490bfbf8cfa Fixed wrong sizeof() in ngx_http_init_locations().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5605
diff changeset
769 (r + 1) * sizeof(ngx_http_core_loc_conf_t *));
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
770 if (clcfp == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
771 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
772 }
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 pclcf->regex_locations = clcfp;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
775
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
776 for (q = regex;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
777 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
778 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
779 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
780 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
781
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
782 *(clcfp++) = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
783 }
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 *clcfp = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
786
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
787 ngx_queue_split(locations, regex, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
788 }
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 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
791
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
792 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
793 }
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 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
797 ngx_http_init_static_location_trees(ngx_conf_t *cf,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
798 ngx_http_core_loc_conf_t *pclcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
799 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
800 ngx_queue_t *q, *locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
801 ngx_http_core_loc_conf_t *clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
802 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
803
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
804 locations = pclcf->locations;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
805
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
806 if (locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
807 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
808 }
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 if (ngx_queue_empty(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
811 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
812 }
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 for (q = ngx_queue_head(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
815 q != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
816 q = ngx_queue_next(q))
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
817 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
818 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
819
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
820 clcf = lq->exact ? lq->exact : lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
821
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
822 if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
823 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
824 }
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 if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
828 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
829 }
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 ngx_http_create_locations_list(locations, ngx_queue_head(locations));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
832
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
833 pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
834 if (pclcf->static_locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
835 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
836 }
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 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
839 }
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 ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
843 ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
844 ngx_http_core_loc_conf_t *clcf)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
845 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
846 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
847
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
848 if (*locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
849 *locations = ngx_palloc(cf->temp_pool,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
850 sizeof(ngx_http_location_queue_t));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
851 if (*locations == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
852 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
853 }
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 ngx_queue_init(*locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
856 }
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 lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
859 if (lq == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
860 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
861 }
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 if (clcf->exact_match
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
864 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
865 || clcf->regex
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
866 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
867 || clcf->named || clcf->noname)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
868 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
869 lq->exact = clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
870 lq->inclusive = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
871
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
872 } else {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
873 lq->exact = NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
874 lq->inclusive = clcf;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
875 }
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 lq->name = &clcf->name;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
878 lq->file_name = cf->conf_file->file.name.data;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
879 lq->line = cf->conf_file->line;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
880
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
881 ngx_queue_init(&lq->list);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
882
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
883 ngx_queue_insert_tail(*locations, &lq->queue);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
884
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
885 return NGX_OK;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
886 }
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 static ngx_int_t
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
890 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
891 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
892 ngx_int_t rc;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
893 ngx_http_core_loc_conf_t *first, *second;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
894 ngx_http_location_queue_t *lq1, *lq2;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
895
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
896 lq1 = (ngx_http_location_queue_t *) one;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
897 lq2 = (ngx_http_location_queue_t *) two;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
898
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
899 first = lq1->exact ? lq1->exact : lq1->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
900 second = lq2->exact ? lq2->exact : lq2->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
901
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
902 if (first->noname && !second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
903 /* shift no named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
904 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
905 }
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 if (!first->noname && second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
908 /* shift no named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
909 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
910 }
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 if (first->noname || second->noname) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
913 /* do not sort no named locations */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
914 return 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
915 }
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 if (first->named && !second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
918 /* shift named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
919 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
920 }
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 if (!first->named && second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
923 /* shift named locations to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
924 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
925 }
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 if (first->named && second->named) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
928 return ngx_strcmp(first->name.data, second->name.data);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
929 }
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 #if (NGX_PCRE)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
932
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
933 if (first->regex && !second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
934 /* shift the regex matches to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
935 return 1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
936 }
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 if (!first->regex && second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
939 /* shift the regex matches to the end */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
940 return -1;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
941 }
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 if (first->regex || second->regex) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
944 /* do not sort the regex matches */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
945 return 0;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
946 }
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 #endif
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
949
5388
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
950 rc = ngx_filename_cmp(first->name.data, second->name.data,
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
951 ngx_min(first->name.len, second->name.len) + 1);
2027
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
5388
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
977 if (lq->name->len == lx->name->len
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
978 && ngx_filename_cmp(lq->name->data, lx->name->data, lx->name->len)
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
979 == 0)
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
980 {
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
981 if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
982 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
983 "duplicate location \"%V\" in %s:%ui",
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
984 lx->name, lx->file_name, lx->line);
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 return NGX_ERROR;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
987 }
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 lq->inclusive = lx->inclusive;
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 ngx_queue_remove(x);
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 continue;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
994 }
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 q = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
997 }
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 return NGX_OK;
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
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1002
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1003 static void
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1004 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
1005 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1006 u_char *name;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1007 size_t len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1008 ngx_queue_t *x, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1009 ngx_http_location_queue_t *lq, *lx;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1010
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1011 if (q == ngx_queue_last(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1012 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1013 }
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 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1016
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1017 if (lq->inclusive == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1018 ngx_http_create_locations_list(locations, ngx_queue_next(q));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1019 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1020 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1021
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1022 len = lq->name->len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1023 name = lq->name->data;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1024
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1025 for (x = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1026 x != ngx_queue_sentinel(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1027 x = ngx_queue_next(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 lx = (ngx_http_location_queue_t *) x;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1030
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1031 if (len > lx->name->len
5388
fbaae7d1c033 Caseless location tree construction (ticket #90).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
1032 || ngx_filename_cmp(name, lx->name->data, len) != 0)
2027
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 break;
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 }
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 q = ngx_queue_next(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1039
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1040 if (q == x) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1041 ngx_http_create_locations_list(locations, x);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1042 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1043 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1044
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1045 ngx_queue_split(locations, q, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1046 ngx_queue_add(&lq->list, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1047
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1048 if (x == ngx_queue_sentinel(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1049 ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1050 return;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1051 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1052
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1053 ngx_queue_split(&lq->list, x, &tail);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1054 ngx_queue_add(locations, &tail);
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(&lq->list, ngx_queue_head(&lq->list));
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 ngx_http_create_locations_list(locations, x);
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
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1062 /*
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1063 * to keep cache locality for left leaf nodes, allocate nodes in following
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1064 * order: node, left subtree, right subtree, inclusive subtree
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1065 */
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1066
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1067 static ngx_http_location_tree_node_t *
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1068 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
1069 size_t prefix)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1070 {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1071 size_t len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1072 ngx_queue_t *q, tail;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1073 ngx_http_location_queue_t *lq;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1074 ngx_http_location_tree_node_t *node;
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 q = ngx_queue_middle(locations);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1077
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1078 lq = (ngx_http_location_queue_t *) q;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1079 len = lq->name->len - prefix;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1080
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2042
diff changeset
1081 node = ngx_palloc(cf->pool,
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2042
diff changeset
1082 offsetof(ngx_http_location_tree_node_t, name) + len);
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1083 if (node == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1084 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1085 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1086
2039
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1087 node->left = NULL;
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1088 node->right = NULL;
4d8140271204 *) add ngx_palloc_aligned() to allocate explicitlty aligned memory
Igor Sysoev <igor@sysoev.ru>
parents: 2029
diff changeset
1089 node->tree = NULL;
2027
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1090 node->exact = lq->exact;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1091 node->inclusive = lq->inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1092
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1093 node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect)
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1094 || (lq->inclusive && lq->inclusive->auto_redirect));
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1095
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1096 node->len = (u_char) len;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1097 ngx_memcpy(node->name, &lq->name->data[prefix], len);
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 ngx_queue_split(locations, q, &tail);
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 if (ngx_queue_empty(locations)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1102 /*
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1103 * ngx_queue_split() insures that if left part is empty,
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1104 * then right one is empty too
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 goto inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1107 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1108
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1109 node->left = ngx_http_create_locations_tree(cf, locations, prefix);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1110 if (node->left == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1111 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1112 }
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 ngx_queue_remove(q);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1115
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1116 if (ngx_queue_empty(&tail)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1117 goto inclusive;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1118 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1119
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1120 node->right = ngx_http_create_locations_tree(cf, &tail, prefix);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1121 if (node->right == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1122 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1123 }
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 inclusive:
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1126
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1127 if (ngx_queue_empty(&lq->list)) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1128 return node;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1129 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1130
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1131 node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len);
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1132 if (node->tree == NULL) {
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1133 return NULL;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1134 }
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 return node;
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1137 }
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1138
f321b59ae0e9 locations tree
Igor Sysoev <igor@sysoev.ru>
parents: 2025
diff changeset
1139
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1140 ngx_int_t
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1141 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
1142 ngx_http_listen_opt_t *lsopt)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1143 {
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1144 in_port_t p;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1145 ngx_uint_t i;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1146 struct sockaddr *sa;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1147 ngx_http_conf_port_t *port;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1148 ngx_http_core_main_conf_t *cmcf;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1149
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1150 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
1151
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1152 if (cmcf->ports == NULL) {
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1153 cmcf->ports = ngx_array_create(cf->temp_pool, 2,
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1154 sizeof(ngx_http_conf_port_t));
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1155 if (cmcf->ports == NULL) {
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1156 return NGX_ERROR;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1157 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1158 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1159
6560
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1160 sa = &lsopt->sockaddr.sockaddr;
6593
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6560
diff changeset
1161 p = ngx_inet_get_port(sa);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1162
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1163 port = cmcf->ports->elts;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1164 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
1165
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1166 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
1167 continue;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1168 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1169
2852
dfe04af9d30b update comments missed in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2851
diff changeset
1170 /* 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
1171
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1172 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
1173 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1174
2852
dfe04af9d30b update comments missed in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2851
diff changeset
1175 /* 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
1176
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1177 port = ngx_array_push(cmcf->ports);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1178 if (port == NULL) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1179 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1180 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1181
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1182 port->family = sa->sa_family;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1183 port->port = p;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1184 port->addrs.elts = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1185
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1186 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
1187 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1188
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1189
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1190 static ngx_int_t
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1191 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
1192 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
1193 {
6128
69ad3e77922b Merge proxy_protocol setting of listen directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6049
diff changeset
1194 ngx_uint_t i, default_server, proxy_protocol;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1195 ngx_http_conf_addr_t *addr;
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1196 #if (NGX_HTTP_SSL)
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1197 ngx_uint_t ssl;
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1198 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1199 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1200 ngx_uint_t http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1201 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1202
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1203 /*
4133
59b99f217c6d Replaced "can not" with "cannot" and "could not" in a bunch of places.
Ruslan Ermilov <ru@nginx.com>
parents: 3825
diff changeset
1204 * we cannot compare whole sockaddr struct's as kernel
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1205 * 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
1206 */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1207
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1208 addr = port->addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1209
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1210 for (i = 0; i < port->addrs.nelts; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1211
6560
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1212 if (ngx_cmp_sockaddr(&lsopt->sockaddr.sockaddr, lsopt->socklen,
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1213 &addr[i].opt.sockaddr.sockaddr,
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1214 addr[i].opt.socklen, 0)
6557
6f8254ae61b8 Use ngx_cmp_sockaddr() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6379
diff changeset
1215 != NGX_OK)
6f8254ae61b8 Use ngx_cmp_sockaddr() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 6379
diff changeset
1216 {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1217 continue;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1218 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1219
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1220 /* 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
1221
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1222 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
1223 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1224 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1225
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1226 /* 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
1227 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
1228
6128
69ad3e77922b Merge proxy_protocol setting of listen directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6049
diff changeset
1229 proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol;
69ad3e77922b Merge proxy_protocol setting of listen directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6049
diff changeset
1230
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1231 #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
1232 ssl = lsopt->ssl || addr[i].opt.ssl;
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1233 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1234 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1235 http2 = lsopt->http2 || addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1236 #endif
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1237
3226
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1238 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
1239
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1240 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
1241 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4142
7b632622ba56 Fixed error message.
Ruslan Ermilov <ru@nginx.com>
parents: 4133
diff changeset
1242 "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
1243 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
1244 }
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1245
4872f86df719 fix r3225: it overrode the listen options by default server default options
Igor Sysoev <igor@sysoev.ru>
parents: 3224
diff changeset
1246 addr[i].opt = *lsopt;
3224
8e76e636ae3b allow to set listen options in any server
Igor Sysoev <igor@sysoev.ru>
parents: 3223
diff changeset
1247 }
8e76e636ae3b allow to set listen options in any server
Igor Sysoev <igor@sysoev.ru>
parents: 3223
diff changeset
1248
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1249 /* 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
1250
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1251 if (lsopt->default_server) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1252
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1253 if (default_server) {
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1254 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
1255 "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
1256 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1257 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1258
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1259 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
1260 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
1261 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1262
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1263 addr[i].opt.default_server = default_server;
6128
69ad3e77922b Merge proxy_protocol setting of listen directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6049
diff changeset
1264 addr[i].opt.proxy_protocol = proxy_protocol;
3764
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1265 #if (NGX_HTTP_SSL)
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1266 addr[i].opt.ssl = ssl;
d1983670b586 allow duplicate listen ssl options
Igor Sysoev <igor@sysoev.ru>
parents: 3730
diff changeset
1267 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1268 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1269 addr[i].opt.http2 = http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1270 #endif
3229
a632dc9f3e73 fix r3225 and r3227: preserve default_server bit during listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3227
diff changeset
1271
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1272 return NGX_OK;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1273 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1274
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1275 /* 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
1276
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1277 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
1278 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1279
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1280
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1281 /*
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1282 * 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
1283 * configurations to the port list
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1284 */
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1285
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1286 static ngx_int_t
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1287 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
1288 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
1289 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1290 ngx_http_conf_addr_t *addr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1291
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1292 if (port->addrs.elts == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1293 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
1294 sizeof(ngx_http_conf_addr_t))
1385
4612daca9dc1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1353
diff changeset
1295 != NGX_OK)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1296 {
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1297 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1298 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1299 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1300
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1301 #if (NGX_HTTP_V2 && NGX_HTTP_SSL \
5545
01e2a5bcdd8f SSL: support ALPN (IETF's successor to NPN).
Piotr Sikora <piotr@cloudflare.com>
parents: 5456
diff changeset
1302 && !defined TLSEXT_TYPE_application_layer_protocol_negotiation \
01e2a5bcdd8f SSL: support ALPN (IETF's successor to NPN).
Piotr Sikora <piotr@cloudflare.com>
parents: 5456
diff changeset
1303 && !defined TLSEXT_TYPE_next_proto_neg)
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1304
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1305 if (lsopt->http2 && lsopt->ssl) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1306 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1307 "nginx was built with OpenSSL that lacks ALPN "
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1308 "and NPN support, HTTP/2 is not enabled for %s",
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1309 lsopt->addr);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1310 }
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1311
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1312 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1313
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1314 addr = ngx_array_push(&port->addrs);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1315 if (addr == NULL) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1316 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1317 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1318
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1319 addr->opt = *lsopt;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1320 addr->hash.buckets = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1321 addr->hash.size = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1322 addr->wc_head = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1323 addr->wc_tail = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1324 #if (NGX_PCRE)
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1325 addr->nregex = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1326 addr->regex = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1327 #endif
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1328 addr->default_server = cscf;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1329 addr->servers.elts = NULL;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1330
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1331 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
1332 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1333
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1334
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1335 /* 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
1336
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1337 static ngx_int_t
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1338 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
1339 ngx_http_conf_addr_t *addr)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1340 {
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1341 ngx_uint_t i;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1342 ngx_http_core_srv_conf_t **server;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1343
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1344 if (addr->servers.elts == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1345 if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1346 sizeof(ngx_http_core_srv_conf_t *))
1385
4612daca9dc1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1353
diff changeset
1347 != NGX_OK)
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1348 {
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1349 return NGX_ERROR;
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1350 }
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1351
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1352 } else {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1353 server = addr->servers.elts;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1354 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
1355 if (server[i] == cscf) {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1356 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
1357 "a duplicate listen %s", addr->opt.addr);
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1358 return NGX_ERROR;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1359 }
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1360 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1361 }
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1362
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1363 server = ngx_array_push(&addr->servers);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1364 if (server == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1365 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1366 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1367
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1368 *server = cscf;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1369
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1370 return NGX_OK;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1371 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1372
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1373
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1910
diff changeset
1374 static ngx_int_t
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1375 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
1376 ngx_array_t *ports)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1377 {
3258
77db9440d970 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3257
diff changeset
1378 ngx_uint_t p, a;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1379 ngx_http_conf_port_t *port;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1380 ngx_http_conf_addr_t *addr;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1381
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
1382 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
1383 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
1384 }
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1385
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1386 port = ports->elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1387 for (p = 0; p < ports->nelts; p++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1388
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1389 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
1390 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
1391
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1392 /*
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1393 * check whether all name-based servers have the same
4572
67653855682e Fixed spelling in multiline C comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
1394 * configuration as a default server for given address:port
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1395 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1396
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1397 addr = port[p].addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1398 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
1399
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1400 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
1401 #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
1402 || 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
1403 #endif
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1404 )
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1405 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1406 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
1407 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1408 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1409 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1410 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1411
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1412 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
1413 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1414 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1415 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1416
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1417 return NGX_OK;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1418 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1419
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1420
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1421 static ngx_int_t
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1422 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
1423 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
1424 {
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1425 ngx_int_t rc;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1426 ngx_uint_t n, s;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1427 ngx_hash_init_t hash;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1428 ngx_hash_keys_arrays_t ha;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1429 ngx_http_server_name_t *name;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1430 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
1431 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1432 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
1433
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1434 regex = 0;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1435 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1436
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1437 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
1438
5124
5482671df278 Use NGX_DEFAULT_POOL_SIZE macro where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 5121
diff changeset
1439 ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1440 if (ha.temp_pool == NULL) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1441 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1442 }
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 ha.pool = cf->pool;
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 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
1447 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1448 }
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 cscfp = addr->servers.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1451
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1452 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
1453
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1454 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1455
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1456 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
1457
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1458 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1459 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1460 regex++;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1461 continue;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1462 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1463 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1464
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1465 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
1466 NGX_HASH_WILDCARD_KEY);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1467
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1468 if (rc == NGX_ERROR) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1469 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1470 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1471
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1472 if (rc == NGX_DECLINED) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1473 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1474 "invalid server name or wildcard \"%V\" on %s",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1475 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1476 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1477 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1478
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1479 if (rc == NGX_BUSY) {
3823
b1add8bfad83 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3768
diff changeset
1480 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1481 "conflicting server name \"%V\" on %s, ignored",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1482 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1483 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1484 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1485 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1486
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1487 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
1488 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
1489 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
1490 hash.name = "server_names_hash";
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1491 hash.pool = cf->pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1492
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1493 if (ha.keys.nelts) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1494 hash.hash = &addr->hash;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1495 hash.temp_pool = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1496
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1497 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
1498 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1499 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1500 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1501
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1502 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
1503
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1504 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
1505 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
1506
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1507 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1508 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
1509
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1510 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
1511 ha.dns_wc_head.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1512 != NGX_OK)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1513 {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1514 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1515 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1516
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1517 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
1518 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1519
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1520 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
1521
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1522 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
1523 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
1524
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1525 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1526 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
1527
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1528 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
1529 ha.dns_wc_tail.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1530 != NGX_OK)
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 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1533 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1534
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1535 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
1536 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1537
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1538 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
1539
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1540 #if (NGX_PCRE)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1541
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1542 if (regex == 0) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1543 return NGX_OK;
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1546 addr->nregex = regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1547 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
1548 if (addr->regex == NULL) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1549 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1550 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1551
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1552 i = 0;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1553
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1554 for (s = 0; s < addr->servers.nelts; s++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1555
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1556 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1557
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1558 for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1559 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1560 addr->regex[i++] = name[n];
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1561 }
2511
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 }
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 #endif
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 return NGX_OK;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1568
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1569 failed:
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1570
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1571 ngx_destroy_pool(ha.temp_pool);
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1572
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1573 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1574 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1575
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1576
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1577 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1578 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
1579 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1580 ngx_http_conf_addr_t *first, *second;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1581
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1582 first = (ngx_http_conf_addr_t *) one;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1583 second = (ngx_http_conf_addr_t *) two;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1584
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1585 if (first->opt.wildcard) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1586 /* 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
1587 return 1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1588 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1589
4755
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1590 if (second->opt.wildcard) {
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1591 /* a wildcard address must be the last resort, shift it to the end */
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1592 return -1;
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1593 }
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1594
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1595 if (first->opt.bind && !second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1596 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1597 return -1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1598 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1599
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1600 if (!first->opt.bind && second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1601 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1602 return 1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1603 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1604
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1605 /* do not sort by default */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1606
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1607 return 0;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1608 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1609
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1610
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1611 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1612 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
1613 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1614 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1615
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1616 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1617 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1618
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2852
diff changeset
1619 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
1620 }
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1621
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1622
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1623 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1624 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
1625 {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1626 ngx_uint_t i, last, bind_wildcard;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1627 ngx_listening_t *ls;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1628 ngx_http_port_t *hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1629 ngx_http_conf_addr_t *addr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1630
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1631 addr = port->addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1632 last = port->addrs.nelts;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1633
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1634 /*
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1635 * 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
1636 * 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
1637 * 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
1638 * 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
1639 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1640
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1641 if (addr[last - 1].opt.wildcard) {
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1642 addr[last - 1].opt.bind = 1;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1643 bind_wildcard = 1;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1644
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1645 } else {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1646 bind_wildcard = 0;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1647 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1648
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1649 i = 0;
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1650
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1651 while (i < last) {
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1652
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1653 if (bind_wildcard && !addr[i].opt.bind) {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1654 i++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1655 continue;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1656 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1657
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1658 ls = ngx_http_add_listening(cf, &addr[i]);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1659 if (ls == NULL) {
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1660 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1661 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1662
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1663 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
1664 if (hport == NULL) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1665 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1666 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1667
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1668 ls->servers = hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1669
6152
3c344ea7d88b Simplified ngx_http_init_listening().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6128
diff changeset
1670 hport->naddrs = i + 1;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1671
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1672 switch (ls->sockaddr->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1673
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1674 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1675 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1676 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
1677 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1678 }
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1679 break;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1680 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1681 default: /* AF_INET */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1682 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
1683 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1684 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1685 break;
2022
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
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1688 if (ngx_clone_listening(cf, ls) != NGX_OK) {
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1689 return NGX_ERROR;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1690 }
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1691
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1692 addr++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1693 last--;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1694 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1695
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1696 return NGX_OK;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1697 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1698
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1699
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1700 static ngx_listening_t *
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1701 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
1702 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1703 ngx_listening_t *ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1704 ngx_http_core_loc_conf_t *clcf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1705 ngx_http_core_srv_conf_t *cscf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1706
6560
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1707 ls = ngx_create_listening(cf, &addr->opt.sockaddr.sockaddr,
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1708 addr->opt.socklen);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1709 if (ls == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1710 return NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1711 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1712
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1713 ls->addr_ntop = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1714
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1715 ls->handler = ngx_http_init_connection;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1716
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1717 cscf = addr->default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1718 ls->pool_size = cscf->connection_pool_size;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1719 ls->post_accept_timeout = cscf->client_header_timeout;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1720
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1721 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
1722
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2689
diff changeset
1723 ls->logp = clcf->error_log;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1724 ls->log.data = &ls->addr_text;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1725 ls->log.handler = ngx_accept_log_error;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1726
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1727 #if (NGX_WIN32)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1728 {
4154
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1729 ngx_iocp_conf_t *iocpcf = NULL;
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1730
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1731 if (ngx_get_conf(cf->cycle->conf_ctx, ngx_events_module)) {
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1732 iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module);
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1733 }
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1734 if (iocpcf && iocpcf->acceptex_read) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1735 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
1736 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1737 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1738 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1739
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1740 ls->backlog = addr->opt.backlog;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1741 ls->rcvbuf = addr->opt.rcvbuf;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1742 ls->sndbuf = addr->opt.sndbuf;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1743
4323
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1744 ls->keepalive = addr->opt.so_keepalive;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1745 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1746 ls->keepidle = addr->opt.tcp_keepidle;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1747 ls->keepintvl = addr->opt.tcp_keepintvl;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1748 ls->keepcnt = addr->opt.tcp_keepcnt;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1749 #endif
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1750
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1751 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1752 ls->accept_filter = addr->opt.accept_filter;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1753 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1754
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1755 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1756 ls->deferred_accept = addr->opt.deferred_accept;
2512
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
6719
cebf5fed00bf Modules compatibility: removed unneeded IPV6_V6ONLY checks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6593
diff changeset
1759 #if (NGX_HAVE_INET6)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1760 ls->ipv6only = addr->opt.ipv6only;
2562
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1761 #endif
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1762
3676
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1763 #if (NGX_HAVE_SETFIB)
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1764 ls->setfib = addr->opt.setfib;
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1765 #endif
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1766
5456
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1767 #if (NGX_HAVE_TCP_FASTOPEN)
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1768 ls->fastopen = addr->opt.fastopen;
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1769 #endif
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1770
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1771 #if (NGX_HAVE_REUSEPORT)
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1772 ls->reuseport = addr->opt.reuseport;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1773 #endif
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1774
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1775 return ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1776 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1777
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1778
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1779 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1780 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
1781 ngx_http_conf_addr_t *addr)
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 ngx_uint_t i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1784 ngx_http_in_addr_t *addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1785 struct sockaddr_in *sin;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1786 ngx_http_virtual_names_t *vn;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1787
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1788 hport->addrs = ngx_pcalloc(cf->pool,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1789 hport->naddrs * sizeof(ngx_http_in_addr_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1790 if (hport->addrs == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1791 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1792 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1793
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1794 addrs = hport->addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1795
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1796 for (i = 0; i < hport->naddrs; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1797
6560
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1798 sin = &addr[i].opt.sockaddr.sockaddr_in;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1799 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
1800 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
1801 #if (NGX_HTTP_SSL)
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1802 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
1803 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1804 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1805 addrs[i].conf.http2 = addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1806 #endif
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5545
diff changeset
1807 addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;
2512
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
6560
c90cf79d0e1d Renamed "u" to "sockaddr" in listen options types.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6557
diff changeset
1863 sin6 = &addr[i].opt.sockaddr.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
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1869 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1870 addrs6[i].conf.http2 = addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1871 #endif
6331
ceeb1edb3018 Fixed PROXY protocol on IPv6 sockets (ticket #858).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6246
diff changeset
1872 addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1873
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1874 if (addr[i].hash.buckets == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1875 && (addr[i].wc_head == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1876 || 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
1877 && (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
1878 || 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
1879 #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
1880 && 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
1881 #endif
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1882 )
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1883 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1884 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1885 }
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 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
1888 if (vn == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1889 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1890 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1891
2689
6caf687a831f backout r2535: virtual names is a property of address:port pair,
Igor Sysoev <igor@sysoev.ru>
parents: 2688
diff changeset
1892 addrs6[i].conf.virtual_names = vn;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1893
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1894 vn->names.hash = addr[i].hash;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1895 vn->names.wc_head = addr[i].wc_head;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1896 vn->names.wc_tail = addr[i].wc_tail;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1897 #if (NGX_PCRE)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1898 vn->nregex = addr[i].nregex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1899 vn->regex = addr[i].regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1900 #endif
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1903 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1904 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1905
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1906 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1907
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1908
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1909 char *
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1910 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
1911 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1912 char *p = conf;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1913
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1914 ngx_array_t **types;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1915 ngx_str_t *value, *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1916 ngx_uint_t i, n, hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1917 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1918
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1919 types = (ngx_array_t **) (p + cmd->offset);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1920
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1921 if (*types == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1922 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1923 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1924
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1925 default_type = cmd->post;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1926
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1927 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1928 *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
1929 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1930 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1931 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1932
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1933 if (default_type) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1934 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1935 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1936 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1937 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1938
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1939 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1940 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1941 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1942 type->value = (void *) 4;
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 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1945
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1946 value = cf->args->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1947
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1948 for (i = 1; i < cf->args->nelts; i++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1949
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1950 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
1951 *types = (void *) -1;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1952 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1953 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1954
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1955 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
1956 value[i].data[value[i].len] = '\0';
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1957
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1958 type = (*types)->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1959 for (n = 0; n < (*types)->nelts; n++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1960
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1961 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
1962 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1963 "duplicate MIME type \"%V\"", &value[i]);
5856
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
1964 goto next;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1965 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1966 }
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 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1969 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1970 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1971 }
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 type->key = value[i];
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1974 type->key_hash = hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1975 type->value = (void *) 4;
5856
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
1976
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
1977 next:
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
1978
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
1979 continue;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1980 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1981
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1982 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1983 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1984
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1985
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1986 char *
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1987 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
1988 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
1989 ngx_str_t *default_types)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1990 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1991 ngx_hash_init_t hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1992
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1993 if (*keys) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1994
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1995 if (*keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1996 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1997 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1998
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
1999 hash.hash = types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2000 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2001 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2002 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2003 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2004 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2005 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2006
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2007 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
2008 return NGX_CONF_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2009 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2010
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2011 return NGX_CONF_OK;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2012 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2013
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2014 if (prev_types_hash->buckets == NULL) {
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2015
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2016 if (*prev_keys == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2017
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2018 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
2019 != NGX_OK)
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2020 {
2223
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2021 return NGX_CONF_ERROR;
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2022 }
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2023
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2024 } else if (*prev_keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2025 *keys = *prev_keys;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2026 return NGX_CONF_OK;
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2027 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2028
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2029 hash.hash = prev_types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2030 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2031 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2032 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2033 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2034 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2035 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2036
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2037 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
2038 != NGX_OK)
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2039 {
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2040 return NGX_CONF_ERROR;
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 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2043
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2044 *types_hash = *prev_types_hash;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2045
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2046 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2047
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
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2050
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2051 ngx_int_t
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2052 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
2053 ngx_str_t *default_type)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2054 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2055 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2056
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2057 *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
2058 if (*types == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2059 return NGX_ERROR;
2138
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
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2062 while (default_type->len) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2063
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2064 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2065 if (type == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2066 return NGX_ERROR;
2138
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
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2069 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2070 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2071 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2072 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2073
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2074 default_type++;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2075 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2076
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2077 return NGX_OK;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2078 }