annotate src/stream/ngx_stream_map_module.c @ 6694:ea9dfe2f62e7

Stream: preread phase. In this phase, head of a stream is read and analysed before proceeding to the content phase. Amount of data read is controlled by the module implementing the phase, but not more than defined by the "preread_buffer_size" directive. The time spent on processing preread is controlled by the "preread_timeout" directive. The typical preread phase module will parse the beginning of a stream and set variable that may be used by the content phase, for example to make routing decision.
author Vladimir Homutov <vl@nginx.com>
date Thu, 15 Sep 2016 14:56:02 +0300
parents 8ed51b02f655
children 014905eb7b3d
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;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 ngx_uint_t hostnames; /* unsigned hostnames:1 */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 } ngx_stream_map_conf_ctx_t;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31
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 typedef struct {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 ngx_stream_map_t map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_stream_complex_value_t value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_stream_variable_value_t *default_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 ngx_uint_t hostnames; /* unsigned hostnames:1 */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 } ngx_stream_map_ctx_t;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39
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 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
42 const void *two);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 static void *ngx_stream_map_create_conf(ngx_conf_t *cf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 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
45 void *conf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 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
47
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 static ngx_command_t ngx_stream_map_commands[] = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 { ngx_string("map"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 ngx_stream_map_block,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 { ngx_string("map_hash_max_size"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 ngx_conf_set_num_slot,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 offsetof(ngx_stream_map_conf_t, hash_max_size),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 { ngx_string("map_hash_bucket_size"),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 ngx_conf_set_num_slot,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 NGX_STREAM_MAIN_CONF_OFFSET,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 offsetof(ngx_stream_map_conf_t, hash_bucket_size),
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 NULL },
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 ngx_null_command
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 };
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 static ngx_stream_module_t ngx_stream_map_module_ctx = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 NULL, /* preconfiguration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 NULL, /* postconfiguration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 ngx_stream_map_create_conf, /* create main configuration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 NULL, /* init main configuration */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 NULL, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6609
diff changeset
84 NULL /* merge server configuration */
6609
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 };
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 ngx_module_t ngx_stream_map_module = {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 NGX_MODULE_V1,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 &ngx_stream_map_module_ctx, /* module context */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 ngx_stream_map_commands, /* module directives */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 NGX_STREAM_MODULE, /* module type */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 NULL, /* init master */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 NULL, /* init module */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 NULL, /* init process */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 NULL, /* init thread */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 NULL, /* exit thread */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 NULL, /* exit process */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 NULL, /* exit master */
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 NGX_MODULE_V1_PADDING
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 };
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 static ngx_int_t
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 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
106 uintptr_t data)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 ngx_stream_map_ctx_t *map = (ngx_stream_map_ctx_t *) data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 ngx_str_t val, str;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 ngx_stream_complex_value_t *cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 ngx_stream_variable_value_t *value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 "stream map started");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 if (ngx_stream_complex_value(s, &map->value, &val) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 return NGX_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 }
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 if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 val.len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 }
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 value = ngx_stream_map_find(s, &map->map, &val);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 if (value == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 value = map->default_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 }
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 if (!value->valid) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 cv = (ngx_stream_complex_value_t *) value->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 if (ngx_stream_complex_value(s, cv, &str) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 return NGX_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 }
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 v->valid = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 v->no_cacheable = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 v->not_found = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 v->len = str.len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 v->data = str.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 *v = *value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 }
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 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 "stream map: \"%V\" \"%v\"", &val, v);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 return NGX_OK;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 }
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 static void *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 ngx_stream_map_create_conf(ngx_conf_t *cf)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 ngx_stream_map_conf_t *mcf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 mcf = ngx_palloc(cf->pool, sizeof(ngx_stream_map_conf_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 if (mcf == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 return NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 }
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 mcf->hash_max_size = NGX_CONF_UNSET_UINT;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 return mcf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 }
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 static char *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 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
174 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175 ngx_stream_map_conf_t *mcf = conf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 char *rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 ngx_str_t *value, name;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 ngx_conf_t save;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 ngx_pool_t *pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 ngx_hash_init_t hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 ngx_stream_map_ctx_t *map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 ngx_stream_variable_t *var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 ngx_stream_map_conf_ctx_t ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 ngx_stream_compile_complex_value_t ccv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 mcf->hash_max_size = 2048;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 }
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 if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 mcf->hash_bucket_size = ngx_cacheline_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 ngx_cacheline_size);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 }
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 map = ngx_pcalloc(cf->pool, sizeof(ngx_stream_map_ctx_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 if (map == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 }
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 value = cf->args->elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 ccv.cf = cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 ccv.value = &value[1];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 ccv.complex_value = &map->value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 }
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 name = value[2];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 if (name.data[0] != '$') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 "invalid variable name \"%V\"", &name);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 }
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 name.len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 name.data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 if (var == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 }
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 var->get_handler = ngx_stream_map_variable;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 var->data = (uintptr_t) map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 if (pool == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 }
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 ctx.keys.pool = cf->pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 ctx.keys.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 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
244 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 }
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 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
249 if (ctx.values_hash == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 }
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 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 if (ngx_array_init(&ctx.regexes, cf->pool, 2,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 sizeof(ngx_stream_map_regex_t))
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 ctx.default_value = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 ctx.cf = &save;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 ctx.hostnames = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 save = *cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 cf->pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 cf->ctx = &ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 cf->handler = ngx_stream_map;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 cf->handler_conf = conf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 rv = ngx_conf_parse(cf, NULL);
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 *cf = save;
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 if (rv != NGX_CONF_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 return rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 map->default_value = ctx.default_value ? ctx.default_value:
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 &ngx_stream_variable_null_value;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 map->hostnames = ctx.hostnames;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 hash.key = ngx_hash_key_lc;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 hash.max_size = mcf->hash_max_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 hash.bucket_size = mcf->hash_bucket_size;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 hash.name = "map_hash";
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 hash.pool = cf->pool;
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 if (ctx.keys.keys.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 hash.hash = &map->map.hash.hash;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 hash.temp_pool = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 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
299 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 return NGX_CONF_ERROR;
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 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 if (ctx.keys.dns_wc_head.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 ngx_qsort(ctx.keys.dns_wc_head.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 (size_t) ctx.keys.dns_wc_head.nelts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards);
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 hash.hash = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 hash.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 ctx.keys.dns_wc_head.nelts)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 if (ctx.keys.dns_wc_tail.nelts) {
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 ngx_qsort(ctx.keys.dns_wc_tail.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 (size_t) ctx.keys.dns_wc_tail.nelts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards);
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 hash.hash = NULL;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 hash.temp_pool = pool;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 ctx.keys.dns_wc_tail.nelts)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 #if (NGX_PCRE)
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 if (ctx.regexes.nelts) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 map->map.regex = ctx.regexes.elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 map->map.nregex = ctx.regexes.nelts;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 ngx_destroy_pool(pool);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 return rv;
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
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 static int ngx_libc_cdecl
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 ngx_stream_map_cmp_dns_wildcards(const void *one, const void *two)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 ngx_hash_key_t *first, *second;
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 first = (ngx_hash_key_t *) one;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 second = (ngx_hash_key_t *) two;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 return ngx_dns_strcmp(first->key.data, second->key.data);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 }
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 static char *
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 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
375 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 u_char *data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 size_t len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 ngx_int_t rv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 ngx_str_t *value, v;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 ngx_uint_t i, key;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 ngx_stream_map_conf_ctx_t *ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 ngx_stream_complex_value_t cv, *cvp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 ngx_stream_variable_value_t *var, **vp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 ngx_stream_compile_complex_value_t ccv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386 ctx = cf->ctx;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 value = cf->args->elts;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 if (cf->args->nelts == 1
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 && ngx_strcmp(value[0].data, "hostnames") == 0)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 ctx->hostnames = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 return NGX_CONF_OK;
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 } else if (cf->args->nelts != 2) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 "invalid number of the map parameters");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 if (ngx_strcmp(value[0].data, "include") == 0) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 return ngx_conf_include(cf, dummy, conf);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 key = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 for (i = 0; i < value[1].len; i++) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 key = ngx_hash(key, value[1].data[i]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 key %= ctx->keys.hsize;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 vp = ctx->values_hash[key].elts;
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 (vp) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 for (i = 0; i < ctx->values_hash[key].nelts; i++) {
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 if (vp[i]->valid) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 data = vp[i]->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 len = vp[i]->len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 cvp = (ngx_stream_complex_value_t *) vp[i]->data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 data = cvp->value.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 len = cvp->value.len;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 if (value[1].len != len) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 continue;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 }
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 (ngx_strncmp(value[1].data, data, len) == 0) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 var = vp[i];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 goto found;
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 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 sizeof(ngx_stream_variable_value_t *))
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 != NGX_OK)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 return NGX_CONF_ERROR;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 var = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_variable_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 if (var == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 return NGX_CONF_ERROR;
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 v.len = value[1].len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 v.data = ngx_pstrdup(ctx->keys.pool, &value[1]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 if (v.data == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 return NGX_CONF_ERROR;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
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 ccv.cf = ctx->cf;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 ccv.value = &v;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 ccv.complex_value = &cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 if (cv.lengths != NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 cvp = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_complex_value_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 if (cvp == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 }
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 *cvp = cv;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 var->len = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478 var->data = (u_char *) cvp;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 var->valid = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 } else {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 var->len = v.len;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 var->data = v.data;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484 var->valid = 1;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 var->no_cacheable = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488 var->not_found = 0;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490 vp = ngx_array_push(&ctx->values_hash[key]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 if (vp == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 }
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 *vp = var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 found:
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 if (ngx_strcmp(value[0].data, "default") == 0) {
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 if (ctx->default_value) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 "duplicate default map parameter");
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 ctx->default_value = var;
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 return NGX_CONF_OK;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 #if (NGX_PCRE)
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 if (value[0].len && value[0].data[0] == '~') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 ngx_regex_compile_t rc;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 ngx_stream_map_regex_t *regex;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 u_char errstr[NGX_MAX_CONF_ERRSTR];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 regex = ngx_array_push(&ctx->regexes);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 if (regex == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 return NGX_CONF_ERROR;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 if (value[0].data[0] == '*') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532 rc.options = NGX_REGEX_CASELESS;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 rc.pattern = value[0];
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 rc.err.len = NGX_MAX_CONF_ERRSTR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 rc.err.data = errstr;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 regex->regex = ngx_stream_regex_compile(ctx->cf, &rc);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 if (regex->regex == NULL) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 return NGX_CONF_ERROR;
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
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544 regex->value = var;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 return NGX_CONF_OK;
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 #endif
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 if (value[0].len && value[0].data[0] == '\\') {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 value[0].len--;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 value[0].data++;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 rv = ngx_hash_add_key(&ctx->keys, &value[0], var,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557 (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 if (rv == NGX_OK) {
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 if (rv == NGX_DECLINED) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 "invalid hostname or wildcard \"%V\"", &value[0]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 }
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 if (rv == NGX_BUSY) {
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 "conflicting parameter \"%V\"", &value[0]);
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 }
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 return NGX_CONF_ERROR;
73543af69f14 Stream: map module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 }