annotate src/http/ngx_http.c @ 6202:6345822f0abb

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