annotate src/http/ngx_http.c @ 6075:7fcfe113827d stable-1.6

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