annotate src/http/ngx_http.c @ 6292:f72d3129cd35

HTTP/2: fixed handling of output HEADERS frames. The HEADERS frame is always represented by more than one buffer since b930e598a199, but the handling code hasn't been adjusted. Only the first buffer of HEADERS frame was checked and if it had been sent while others had not, the rest of the frame was dropped, resulting in broken connection. Before b930e598a199, the problem could only be seen in case of HEADERS frame with CONTINUATION.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 13 Nov 2015 20:10:50 +0300
parents 257b51c37c5a
children ceeb1edb3018
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
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1236 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1237 ngx_uint_t http2;
5121
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
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1293 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1294 http2 = lsopt->http2 || addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
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
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1327 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1328 addr[i].opt.http2 = http2;
5121
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
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1360 #if (NGX_HTTP_V2 && NGX_HTTP_SSL \
5545
01e2a5bcdd8f SSL: support ALPN (IETF's successor to NPN).
Piotr Sikora <piotr@cloudflare.com>
parents: 5456
diff changeset
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)
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1363
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1364 if (lsopt->http2 && lsopt->ssl) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1365 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1366 "nginx was built with OpenSSL that lacks ALPN "
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1367 "and NPN support, HTTP/2 is not enabled for %s",
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1368 lsopt->addr);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1369 }
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1370
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1371 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1372
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1373 addr = ngx_array_push(&port->addrs);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1374 if (addr == NULL) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1375 return NGX_ERROR;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1376 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1377
3220
cdcd9e29c589 *) move sockaddr to the listen options
Igor Sysoev <igor@sysoev.ru>
parents: 3219
diff changeset
1378 addr->opt = *lsopt;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1379 addr->hash.buckets = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1380 addr->hash.size = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1381 addr->wc_head = NULL;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1382 addr->wc_tail = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1383 #if (NGX_PCRE)
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1384 addr->nregex = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1385 addr->regex = NULL;
1387
cb8b30ef3e7e regex in server_name
Igor Sysoev <igor@sysoev.ru>
parents: 1385
diff changeset
1386 #endif
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1387 addr->default_server = cscf;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1388 addr->servers.elts = NULL;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1389
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1390 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
1391 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1392
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1393
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1394 /* 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
1395
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 485
diff changeset
1396 static ngx_int_t
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1397 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
1398 ngx_http_conf_addr_t *addr)
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1399 {
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1400 ngx_uint_t i;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1401 ngx_http_core_srv_conf_t **server;
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1402
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1403 if (addr->servers.elts == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1404 if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1405 sizeof(ngx_http_core_srv_conf_t *))
1385
4612daca9dc1 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1353
diff changeset
1406 != NGX_OK)
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1407 {
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1408 return NGX_ERROR;
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1409 }
3227
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1410
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1411 } else {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1412 server = addr->servers.elts;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1413 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
1414 if (server[i] == cscf) {
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1415 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
1416 "a duplicate listen %s", addr->opt.addr);
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1417 return NGX_ERROR;
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1418 }
a610008bdc1a test a duplicate listen in a server
Igor Sysoev <igor@sysoev.ru>
parents: 3226
diff changeset
1419 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1420 }
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1421
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1422 server = ngx_array_push(&addr->servers);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1423 if (server == NULL) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1424 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1425 }
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
1426
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1427 *server = cscf;
455
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 return NGX_OK;
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1430 }
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1431
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
1432
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1910
diff changeset
1433 static ngx_int_t
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1434 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
1435 ngx_array_t *ports)
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1436 {
3258
77db9440d970 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3257
diff changeset
1437 ngx_uint_t p, a;
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1438 ngx_http_conf_port_t *port;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1439 ngx_http_conf_addr_t *addr;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1440
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
1441 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
1442 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
1443 }
8bd88de8fecd fix segfault if http {} block is empty, the bug had been introduced in r3218
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
1444
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1445 port = ports->elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1446 for (p = 0; p < ports->nelts; p++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1447
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1448 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
1449 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
1450
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1451 /*
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1452 * 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
1453 * 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
1454 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1455
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1456 addr = port[p].addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1457 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
1458
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1459 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
1460 #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
1461 || 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
1462 #endif
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1463 )
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1464 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1465 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
1466 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1467 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1468 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1469 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1470
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1471 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
1472 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1473 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1474 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1475
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1476 return NGX_OK;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1477 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1478
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1479
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1480 static ngx_int_t
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1481 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
1482 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
1483 {
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1484 ngx_int_t rc;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1485 ngx_uint_t n, s;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1486 ngx_hash_init_t hash;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1487 ngx_hash_keys_arrays_t ha;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1488 ngx_http_server_name_t *name;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1489 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
1490 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1491 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
1492
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1493 regex = 0;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1494 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1495
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1496 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
1497
5124
5482671df278 Use NGX_DEFAULT_POOL_SIZE macro where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 5121
diff changeset
1498 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
1499 if (ha.temp_pool == NULL) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1500 return NGX_ERROR;
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
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1503 ha.pool = cf->pool;
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 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
1506 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1507 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1508
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1509 cscfp = addr->servers.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1510
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1511 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
1512
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1513 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1514
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1515 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
1516
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1517 #if (NGX_PCRE)
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1518 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1519 regex++;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1520 continue;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1521 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1522 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1523
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1524 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
1525 NGX_HASH_WILDCARD_KEY);
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1526
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1527 if (rc == NGX_ERROR) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1528 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1529 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1530
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1531 if (rc == NGX_DECLINED) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1532 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1533 "invalid server name or wildcard \"%V\" on %s",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1534 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1535 return NGX_ERROR;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1536 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1537
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1538 if (rc == NGX_BUSY) {
3823
b1add8bfad83 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3768
diff changeset
1539 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1540 "conflicting server name \"%V\" on %s, ignored",
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1541 &name[n].name, addr->opt.addr);
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1542 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1543 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1544 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1545
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1546 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
1547 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
1548 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
1549 hash.name = "server_names_hash";
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1550 hash.pool = cf->pool;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1551
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1552 if (ha.keys.nelts) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1553 hash.hash = &addr->hash;
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1554 hash.temp_pool = NULL;
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 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
1557 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1558 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1559 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1560
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1561 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
1562
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1563 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
1564 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
1565
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1566 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1567 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
1568
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1569 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
1570 ha.dns_wc_head.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1571 != NGX_OK)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1572 {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1573 goto failed;
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1576 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
1577 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1578
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1579 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
1580
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1581 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
1582 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
1583
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1584 hash.hash = NULL;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1585 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
1586
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1587 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
1588 ha.dns_wc_tail.nelts)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1589 != NGX_OK)
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1590 {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1591 goto failed;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1592 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1593
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1594 addr->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
1595 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1596
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1597 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
1598
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1599 #if (NGX_PCRE)
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 if (regex == 0) {
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1602 return NGX_OK;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1603 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1604
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1605 addr->nregex = regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1606 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
1607 if (addr->regex == NULL) {
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1608 return NGX_ERROR;
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1609 }
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1610
3219
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1611 i = 0;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1612
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1613 for (s = 0; s < addr->servers.nelts; s++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1614
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1615 name = cscfp[s]->server_names.elts;
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1616
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1617 for (n = 0; n < cscfp[s]->server_names.nelts; n++) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1618 if (name[n].regex) {
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1619 addr->regex[i++] = name[n];
81b8416054b0 fix r3218:
Igor Sysoev <igor@sysoev.ru>
parents: 3218
diff changeset
1620 }
2511
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1621 }
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
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1624 #endif
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1625
f91c5c964e61 split ports, addresses, and server names preparation and optimization
Igor Sysoev <igor@sysoev.ru>
parents: 2407
diff changeset
1626 return NGX_OK;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1627
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1628 failed:
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1629
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1630 ngx_destroy_pool(ha.temp_pool);
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 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1633 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1634
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1635
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1636 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1637 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
1638 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1639 ngx_http_conf_addr_t *first, *second;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1640
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1641 first = (ngx_http_conf_addr_t *) one;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1642 second = (ngx_http_conf_addr_t *) two;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1643
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1644 if (first->opt.wildcard) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1645 /* 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
1646 return 1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1647 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1648
4755
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1649 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
1650 /* 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
1651 return -1;
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1652 }
7ab10517ae58 Fixed sorting of listen addresses so that wildcard address is always at
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
1653
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1654 if (first->opt.bind && !second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1655 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1656 return -1;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1657 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1658
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1659 if (!first->opt.bind && second->opt.bind) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1660 /* shift explicit bind()ed addresses to the start */
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1661 return 1;
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
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1664 /* do not sort by default */
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 return 0;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1667 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1668
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 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1671 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
1672 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1673 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1674
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1675 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1676 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
1677
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2852
diff changeset
1678 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
1679 }
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1680
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1681
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1682 static ngx_int_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1683 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
1684 {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1685 ngx_uint_t i, last, bind_wildcard;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1686 ngx_listening_t *ls;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1687 ngx_http_port_t *hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1688 ngx_http_conf_addr_t *addr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1689
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1690 addr = port->addrs.elts;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1691 last = port->addrs.nelts;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1692
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1693 /*
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1694 * 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
1695 * 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
1696 * 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
1697 * 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
1698 */
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1699
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1700 if (addr[last - 1].opt.wildcard) {
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1701 addr[last - 1].opt.bind = 1;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1702 bind_wildcard = 1;
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 } else {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1705 bind_wildcard = 0;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1706 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1707
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1708 i = 0;
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1709
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1710 while (i < last) {
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1711
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1712 if (bind_wildcard && !addr[i].opt.bind) {
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1713 i++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1714 continue;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1715 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1716
2533
c843171d5dc2 axe r->port_text
Igor Sysoev <igor@sysoev.ru>
parents: 2530
diff changeset
1717 ls = ngx_http_add_listening(cf, &addr[i]);
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1718 if (ls == NULL) {
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1719 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1720 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1721
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1722 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
1723 if (hport == NULL) {
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1724 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1725 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1726
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1727 ls->servers = hport;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1728
6152
3c344ea7d88b Simplified ngx_http_init_listening().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6128
diff changeset
1729 hport->naddrs = i + 1;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1730
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1731 switch (ls->sockaddr->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1732
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1733 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1734 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1735 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
1736 return NGX_ERROR;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1737 }
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1738 break;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1739 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1740 default: /* AF_INET */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1741 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
1742 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1743 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1744 break;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1745 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1746
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1747 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
1748 return NGX_ERROR;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1749 }
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1750
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1751 addr++;
2022
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1752 last--;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1753 }
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1754
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1755 return NGX_OK;
35b35b84f5ef split ngx_http_block() further
Igor Sysoev <igor@sysoev.ru>
parents: 2021
diff changeset
1756 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1757
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1758
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1759 static ngx_listening_t *
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1760 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
1761 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1762 ngx_listening_t *ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1763 ngx_http_core_loc_conf_t *clcf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1764 ngx_http_core_srv_conf_t *cscf;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1765
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1766 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
1767 if (ls == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1768 return NULL;
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1771 ls->addr_ntop = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1772
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1773 ls->handler = ngx_http_init_connection;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1774
3221
c8de5a8b6d17 rename core_srv_conf fields to more understandable default_server and server
Igor Sysoev <igor@sysoev.ru>
parents: 3220
diff changeset
1775 cscf = addr->default_server;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1776 ls->pool_size = cscf->connection_pool_size;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1777 ls->post_accept_timeout = cscf->client_header_timeout;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1778
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1779 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
1780
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2689
diff changeset
1781 ls->logp = clcf->error_log;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1782 ls->log.data = &ls->addr_text;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1783 ls->log.handler = ngx_accept_log_error;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1784
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1785 #if (NGX_WIN32)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1786 {
4154
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1787 ngx_iocp_conf_t *iocpcf = NULL;
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 (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
1790 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
1791 }
57d45d345651 Fixed segmentation fault with empty config on Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4142
diff changeset
1792 if (iocpcf && iocpcf->acceptex_read) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1793 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
1794 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1795 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1796 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1797
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1798 ls->backlog = addr->opt.backlog;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1799 ls->rcvbuf = addr->opt.rcvbuf;
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1800 ls->sndbuf = addr->opt.sndbuf;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1801
4323
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1802 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
1803 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1804 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
1805 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
1806 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
1807 #endif
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4154
diff changeset
1808
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1809 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1810 ls->accept_filter = addr->opt.accept_filter;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1811 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1812
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1813 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1814 ls->deferred_accept = addr->opt.deferred_accept;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1815 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1816
2562
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1817 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
3217
a22bf524a456 refactor http listen code:
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
1818 ls->ipv6only = addr->opt.ipv6only;
2562
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1819 #endif
c352c419be85 ipv6only
Igor Sysoev <igor@sysoev.ru>
parents: 2534
diff changeset
1820
3676
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1821 #if (NGX_HAVE_SETFIB)
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1822 ls->setfib = addr->opt.setfib;
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1823 #endif
4430d110293e listen setfib=X
Igor Sysoev <igor@sysoev.ru>
parents: 3633
diff changeset
1824
5456
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1825 #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
1826 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
1827 #endif
692afcea9d0d Added support for TCP_FASTOPEN supported in Linux >= 3.7.1.
Mathew Rodley <mathew@rodley.com.au>
parents: 5388
diff changeset
1828
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1829 #if (NGX_HAVE_REUSEPORT)
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1830 ls->reuseport = addr->opt.reuseport;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1831 #endif
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6152
diff changeset
1832
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1833 return ls;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1834 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1835
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1836
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1837 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1838 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
1839 ngx_http_conf_addr_t *addr)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1840 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1841 ngx_uint_t i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1842 ngx_http_in_addr_t *addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1843 struct sockaddr_in *sin;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1844 ngx_http_virtual_names_t *vn;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1845
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1846 hport->addrs = ngx_pcalloc(cf->pool,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1847 hport->naddrs * sizeof(ngx_http_in_addr_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1848 if (hport->addrs == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1849 return NGX_ERROR;
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1852 addrs = hport->addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1853
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1854 for (i = 0; i < hport->naddrs; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1855
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1856 sin = &addr[i].opt.u.sockaddr_in;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1857 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
1858 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
1859 #if (NGX_HTTP_SSL)
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1860 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
1861 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1862 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1863 addrs[i].conf.http2 = addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1864 #endif
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5545
diff changeset
1865 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
1866
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1867 if (addr[i].hash.buckets == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1868 && (addr[i].wc_head == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1869 || addr[i].wc_head->hash.buckets == NULL)
2580
684ca3b0ae14 test wildcard tail hash existance
Igor Sysoev <igor@sysoev.ru>
parents: 2562
diff changeset
1870 && (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
1871 || 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
1872 #if (NGX_PCRE)
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1873 && addr[i].nregex == 0
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1874 #endif
1fb5e7e05a4e always run regex in server_name to get captures
Igor Sysoev <igor@sysoev.ru>
parents: 2580
diff changeset
1875 )
2512
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 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1878 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1879
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1880 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
1881 if (vn == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1882 return NGX_ERROR;
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
2689
6caf687a831f backout r2535: virtual names is a property of address:port pair,
Igor Sysoev <igor@sysoev.ru>
parents: 2688
diff changeset
1885 addrs[i].conf.virtual_names = vn;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1886
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1887 vn->names.hash = addr[i].hash;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1888 vn->names.wc_head = addr[i].wc_head;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1889 vn->names.wc_tail = addr[i].wc_tail;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1890 #if (NGX_PCRE)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1891 vn->nregex = addr[i].nregex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1892 vn->regex = addr[i].regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1893 #endif
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 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1897 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1898
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1899
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1900 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1901
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1902 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1903 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
1904 ngx_http_conf_addr_t *addr)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1905 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1906 ngx_uint_t i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1907 ngx_http_in6_addr_t *addrs6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1908 struct sockaddr_in6 *sin6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1909 ngx_http_virtual_names_t *vn;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1910
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1911 hport->addrs = ngx_pcalloc(cf->pool,
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1912 hport->naddrs * sizeof(ngx_http_in6_addr_t));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1913 if (hport->addrs == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1914 return NGX_ERROR;
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1917 addrs6 = hport->addrs;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1918
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1919 for (i = 0; i < hport->naddrs; i++) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1920
3395
4e15548b29d4 fix building by gcc 4.4 with -O2/3/s:
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
1921 sin6 = &addr[i].opt.u.sockaddr_in6;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1922 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
1923 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
1924 #if (NGX_HTTP_SSL)
3218
022a7662b4ed refactor http listen code: remove duplicate options fields
Igor Sysoev <igor@sysoev.ru>
parents: 3217
diff changeset
1925 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
1926 #endif
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1927 #if (NGX_HTTP_V2)
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6193
diff changeset
1928 addrs6[i].conf.http2 = addr[i].opt.http2;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 4755
diff changeset
1929 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1930
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1931 if (addr[i].hash.buckets == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1932 && (addr[i].wc_head == NULL
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1933 || 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
1934 && (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
1935 || 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
1936 #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
1937 && 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
1938 #endif
3770119af0b5 always run regex in server_name to get captures for IPv6 addresses,
Igor Sysoev <igor@sysoev.ru>
parents: 3824
diff changeset
1939 )
2512
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 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1942 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1943
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1944 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
1945 if (vn == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1946 return NGX_ERROR;
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
2689
6caf687a831f backout r2535: virtual names is a property of address:port pair,
Igor Sysoev <igor@sysoev.ru>
parents: 2688
diff changeset
1949 addrs6[i].conf.virtual_names = vn;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1950
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1951 vn->names.hash = addr[i].hash;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1952 vn->names.wc_head = addr[i].wc_head;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1953 vn->names.wc_tail = addr[i].wc_tail;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1954 #if (NGX_PCRE)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1955 vn->nregex = addr[i].nregex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1956 vn->regex = addr[i].regex;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1957 #endif
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 return NGX_OK;
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1963 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1964
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2511
diff changeset
1965
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1966 char *
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1967 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
1968 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1969 char *p = conf;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1970
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1971 ngx_array_t **types;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1972 ngx_str_t *value, *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1973 ngx_uint_t i, n, hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1974 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1975
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1976 types = (ngx_array_t **) (p + cmd->offset);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1977
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1978 if (*types == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1979 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1980 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
1981
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1982 default_type = cmd->post;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1983
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1984 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1985 *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
1986 if (*types == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1987 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1988 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1989
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1990 if (default_type) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1991 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1992 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1993 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1994 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1995
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1996 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1997 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1998 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
1999 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2000 }
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
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2003 value = cf->args->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2004
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2005 for (i = 1; i < cf->args->nelts; i++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2006
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2007 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
2008 *types = (void *) -1;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2009 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2010 }
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2011
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2012 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
2013 value[i].data[value[i].len] = '\0';
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 type = (*types)->elts;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2016 for (n = 0; n < (*types)->nelts; n++) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2017
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2018 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
2019 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2020 "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
2021 goto next;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2022 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2023 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2024
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2025 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2026 if (type == NULL) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2027 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2028 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2029
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2030 type->key = value[i];
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2031 type->key_hash = hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2032 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
2033
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
2034 next:
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
2035
1b8459a53e4b Avoided to add duplicate hash key in ngx_http_types_slot().
Gu Feng <flygoast@126.com>
parents: 5741
diff changeset
2036 continue;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2037 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2038
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2039 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2040 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2041
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2042
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2043 char *
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2044 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
2045 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
2046 ngx_str_t *default_types)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2047 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2048 ngx_hash_init_t hash;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2049
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2050 if (*keys) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2051
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2052 if (*keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2053 return NGX_CONF_OK;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2054 }
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2055
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2056 hash.hash = types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2057 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2058 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2059 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2060 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2061 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2062 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2063
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2064 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
2065 return NGX_CONF_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2066 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2067
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2068 return NGX_CONF_OK;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2069 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2070
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2071 if (prev_types_hash->buckets == NULL) {
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2072
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2073 if (*prev_keys == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2074
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2075 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
2076 != NGX_OK)
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2077 {
2223
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2078 return NGX_CONF_ERROR;
005fc65f7ce7 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2219
diff changeset
2079 }
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2080
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2081 } else if (*prev_keys == (void *) -1) {
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2082 *keys = *prev_keys;
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2083 return NGX_CONF_OK;
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2084 }
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2085
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2086 hash.hash = prev_types_hash;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2087 hash.key = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2088 hash.max_size = 2048;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2089 hash.bucket_size = 64;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2090 hash.name = "test_types_hash";
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2091 hash.pool = cf->pool;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2092 hash.temp_pool = NULL;
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2093
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2094 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
2095 != NGX_OK)
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3258
diff changeset
2096 {
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2097 return NGX_CONF_ERROR;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2098 }
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
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2101 *types_hash = *prev_types_hash;
2138
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 return NGX_CONF_OK;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2104
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2105 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2106
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2107
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2108 ngx_int_t
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2109 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
2110 ngx_str_t *default_type)
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2111 {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2112 ngx_hash_key_t *type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2113
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2114 *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
2115 if (*types == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2116 return NGX_ERROR;
2138
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
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2119 while (default_type->len) {
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2120
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2121 type = ngx_array_push(*types);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2122 if (type == NULL) {
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2123 return NGX_ERROR;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2124 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2125
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2126 type->key = *default_type;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2127 type->key_hash = ngx_hash_key(default_type->data,
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2128 default_type->len);
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2129 type->value = (void *) 4;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2130
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2131 default_type++;
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2132 }
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2133
2175
a69886fc2864 *) fix segfaults in types hash
Igor Sysoev <igor@sysoev.ru>
parents: 2166
diff changeset
2134 return NGX_OK;
2138
fb3b084e7d42 test Content-Type via hash:
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
2135 }