annotate src/stream/ngx_stream_map_module.c @ 6832:ec10ce307dc0

Map: the "volatile" parameter. By default, "map" creates cacheable variables [1]. With this parameter it creates a non-cacheable variable. An original idea was to deduce the cacheability of the "map" variable by checking the cacheability of variables specified in source and resulting values, but it turned to be too hard. For example, a cacheable variable can be overridden with the "set" directive or with the SSI "set" command. Also, keeping "map" variables cacheable by default is good for performance reasons. This required adding a new parameter. [1] Before db699978a33f (1.11.0), the cacheability of the "map" variable could vary depending on the cacheability of variables specified in resulting values (ticket #1090). This is believed to be a bug rather than a feature.
author Ruslan Ermilov <ru@nginx.com>
date Thu, 08 Dec 2016 17:51:49 +0300
parents 014905eb7b3d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5 */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 typedef struct {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 ngx_uint_t hash_max_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 ngx_uint_t hash_bucket_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 } ngx_stream_map_conf_t;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19 typedef struct {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 ngx_hash_keys_arrays_t keys;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 ngx_array_t *values_hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 ngx_array_t regexes;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 ngx_stream_variable_value_t *default_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 ngx_conf_t *cf;
6832
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
29 unsigned hostnames:1;
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
30 unsigned no_cacheable:1;
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 } ngx_stream_map_conf_ctx_t;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 typedef struct {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_stream_map_t map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_stream_complex_value_t value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 ngx_stream_variable_value_t *default_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 ngx_uint_t hostnames; /* unsigned hostnames:1 */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 } ngx_stream_map_ctx_t;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 static int ngx_libc_cdecl ngx_stream_map_cmp_dns_wildcards(const void *one,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 const void *two);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 static void *ngx_stream_map_create_conf(ngx_conf_t *cf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 static char *ngx_stream_map_block(ngx_conf_t *cf, ngx_command_t *cmd,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 void *conf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 static char *ngx_stream_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 static ngx_command_t ngx_stream_map_commands[] = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 { ngx_string("map"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 ngx_stream_map_block,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 { ngx_string("map_hash_max_size"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 ngx_conf_set_num_slot,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 offsetof(ngx_stream_map_conf_t, hash_max_size),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 { ngx_string("map_hash_bucket_size"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 ngx_conf_set_num_slot,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 offsetof(ngx_stream_map_conf_t, hash_bucket_size),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 ngx_null_command
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 };
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 static ngx_stream_module_t ngx_stream_map_module_ctx = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 NULL, /* preconfiguration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 NULL, /* postconfiguration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 ngx_stream_map_create_conf, /* create main configuration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 NULL, /* init main configuration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 NULL, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6609
diff changeset
85 NULL /* merge server configuration */
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 };
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 ngx_module_t ngx_stream_map_module = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 NGX_MODULE_V1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 &ngx_stream_map_module_ctx, /* module context */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 ngx_stream_map_commands, /* module directives */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 NGX_STREAM_MODULE, /* module type */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 NULL, /* init master */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 NULL, /* init module */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 NULL, /* init process */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 NULL, /* init thread */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 NULL, /* exit thread */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 NULL, /* exit process */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 NULL, /* exit master */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 NGX_MODULE_V1_PADDING
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 };
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 static ngx_int_t
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 ngx_stream_map_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 uintptr_t data)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 ngx_stream_map_ctx_t *map = (ngx_stream_map_ctx_t *) data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 ngx_str_t val, str;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 ngx_stream_complex_value_t *cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 ngx_stream_variable_value_t *value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 "stream map started");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 if (ngx_stream_complex_value(s, &map->value, &val) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 return NGX_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 val.len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 value = ngx_stream_map_find(s, &map->map, &val);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 if (value == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 value = map->default_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 if (!value->valid) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 cv = (ngx_stream_complex_value_t *) value->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 if (ngx_stream_complex_value(s, cv, &str) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 return NGX_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 v->valid = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 v->no_cacheable = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 v->not_found = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 v->len = str.len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 v->data = str.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 *v = *value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 "stream map: \"%V\" \"%v\"", &val, v);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 return NGX_OK;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 static void *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 ngx_stream_map_create_conf(ngx_conf_t *cf)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 ngx_stream_map_conf_t *mcf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 mcf = ngx_palloc(cf->pool, sizeof(ngx_stream_map_conf_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 if (mcf == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 return NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 mcf->hash_max_size = NGX_CONF_UNSET_UINT;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 return mcf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 static char *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 ngx_stream_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 ngx_stream_map_conf_t *mcf = conf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 char *rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 ngx_str_t *value, name;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 ngx_conf_t save;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 ngx_pool_t *pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 ngx_hash_init_t hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 ngx_stream_map_ctx_t *map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 ngx_stream_variable_t *var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 ngx_stream_map_conf_ctx_t ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 ngx_stream_compile_complex_value_t ccv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 mcf->hash_max_size = 2048;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 mcf->hash_bucket_size = ngx_cacheline_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 ngx_cacheline_size);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 map = ngx_pcalloc(cf->pool, sizeof(ngx_stream_map_ctx_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 if (map == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 value = cf->args->elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 ccv.cf = cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 ccv.value = &value[1];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 ccv.complex_value = &map->value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 name = value[2];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 if (name.data[0] != '$') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 "invalid variable name \"%V\"", &name);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 name.len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 name.data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 if (var == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 var->get_handler = ngx_stream_map_variable;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 var->data = (uintptr_t) map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 if (pool == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 ctx.keys.pool = cf->pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 ctx.keys.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 if (ctx.values_hash == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 if (ngx_array_init(&ctx.regexes, cf->pool, 2,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 sizeof(ngx_stream_map_regex_t))
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 ctx.default_value = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 ctx.cf = &save;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 ctx.hostnames = 0;
6832
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
268 ctx.no_cacheable = 0;
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 save = *cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 cf->pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 cf->ctx = &ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 cf->handler = ngx_stream_map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 cf->handler_conf = conf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 rv = ngx_conf_parse(cf, NULL);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 *cf = save;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 if (rv != NGX_CONF_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 return rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284
6832
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
285 if (ctx.no_cacheable) {
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
286 var->flags |= NGX_STREAM_VAR_NOCACHEABLE;
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
287 }
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
288
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 map->default_value = ctx.default_value ? ctx.default_value:
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 &ngx_stream_variable_null_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 map->hostnames = ctx.hostnames;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 hash.key = ngx_hash_key_lc;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 hash.max_size = mcf->hash_max_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 hash.bucket_size = mcf->hash_bucket_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 hash.name = "map_hash";
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 hash.pool = cf->pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 if (ctx.keys.keys.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 hash.hash = &map->map.hash.hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 hash.temp_pool = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 if (ctx.keys.dns_wc_head.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 ngx_qsort(ctx.keys.dns_wc_head.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 (size_t) ctx.keys.dns_wc_head.nelts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 hash.hash = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 hash.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 ctx.keys.dns_wc_head.nelts)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 if (ctx.keys.dns_wc_tail.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 ngx_qsort(ctx.keys.dns_wc_tail.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 (size_t) ctx.keys.dns_wc_tail.nelts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 hash.hash = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 hash.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 ctx.keys.dns_wc_tail.nelts)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 if (ctx.regexes.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 map->map.regex = ctx.regexes.elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 map->map.nregex = ctx.regexes.nelts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 return rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 static int ngx_libc_cdecl
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 ngx_stream_map_cmp_dns_wildcards(const void *one, const void *two)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 ngx_hash_key_t *first, *second;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 first = (ngx_hash_key_t *) one;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 second = (ngx_hash_key_t *) two;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 return ngx_dns_strcmp(first->key.data, second->key.data);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 static char *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 ngx_stream_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 u_char *data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 size_t len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 ngx_int_t rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 ngx_str_t *value, v;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386 ngx_uint_t i, key;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 ngx_stream_map_conf_ctx_t *ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 ngx_stream_complex_value_t cv, *cvp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 ngx_stream_variable_value_t *var, **vp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 ngx_stream_compile_complex_value_t ccv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 ctx = cf->ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 value = cf->args->elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 if (cf->args->nelts == 1
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 && ngx_strcmp(value[0].data, "hostnames") == 0)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 ctx->hostnames = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 return NGX_CONF_OK;
6831
014905eb7b3d Map: simplified "map" block parser.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
401 }
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402
6832
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
403 if (cf->args->nelts == 1
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
404 && ngx_strcmp(value[0].data, "volatile") == 0)
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
405 {
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
406 ctx->no_cacheable = 1;
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
407 return NGX_CONF_OK;
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
408 }
ec10ce307dc0 Map: the "volatile" parameter.
Ruslan Ermilov <ru@nginx.com>
parents: 6831
diff changeset
409
6831
014905eb7b3d Map: simplified "map" block parser.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
410 if (cf->args->nelts != 2) {
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 "invalid number of the map parameters");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416 if (ngx_strcmp(value[0].data, "include") == 0) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 return ngx_conf_include(cf, dummy, conf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 key = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422 for (i = 0; i < value[1].len; i++) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 key = ngx_hash(key, value[1].data[i]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 key %= ctx->keys.hsize;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 vp = ctx->values_hash[key].elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 if (vp) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 for (i = 0; i < ctx->values_hash[key].nelts; i++) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 if (vp[i]->valid) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 data = vp[i]->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 len = vp[i]->len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 cvp = (ngx_stream_complex_value_t *) vp[i]->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 data = cvp->value.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 len = cvp->value.len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 if (value[1].len != len) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 continue;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 if (ngx_strncmp(value[1].data, data, len) == 0) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 var = vp[i];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 goto found;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 sizeof(ngx_stream_variable_value_t *))
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 var = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_variable_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 if (var == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 v.len = value[1].len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 v.data = ngx_pstrdup(ctx->keys.pool, &value[1]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 if (v.data == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 ccv.cf = ctx->cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 ccv.value = &v;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 ccv.complex_value = &cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 if (cv.lengths != NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484 cvp = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_complex_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 if (cvp == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489 *cvp = cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 var->len = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 var->data = (u_char *) cvp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 var->valid = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 var->len = v.len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 var->data = v.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498 var->valid = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 var->no_cacheable = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 var->not_found = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 vp = ngx_array_push(&ctx->values_hash[key]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 if (vp == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 *vp = var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 found:
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 if (ngx_strcmp(value[0].data, "default") == 0) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 if (ctx->default_value) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 "duplicate default map parameter");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 ctx->default_value = var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 return NGX_CONF_OK;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 if (value[0].len && value[0].data[0] == '~') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 ngx_regex_compile_t rc;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 ngx_stream_map_regex_t *regex;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 u_char errstr[NGX_MAX_CONF_ERRSTR];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 regex = ngx_array_push(&ctx->regexes);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 if (regex == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 if (value[0].data[0] == '*') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 rc.options = NGX_REGEX_CASELESS;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 rc.pattern = value[0];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 rc.err.len = NGX_MAX_CONF_ERRSTR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 rc.err.data = errstr;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 regex->regex = ngx_stream_regex_compile(ctx->cf, &rc);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 if (regex->regex == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 regex->value = var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 return NGX_CONF_OK;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 if (value[0].len && value[0].data[0] == '\\') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 rv = ngx_hash_add_key(&ctx->keys, &value[0], var,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 if (rv == NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 return NGX_CONF_OK;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 if (rv == NGX_DECLINED) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579 "invalid hostname or wildcard \"%V\"", &value[0]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 if (rv == NGX_BUSY) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 "conflicting parameter \"%V\"", &value[0]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 }