annotate src/http/modules/ngx_http_map_module.c @ 4727:1c7616100797 stable-1.2

Merge of r4688, r4689, r4706: *) Mp4: fixed non-keyframe seeks in some cases (ticket #175). Number of entries in stsc atom was wrong if we've added an entry to split a chunk. Additionally, there is no need to add an entry if we are going to split last chunk in an entry, it's enough to update the entry we already have. Previously new entry was added and old one was left as is, resulting in incorrect entry with zero chunks which might confuse some software. *) Mp4: fixed streaming if moov atom is at buffer edge.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 02 Jul 2012 16:56:53 +0000
parents d620f497c50f
children fd3eefefa5f9
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
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 size_t len;
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
114 ngx_str_t val;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
115 ngx_http_variable_value_t *value;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 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
118 "http map started");
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
120 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
121 return NGX_ERROR;
797
36f7b549f481 fix segfault if $server_addr failed
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
122 }
36f7b549f481 fix segfault if $server_addr failed
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
123
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
124 len = val.len;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
126 if (len && map->hostnames && val.data[len - 1] == '.') {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 len--;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
3929
fa4612bfb9fa change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents: 3874
diff changeset
130 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
131
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
132 if (value == NULL) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
133 value = map->default_value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
134 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
135
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
136 if (!value->valid) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
137 value = ngx_http_get_flushed_variable(r, (ngx_uint_t) value->data);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
139 if (value == NULL || value->not_found) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
140 value = &ngx_http_variable_null_value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
141 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
144 *v = *value;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
145
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 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
147 "http map: \"%v\" \"%v\"", &val, v);
589
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 return NGX_OK;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
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 static void *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 ngx_http_map_create_conf(ngx_conf_t *cf)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 ngx_http_map_conf_t *mcf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 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
159 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
160 return NULL;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 }
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 mcf->hash_max_size = NGX_CONF_UNSET_UINT;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;
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 return mcf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
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 static char *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 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
172 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 ngx_http_map_conf_t *mcf = conf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
175 char *rv;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
176 ngx_str_t *value, name;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
177 ngx_conf_t save;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
178 ngx_pool_t *pool;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
179 ngx_hash_init_t hash;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
180 ngx_http_map_ctx_t *map;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
181 ngx_http_variable_t *var;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
182 ngx_http_map_conf_ctx_t ctx;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
183 ngx_http_compile_complex_value_t ccv;
589
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 if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 mcf->hash_max_size = 2048;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 }
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 if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 mcf->hash_bucket_size = ngx_cacheline_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 } else {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 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
194 ngx_cacheline_size);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 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
198 if (map == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 value = cf->args->elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
204 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
205
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
206 ccv.cf = cf;
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
207 ccv.value = &value[1];
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
208 ccv.complex_value = &map->value;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209
3789
19c931be8b98 allow expressions in the first "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
210 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
211 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 name = value[2];
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 name.len--;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 name.data++;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
218 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
219 if (var == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
223 var->get_handler = ngx_http_map_variable;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 var->data = (uintptr_t) map;
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 pool = ngx_create_pool(16384, cf->log);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 if (pool == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
231 ctx.keys.pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
232 ctx.keys.temp_pool = pool;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
234 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
235 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
239 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
240 if (ctx.values_hash == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
245 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
246 sizeof(ngx_http_variable_value_t))
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
247 != NGX_OK)
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
248 {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
249 ngx_destroy_pool(pool);
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
250 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
251 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
252
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
253 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
254 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
255 != NGX_OK)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
256 {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
257 ngx_destroy_pool(pool);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
258 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
259 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
260 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
261
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 ctx.default_value = NULL;
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
263 ctx.cf = &save;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 ctx.hostnames = 0;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 save = *cf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 cf->pool = pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 cf->ctx = &ctx;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 cf->handler = ngx_http_map;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 cf->handler_conf = conf;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 rv = ngx_conf_parse(cf, NULL);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 *cf = save;
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 if (rv != NGX_CONF_OK) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 return rv;
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
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
281 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
282 &ngx_http_variable_null_value;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
283
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 hash.key = ngx_hash_key_lc;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 hash.max_size = mcf->hash_max_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 hash.bucket_size = mcf->hash_bucket_size;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 hash.name = "map_hash";
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 hash.pool = cf->pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
290 if (ctx.keys.keys.nelts) {
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
291 hash.hash = &map->map.hash.hash;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 hash.temp_pool = NULL;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
294 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
295 != NGX_OK)
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
296 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
297 ngx_destroy_pool(pool);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
302 if (ctx.keys.dns_wc_head.nelts) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
304 ngx_qsort(ctx.keys.dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
305 (size_t) ctx.keys.dns_wc_head.nelts,
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 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
307
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 hash.hash = NULL;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 hash.temp_pool = pool;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
311 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
312 ctx.keys.dns_wc_head.nelts)
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 != NGX_OK)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
315 ngx_destroy_pool(pool);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
319 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
320 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
321
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
322 if (ctx.keys.dns_wc_tail.nelts) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
323
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
324 ngx_qsort(ctx.keys.dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
325 (size_t) ctx.keys.dns_wc_tail.nelts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
326 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
327
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
328 hash.hash = NULL;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
329 hash.temp_pool = pool;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
330
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
331 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
332 ctx.keys.dns_wc_tail.nelts)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
333 != NGX_OK)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
334 {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
335 ngx_destroy_pool(pool);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
336 return NGX_CONF_ERROR;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
337 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
338
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
339 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
340 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
342 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
343
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
344 if (ctx.regexes.nelts) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
345 map->map.regex = ctx.regexes.elts;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
346 map->map.nregex = ctx.regexes.nelts;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
347 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
348
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
349 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
350
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 ngx_destroy_pool(pool);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 return rv;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 static int ngx_libc_cdecl
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 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
359 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 ngx_hash_key_t *first, *second;
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 first = (ngx_hash_key_t *) one;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 second = (ngx_hash_key_t *) two;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
365 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
366 }
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
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 static char *
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 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
371 {
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
372 ngx_int_t rc, index;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
373 ngx_str_t *value, file, name;
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
374 ngx_uint_t i, key;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 ngx_http_map_conf_ctx_t *ctx;
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
376 ngx_http_variable_value_t *var, **vp;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 ctx = cf->ctx;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 value = cf->args->elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 if (cf->args->nelts == 1
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 && ngx_strcmp(value[0].data, "hostnames") == 0)
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 ctx->hostnames = 1;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 return NGX_CONF_OK;
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 } else if (cf->args->nelts != 2) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 "invalid number of the map parameters");
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 }
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 if (ngx_strcmp(value[0].data, "include") == 0) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 file = value[1];
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
3642
ac33852faaac style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
397 if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 return NGX_CONF_ERROR;
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
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);
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 return ngx_conf_parse(cf, &file);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
3792
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
406 if (value[1].data[0] == '$') {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
407 name = value[1];
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
408 name.len--;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
409 name.data++;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
410
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
411 index = ngx_http_get_variable_index(ctx->cf, &name);
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
412 if (index == NGX_ERROR) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
413 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
414 }
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 var = ctx->var_values.elts;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
417
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
418 for (i = 0; i < ctx->var_values.nelts; i++) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
419 if (index == (ngx_int_t) var[i].data) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
420 goto found;
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 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
423
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
424 var = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_variable_value_t));
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
425 if (var == NULL) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
426 return NGX_CONF_ERROR;
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
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
429 var->valid = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
430 var->no_cacheable = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
431 var->not_found = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
432 var->len = 0;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
433 var->data = (u_char *) index;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
434
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
435 vp = ngx_array_push(&ctx->var_values);
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
436 if (vp == NULL) {
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
437 return NGX_CONF_ERROR;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
438 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
439
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
440 *vp = var;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
441
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
442 goto found;
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
443 }
164a7f8df979 allow variable as "map" value
Igor Sysoev <igor@sysoev.ru>
parents: 3791
diff changeset
444
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 key = 0;
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 for (i = 0; i < value[1].len; i++) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 key = ngx_hash(key, value[1].data[i]);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
451 key %= ctx->keys.hsize;
589
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 vp = ctx->values_hash[key].elts;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 if (vp) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 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
457 if (value[1].len != (size_t) vp[i]->len) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 continue;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 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
462 var = vp[i];
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 goto found;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 }
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 } else {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 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
469 sizeof(ngx_http_variable_value_t *))
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 != NGX_OK)
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 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
476 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
477 if (var == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 var->len = value[1].len;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 591
diff changeset
482 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
483 if (var->data == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 }
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 var->valid = 1;
1565
4c43e25d11ea fix English grammar
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
488 var->no_cacheable = 0;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 var->not_found = 0;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 vp = ngx_array_push(&ctx->values_hash[key]);
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 if (vp == NULL) {
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 *vp = var;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 found:
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 if (ngx_strcmp(value[0].data, "default") == 0) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
502 if (ctx->default_value) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 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
504 "duplicate default map parameter");
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 return NGX_CONF_ERROR;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
508 ctx->default_value = var;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
509
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
510 return NGX_CONF_OK;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 }
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
513 #if (NGX_PCRE)
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
514
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
515 if (value[0].len && value[0].data[0] == '~') {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
516 ngx_regex_compile_t rc;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
517 ngx_http_map_regex_t *regex;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
518 u_char errstr[NGX_MAX_CONF_ERRSTR];
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 regex = ngx_array_push(&ctx->regexes);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
521 if (regex == NULL) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
522 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
523 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
524
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
525 value[0].len--;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
526 value[0].data++;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
527
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
528 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
529
3930
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
530 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
531 value[0].len--;
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
532 value[0].data++;
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
533 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
534 }
ace14fd91086 revert r3875 since now map uses case sensetive regexes by default
Igor Sysoev <igor@sysoev.ru>
parents: 3929
diff changeset
535
3872
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
536 rc.pattern = value[0];
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
537 rc.err.len = NGX_MAX_CONF_ERRSTR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
538 rc.err.data = errstr;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
539
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
540 regex->regex = ngx_http_regex_compile(ctx->cf, &rc);
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
541 if (regex->regex == NULL) {
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
542 return NGX_CONF_ERROR;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
543 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
544
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
545 regex->value = var;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
546
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
547 return NGX_CONF_OK;
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
548 }
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
549
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
550 #endif
83cd1910329c allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents: 3792
diff changeset
551
3791
11701c4c0358 use "\" to escape "default", "include", and "hostnames" values instead of "!"
Igor Sysoev <igor@sysoev.ru>
parents: 3790
diff changeset
552 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
553 value[0].len--;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
554 value[0].data++;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
555 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
556
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
557 rc = ngx_hash_add_key(&ctx->keys, &value[0], var,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
558 (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
560 if (rc == NGX_OK) {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
561 return NGX_CONF_OK;
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
562 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
564 if (rc == NGX_DECLINED) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
565 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
566 "invalid hostname or wildcard \"%V\"", &value[0]);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
567 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 797
diff changeset
568
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
569 if (rc == NGX_BUSY) {
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
570 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
571 "conflicting parameter \"%V\"", &value[0]);
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
572 }
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573
591
8c0cdd81580e nginx-0.3.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
574 return NGX_CONF_ERROR;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 }