annotate src/http/modules/ngx_http_map_module.c @ 6230:2a621245f4cf

Win32: MSVC 2015 compatibility. Resolved warnings about declarations that hide previous local declarations. Warnings about WSASocketA() being deprecated resolved by explicit use of WSASocketW() instead of WSASocket(). When compiling without IPv6 support, WinSock deprecated warnings are disabled to allow use of gethostbyname().
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 17 Aug 2015 18:09:17 +0300
parents 79b9101cecf4
children f01ab2dbcfdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3930
diff changeset
4 * Copyright (C) Nginx, Inc.
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 typedef struct {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 ngx_uint_t hash_max_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 ngx_uint_t hash_bucket_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 } ngx_http_map_conf_t;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 typedef struct {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
20 ngx_hash_keys_arrays_t keys;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 ngx_array_t *values_hash;
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
23 ngx_array_t var_values;
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
24 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
25 ngx_array_t regexes;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
26 #endif
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 ngx_http_variable_value_t *default_value;
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
29 ngx_conf_t *cf;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_uint_t hostnames; /* unsigned hostnames:1 */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 } ngx_http_map_conf_ctx_t;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 typedef struct {
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
35 ngx_http_map_t map;
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
36 ngx_http_complex_value_t value;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 ngx_http_variable_value_t *default_value;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 ngx_uint_t hostnames; /* unsigned hostnames:1 */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 } ngx_http_map_ctx_t;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 static int ngx_libc_cdecl ngx_http_map_cmp_dns_wildcards(const void *one,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 const void *two);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 static void *ngx_http_map_create_conf(ngx_conf_t *cf);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 static char *ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 static char *ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 static ngx_command_t ngx_http_map_commands[] = {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 { ngx_string("map"),
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 ngx_http_map_block,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 NGX_HTTP_MAIN_CONF_OFFSET,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 0,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NULL },
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 { ngx_string("map_hash_max_size"),
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_conf_set_num_slot,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 NGX_HTTP_MAIN_CONF_OFFSET,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 offsetof(ngx_http_map_conf_t, hash_max_size),
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 NULL },
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 { ngx_string("map_hash_bucket_size"),
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 ngx_conf_set_num_slot,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NGX_HTTP_MAIN_CONF_OFFSET,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 offsetof(ngx_http_map_conf_t, hash_bucket_size),
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 NULL },
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 ngx_null_command
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 };
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 static ngx_http_module_t ngx_http_map_module_ctx = {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 NULL, /* preconfiguration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 NULL, /* postconfiguration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 ngx_http_map_create_conf, /* create main configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 NULL, /* init main configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NULL, /* create server configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 NULL, /* merge server configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 NULL, /* create location configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NULL /* merge location configuration */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 };
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_module_t ngx_http_map_module = {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 NGX_MODULE_V1,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 &ngx_http_map_module_ctx, /* module context */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_http_map_commands, /* module directives */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 NGX_HTTP_MODULE, /* module type */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 NULL, /* init master */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 NULL, /* init module */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 NULL, /* init process */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NULL, /* init thread */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* exit thread */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NULL, /* exit process */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NULL, /* exit master */
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NGX_MODULE_V1_PADDING
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 };
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 static ngx_int_t
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 ngx_http_map_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 uintptr_t data)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 ngx_http_map_ctx_t *map = (ngx_http_map_ctx_t *) data;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
113 ngx_str_t val;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
114 ngx_http_variable_value_t *value;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 "http map started");
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
119 if (ngx_http_complex_value(r, &map->value, &val) != NGX_OK) {
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
120 return NGX_ERROR;
797
36f7b549f481 fix segfault if $server_addr failed
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
121 }
36f7b549f481 fix segfault if $server_addr failed
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
122
4712
fd3eefefa5f9 map: strip final dot before looking up in a map of hostnames.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
123 if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') {
fd3eefefa5f9 map: strip final dot before looking up in a map of hostnames.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
124 val.len--;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126
3929
fa4612bfb9fa change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents: 3874
diff changeset
127 value = ngx_http_map_find(r, &map->map, &val);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
129 if (value == NULL) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
130 value = map->default_value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
131 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
132
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
133 if (!value->valid) {
5362
79b9101cecf4 Handling of ngx_int_t != intptr_t case.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
134 value = ngx_http_get_flushed_variable(r, (uintptr_t) value->data);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
136 if (value == NULL || value->not_found) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
137 value = &ngx_http_variable_null_value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
138 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
141 *v = *value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
142
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
144 "http map: \"%v\" \"%v\"", &val, v);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 return NGX_OK;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 static void *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_http_map_create_conf(ngx_conf_t *cf)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 ngx_http_map_conf_t *mcf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 mcf = ngx_palloc(cf->pool, sizeof(ngx_http_map_conf_t));
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 if (mcf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
157 return NULL;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 mcf->hash_max_size = NGX_CONF_UNSET_UINT;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 return mcf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 static char *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 ngx_http_map_conf_t *mcf = conf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
172 char *rv;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
173 ngx_str_t *value, name;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
174 ngx_conf_t save;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
175 ngx_pool_t *pool;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
176 ngx_hash_init_t hash;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
177 ngx_http_map_ctx_t *map;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
178 ngx_http_variable_t *var;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
179 ngx_http_map_conf_ctx_t ctx;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
180 ngx_http_compile_complex_value_t ccv;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 mcf->hash_max_size = 2048;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 mcf->hash_bucket_size = ngx_cacheline_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 } else {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 ngx_cacheline_size);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 map = ngx_pcalloc(cf->pool, sizeof(ngx_http_map_ctx_t));
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 if (map == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 value = cf->args->elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
201 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
203 ccv.cf = cf;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
204 ccv.value = &value[1];
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
205 ccv.complex_value = &map->value;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
207 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 name = value[2];
4972
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
212
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
213 if (name.data[0] != '$') {
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
214 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
215 "invalid variable name \"%V\"", &name);
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
216 return NGX_CONF_ERROR;
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
217 }
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4827
diff changeset
218
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 name.len--;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 name.data++;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
222 var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 if (var == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
227 var->get_handler = ngx_http_map_variable;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 var->data = (uintptr_t) map;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
5124
5482671df278 Use NGX_DEFAULT_POOL_SIZE macro where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 4972
diff changeset
230 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 if (pool == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
235 ctx.keys.pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
236 ctx.keys.temp_pool = pool;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
238 if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
243 ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 if (ctx.values_hash == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
249 if (ngx_array_init(&ctx.var_values, cf->pool, 2,
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
250 sizeof(ngx_http_variable_value_t))
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
251 != NGX_OK)
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
252 {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
253 ngx_destroy_pool(pool);
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
254 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
255 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
256
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
257 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
258 if (ngx_array_init(&ctx.regexes, cf->pool, 2, sizeof(ngx_http_map_regex_t))
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
259 != NGX_OK)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
260 {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
261 ngx_destroy_pool(pool);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
262 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
263 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
264 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
265
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 ctx.default_value = NULL;
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
267 ctx.cf = &save;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 ctx.hostnames = 0;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 save = *cf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271 cf->pool = pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 cf->ctx = &ctx;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 cf->handler = ngx_http_map;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 cf->handler_conf = conf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 rv = ngx_conf_parse(cf, NULL);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 *cf = save;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 if (rv != NGX_CONF_OK) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 return rv;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
285 map->default_value = ctx.default_value ? ctx.default_value:
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
286 &ngx_http_variable_null_value;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
287
4712
fd3eefefa5f9 map: strip final dot before looking up in a map of hostnames.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
288 map->hostnames = ctx.hostnames;
fd3eefefa5f9 map: strip final dot before looking up in a map of hostnames.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
289
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 hash.key = ngx_hash_key_lc;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 hash.max_size = mcf->hash_max_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 hash.bucket_size = mcf->hash_bucket_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 hash.name = "map_hash";
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 hash.pool = cf->pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
296 if (ctx.keys.keys.nelts) {
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
297 hash.hash = &map->map.hash.hash;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 hash.temp_pool = NULL;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
300 if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts)
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
301 != NGX_OK)
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
302 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
303 ngx_destroy_pool(pool);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
308 if (ctx.keys.dns_wc_head.nelts) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
310 ngx_qsort(ctx.keys.dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
311 (size_t) ctx.keys.dns_wc_head.nelts,
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 hash.hash = NULL;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 hash.temp_pool = pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
317 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
318 ctx.keys.dns_wc_head.nelts)
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 != NGX_OK)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
321 ngx_destroy_pool(pool);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
325 map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
326 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
327
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
328 if (ctx.keys.dns_wc_tail.nelts) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
329
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
330 ngx_qsort(ctx.keys.dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
331 (size_t) ctx.keys.dns_wc_tail.nelts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
332 sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
333
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
334 hash.hash = NULL;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
335 hash.temp_pool = pool;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
336
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
337 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
338 ctx.keys.dns_wc_tail.nelts)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
339 != NGX_OK)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
340 {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
341 ngx_destroy_pool(pool);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
342 return NGX_CONF_ERROR;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
343 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
344
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
345 map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
348 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
349
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
350 if (ctx.regexes.nelts) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
351 map->map.regex = ctx.regexes.elts;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
352 map->map.nregex = ctx.regexes.nelts;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
353 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
354
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
355 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
356
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359 return rv;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 static int ngx_libc_cdecl
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 ngx_http_map_cmp_dns_wildcards(const void *one, const void *two)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 ngx_hash_key_t *first, *second;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 first = (ngx_hash_key_t *) one;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 second = (ngx_hash_key_t *) two;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
371 return ngx_dns_strcmp(first->key.data, second->key.data);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 static char *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 {
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5362
diff changeset
378 ngx_int_t rv, index;
4827
6e46016ea276 Fixed the "include" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4814
diff changeset
379 ngx_str_t *value, name;
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
380 ngx_uint_t i, key;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 ngx_http_map_conf_ctx_t *ctx;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
382 ngx_http_variable_value_t *var, **vp;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 ctx = cf->ctx;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 value = cf->args->elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 if (cf->args->nelts == 1
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 && ngx_strcmp(value[0].data, "hostnames") == 0)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 ctx->hostnames = 1;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 return NGX_CONF_OK;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 } else if (cf->args->nelts != 2) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 "invalid number of the map parameters");
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 if (ngx_strcmp(value[0].data, "include") == 0) {
4827
6e46016ea276 Fixed the "include" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 4814
diff changeset
401 return ngx_conf_include(cf, dummy, conf);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
404 if (value[1].data[0] == '$') {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
405 name = value[1];
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
406 name.len--;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
407 name.data++;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
408
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
409 index = ngx_http_get_variable_index(ctx->cf, &name);
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
410 if (index == NGX_ERROR) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
411 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
412 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
413
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
414 var = ctx->var_values.elts;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
415
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
416 for (i = 0; i < ctx->var_values.nelts; i++) {
5362
79b9101cecf4 Handling of ngx_int_t != intptr_t case.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
417 if (index == (intptr_t) var[i].data) {
4814
0656cfe8f7cb Map: fixed optimization of variables as values.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4712
diff changeset
418 var = &var[i];
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
419 goto found;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
420 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
421 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
422
4814
0656cfe8f7cb Map: fixed optimization of variables as values.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4712
diff changeset
423 var = ngx_array_push(&ctx->var_values);
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
424 if (var == NULL) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
425 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
426 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
427
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
428 var->valid = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
429 var->no_cacheable = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
430 var->not_found = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
431 var->len = 0;
5362
79b9101cecf4 Handling of ngx_int_t != intptr_t case.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5124
diff changeset
432 var->data = (u_char *) (intptr_t) index;
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
433
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
434 goto found;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
435 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
436
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 key = 0;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 for (i = 0; i < value[1].len; i++) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 key = ngx_hash(key, value[1].data[i]);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
443 key %= ctx->keys.hsize;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 vp = ctx->values_hash[key].elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 if (vp) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 for (i = 0; i < ctx->values_hash[key].nelts; i++) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 if (value[1].len != (size_t) vp[i]->len) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 continue;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 if (ngx_strncmp(value[1].data, vp[i]->data, value[1].len) == 0) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 var = vp[i];
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 goto found;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 } else {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460 if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 sizeof(ngx_http_variable_value_t *))
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 != NGX_OK)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
468 var = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_variable_value_t));
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 if (var == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 var->len = value[1].len;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
474 var->data = ngx_pstrdup(ctx->keys.pool, &value[1]);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 if (var->data == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 var->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
480 var->no_cacheable = 0;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 var->not_found = 0;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 vp = ngx_array_push(&ctx->values_hash[key]);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 if (vp == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 *vp = var;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 found:
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
492 if (ngx_strcmp(value[0].data, "default") == 0) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
494 if (ctx->default_value) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
496 "duplicate default map parameter");
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
500 ctx->default_value = var;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
501
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
502 return NGX_CONF_OK;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
505 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
506
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
507 if (value[0].len && value[0].data[0] == '~') {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
508 ngx_regex_compile_t rc;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
509 ngx_http_map_regex_t *regex;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
510 u_char errstr[NGX_MAX_CONF_ERRSTR];
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
511
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
512 regex = ngx_array_push(&ctx->regexes);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
513 if (regex == NULL) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
514 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
515 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
516
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
517 value[0].len--;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
518 value[0].data++;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
519
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
520 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
521
3930
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
522 if (value[0].data[0] == '*') {
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
523 value[0].len--;
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
524 value[0].data++;
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
525 rc.options = NGX_REGEX_CASELESS;
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
526 }
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
527
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
528 rc.pattern = value[0];
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
529 rc.err.len = NGX_MAX_CONF_ERRSTR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
530 rc.err.data = errstr;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
531
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
532 regex->regex = ngx_http_regex_compile(ctx->cf, &rc);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
533 if (regex->regex == NULL) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
534 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
535 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
536
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
537 regex->value = var;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
538
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
539 return NGX_CONF_OK;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
540 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
541
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
542 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
543
3791
11701c4c0358 use "\" to escape "default", "include", and "hostnames" values instead of "!"
Igor Sysoev <igor@sysoev.ru>
parents: 3790
diff changeset
544 if (value[0].len && value[0].data[0] == '\\') {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
545 value[0].len--;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
546 value[0].data++;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
547 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
548
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5362
diff changeset
549 rv = ngx_hash_add_key(&ctx->keys, &value[0], var,
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
550 (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5362
diff changeset
552 if (rv == NGX_OK) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
553 return NGX_CONF_OK;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
554 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5362
diff changeset
556 if (rv == NGX_DECLINED) {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
557 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
558 "invalid hostname or wildcard \"%V\"", &value[0]);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
559 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
560
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5362
diff changeset
561 if (rv == NGX_BUSY) {
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
562 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
563 "conflicting parameter \"%V\"", &value[0]);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
564 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
566 return NGX_CONF_ERROR;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 }