Mercurial > hg > nginx
annotate src/http/modules/ngx_http_memcached_module.c @ 7361:c09c7d47acb9
SSL: logging level of "no suitable signature algorithm".
The "no suitable signature algorithm" errors are reported by OpenSSL 1.1.1
when using TLSv1.3 if there are no shared signature algorithms. In
particular, this can happen if the client limits available signature
algorithms to something we don't have a certificate for, or to an empty
list. For example, the following command:
openssl s_client -connect 127.0.0.1:8443 -sigalgs rsa_pkcs1_sha1
will always result in the "no suitable signature algorithm" error
as the "rsa_pkcs1_sha1" algorithm refers solely to signatures which
appear in certificates and not defined for use in TLS 1.3 handshake
messages.
The SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS error is what BoringSSL returns
in the same situation.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 25 Sep 2018 14:00:04 +0300 |
parents | 45e513c3540d |
children | 8b68d50090e4 |
rev | line source |
---|---|
581 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
581 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
11 | |
12 | |
13 typedef struct { | |
14 ngx_http_upstream_conf_t upstream; | |
1076 | 15 ngx_int_t index; |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
16 ngx_uint_t gzip_flag; |
581 | 17 } ngx_http_memcached_loc_conf_t; |
18 | |
19 | |
20 typedef struct { | |
21 size_t rest; | |
22 ngx_http_request_t *request; | |
597 | 23 ngx_str_t key; |
581 | 24 } ngx_http_memcached_ctx_t; |
25 | |
26 | |
27 static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r); | |
28 static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r); | |
29 static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r); | |
30 static ngx_int_t ngx_http_memcached_filter_init(void *data); | |
31 static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes); | |
32 static void ngx_http_memcached_abort_request(ngx_http_request_t *r); | |
33 static void ngx_http_memcached_finalize_request(ngx_http_request_t *r, | |
34 ngx_int_t rc); | |
35 | |
36 static void *ngx_http_memcached_create_loc_conf(ngx_conf_t *cf); | |
37 static char *ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, | |
38 void *parent, void *child); | |
39 | |
40 static char *ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, | |
41 void *conf); | |
42 | |
43 | |
44 static ngx_conf_bitmask_t ngx_http_memcached_next_upstream_masks[] = { | |
45 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, | |
46 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, | |
47 { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, | |
48 { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, | |
665 | 49 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, |
581 | 50 { ngx_null_string, 0 } |
51 }; | |
52 | |
53 | |
54 static ngx_command_t ngx_http_memcached_commands[] = { | |
55 | |
56 { ngx_string("memcached_pass"), | |
1788
f10228d7ea06
allow memached_pass inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1787
diff
changeset
|
57 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, |
581 | 58 ngx_http_memcached_pass, |
59 NGX_HTTP_LOC_CONF_OFFSET, | |
60 0, | |
61 NULL }, | |
62 | |
3271
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3061
diff
changeset
|
63 { ngx_string("memcached_bind"), |
6530
1d0e03db9f8e
Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents:
6480
diff
changeset
|
64 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, |
3399 | 65 ngx_http_upstream_bind_set_slot, |
3271
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3061
diff
changeset
|
66 NGX_HTTP_LOC_CONF_OFFSET, |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3061
diff
changeset
|
67 offsetof(ngx_http_memcached_loc_conf_t, upstream.local), |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3061
diff
changeset
|
68 NULL }, |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3061
diff
changeset
|
69 |
581 | 70 { ngx_string("memcached_connect_timeout"), |
71 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
72 ngx_conf_set_msec_slot, | |
73 NGX_HTTP_LOC_CONF_OFFSET, | |
74 offsetof(ngx_http_memcached_loc_conf_t, upstream.connect_timeout), | |
75 NULL }, | |
76 | |
77 { ngx_string("memcached_send_timeout"), | |
78 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
79 ngx_conf_set_msec_slot, | |
80 NGX_HTTP_LOC_CONF_OFFSET, | |
81 offsetof(ngx_http_memcached_loc_conf_t, upstream.send_timeout), | |
82 NULL }, | |
83 | |
84 { ngx_string("memcached_buffer_size"), | |
85 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
86 ngx_conf_set_size_slot, | |
87 NGX_HTTP_LOC_CONF_OFFSET, | |
88 offsetof(ngx_http_memcached_loc_conf_t, upstream.buffer_size), | |
89 NULL }, | |
90 | |
91 { ngx_string("memcached_read_timeout"), | |
92 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
93 ngx_conf_set_msec_slot, | |
94 NGX_HTTP_LOC_CONF_OFFSET, | |
95 offsetof(ngx_http_memcached_loc_conf_t, upstream.read_timeout), | |
96 NULL }, | |
97 | |
98 { ngx_string("memcached_next_upstream"), | |
99 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
100 ngx_conf_set_bitmask_slot, | |
101 NGX_HTTP_LOC_CONF_OFFSET, | |
102 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream), | |
103 &ngx_http_memcached_next_upstream_masks }, | |
104 | |
5832
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
105 { ngx_string("memcached_next_upstream_tries"), |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
106 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
107 ngx_conf_set_num_slot, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
108 NGX_HTTP_LOC_CONF_OFFSET, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
109 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_tries), |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
110 NULL }, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
111 |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
112 { ngx_string("memcached_next_upstream_timeout"), |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
113 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
114 ngx_conf_set_msec_slot, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
115 NGX_HTTP_LOC_CONF_OFFSET, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
116 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_timeout), |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
117 NULL }, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
118 |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
119 { ngx_string("memcached_gzip_flag"), |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
120 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
121 ngx_conf_set_num_slot, |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
122 NGX_HTTP_LOC_CONF_OFFSET, |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
123 offsetof(ngx_http_memcached_loc_conf_t, gzip_flag), |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
124 NULL }, |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
125 |
581 | 126 ngx_null_command |
127 }; | |
128 | |
129 | |
667 | 130 static ngx_http_module_t ngx_http_memcached_module_ctx = { |
581 | 131 NULL, /* preconfiguration */ |
132 NULL, /* postconfiguration */ | |
133 | |
134 NULL, /* create main configuration */ | |
135 NULL, /* init main configuration */ | |
136 | |
137 NULL, /* create server configuration */ | |
138 NULL, /* merge server configuration */ | |
139 | |
4499
778ef9c3fd2d
Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
140 ngx_http_memcached_create_loc_conf, /* create location configuration */ |
778ef9c3fd2d
Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
141 ngx_http_memcached_merge_loc_conf /* merge location configuration */ |
581 | 142 }; |
143 | |
144 | |
145 ngx_module_t ngx_http_memcached_module = { | |
146 NGX_MODULE_V1, | |
147 &ngx_http_memcached_module_ctx, /* module context */ | |
148 ngx_http_memcached_commands, /* module directives */ | |
149 NGX_HTTP_MODULE, /* module type */ | |
150 NULL, /* init master */ | |
151 NULL, /* init module */ | |
152 NULL, /* init process */ | |
153 NULL, /* init thread */ | |
154 NULL, /* exit thread */ | |
155 NULL, /* exit process */ | |
156 NULL, /* exit master */ | |
157 NGX_MODULE_V1_PADDING | |
158 }; | |
159 | |
160 | |
1076 | 161 static ngx_str_t ngx_http_memcached_key = ngx_string("memcached_key"); |
162 | |
163 | |
581 | 164 #define NGX_HTTP_MEMCACHED_END (sizeof(ngx_http_memcached_end) - 1) |
165 static u_char ngx_http_memcached_end[] = CRLF "END" CRLF; | |
166 | |
167 | |
168 static ngx_int_t | |
169 ngx_http_memcached_handler(ngx_http_request_t *r) | |
170 { | |
171 ngx_int_t rc; | |
172 ngx_http_upstream_t *u; | |
173 ngx_http_memcached_ctx_t *ctx; | |
174 ngx_http_memcached_loc_conf_t *mlcf; | |
175 | |
645 | 176 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { |
581 | 177 return NGX_HTTP_NOT_ALLOWED; |
178 } | |
179 | |
1370
cc114c85be0f
rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents:
1333
diff
changeset
|
180 rc = ngx_http_discard_request_body(r); |
581 | 181 |
1374 | 182 if (rc != NGX_OK) { |
581 | 183 return rc; |
184 } | |
185 | |
186 if (ngx_http_set_content_type(r) != NGX_OK) { | |
187 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
188 } | |
189 | |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
190 if (ngx_http_upstream_create(r) != NGX_OK) { |
581 | 191 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
192 } | |
193 | |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
194 u = r->upstream; |
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
195 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3487
diff
changeset
|
196 ngx_str_set(&u->schema, "memcached://"); |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
197 u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module; |
581 | 198 |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
199 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); |
581 | 200 |
201 u->conf = &mlcf->upstream; | |
202 | |
203 u->create_request = ngx_http_memcached_create_request; | |
204 u->reinit_request = ngx_http_memcached_reinit_request; | |
205 u->process_header = ngx_http_memcached_process_header; | |
206 u->abort_request = ngx_http_memcached_abort_request; | |
207 u->finalize_request = ngx_http_memcached_finalize_request; | |
208 | |
209 ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t)); | |
210 if (ctx == NULL) { | |
211 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
212 } | |
213 | |
214 ctx->request = r; | |
215 | |
597 | 216 ngx_http_set_ctx(r, ctx, ngx_http_memcached_module); |
217 | |
581 | 218 u->input_filter_init = ngx_http_memcached_filter_init; |
219 u->input_filter = ngx_http_memcached_filter; | |
220 u->input_filter_ctx = ctx; | |
221 | |
3061
f444f291ed38
fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
222 r->main->count++; |
f444f291ed38
fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
223 |
581 | 224 ngx_http_upstream_init(r); |
225 | |
226 return NGX_DONE; | |
227 } | |
228 | |
229 | |
230 static ngx_int_t | |
231 ngx_http_memcached_create_request(ngx_http_request_t *r) | |
232 { | |
1076 | 233 size_t len; |
1333
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
234 uintptr_t escape; |
1076 | 235 ngx_buf_t *b; |
236 ngx_chain_t *cl; | |
237 ngx_http_memcached_ctx_t *ctx; | |
238 ngx_http_variable_value_t *vv; | |
239 ngx_http_memcached_loc_conf_t *mlcf; | |
240 | |
241 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); | |
581 | 242 |
1076 | 243 vv = ngx_http_get_indexed_variable(r, mlcf->index); |
244 | |
245 if (vv == NULL || vv->not_found || vv->len == 0) { | |
246 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
247 "the \"$memcached_key\" variable is not set"); | |
248 return NGX_ERROR; | |
249 } | |
250 | |
1333
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
251 escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED); |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
252 |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
253 len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1; |
581 | 254 |
255 b = ngx_create_temp_buf(r->pool, len); | |
256 if (b == NULL) { | |
257 return NGX_ERROR; | |
258 } | |
259 | |
260 cl = ngx_alloc_chain_link(r->pool); | |
261 if (cl == NULL) { | |
262 return NGX_ERROR; | |
263 } | |
264 | |
265 cl->buf = b; | |
266 cl->next = NULL; | |
267 | |
268 r->upstream->request_bufs = cl; | |
269 | |
270 *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' '; | |
271 | |
597 | 272 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); |
273 | |
274 ctx->key.data = b->last; | |
275 | |
1333
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
276 if (escape == 0) { |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
277 b->last = ngx_copy(b->last, vv->data, vv->len); |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
278 |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
279 } else { |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
280 b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len, |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
281 NGX_ESCAPE_MEMCACHED); |
07ebeeb55700
escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents:
1332
diff
changeset
|
282 } |
581 | 283 |
597 | 284 ctx->key.len = b->last - ctx->key.data; |
581 | 285 |
286 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
597 | 287 "http memcached request: \"%V\"", &ctx->key); |
581 | 288 |
1088
2d8e72584534
eliminate the useless space symbol
Igor Sysoev <igor@sysoev.ru>
parents:
1076
diff
changeset
|
289 *b->last++ = CR; *b->last++ = LF; |
581 | 290 |
291 return NGX_OK; | |
292 } | |
293 | |
294 | |
295 static ngx_int_t | |
296 ngx_http_memcached_reinit_request(ngx_http_request_t *r) | |
297 { | |
298 return NGX_OK; | |
299 } | |
300 | |
301 | |
302 static ngx_int_t | |
303 ngx_http_memcached_process_header(ngx_http_request_t *r) | |
304 { | |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
305 u_char *p, *start; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
306 ngx_str_t line; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
307 ngx_uint_t flags; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
308 ngx_table_elt_t *h; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
309 ngx_http_upstream_t *u; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
310 ngx_http_memcached_ctx_t *ctx; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
311 ngx_http_memcached_loc_conf_t *mlcf; |
581 | 312 |
313 u = r->upstream; | |
314 | |
315 for (p = u->buffer.pos; p < u->buffer.last; p++) { | |
316 if (*p == LF) { | |
317 goto found; | |
318 } | |
319 } | |
320 | |
321 return NGX_AGAIN; | |
322 | |
323 found: | |
324 | |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
325 line.data = u->buffer.pos; |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
326 line.len = p - u->buffer.pos; |
581 | 327 |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
328 if (line.len == 0 || *(p - 1) != CR) { |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
329 goto no_valid; |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
330 } |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
331 |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
332 *p = '\0'; |
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
333 line.len--; |
581 | 334 |
335 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
336 "memcached: \"%V\"", &line); | |
337 | |
338 p = u->buffer.pos; | |
339 | |
597 | 340 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
341 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); |
597 | 342 |
581 | 343 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) { |
344 | |
345 p += sizeof("VALUE ") - 1; | |
346 | |
597 | 347 if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) { |
581 | 348 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
349 "memcached sent invalid key in response \"%V\" " | |
350 "for key \"%V\"", | |
597 | 351 &line, &ctx->key); |
581 | 352 |
353 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
354 } | |
355 | |
597 | 356 p += ctx->key.len; |
581 | 357 |
358 if (*p++ != ' ') { | |
359 goto no_valid; | |
360 } | |
361 | |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
362 /* flags */ |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
363 |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
364 start = p; |
581 | 365 |
366 while (*p) { | |
367 if (*p++ == ' ') { | |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
368 if (mlcf->gzip_flag) { |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
369 goto flags; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
370 } else { |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
371 goto length; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
372 } |
581 | 373 } |
374 } | |
375 | |
376 goto no_valid; | |
377 | |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
378 flags: |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
379 |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
380 flags = ngx_atoi(start, p - start - 1); |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
381 |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
382 if (flags == (ngx_uint_t) NGX_ERROR) { |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
383 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
384 "memcached sent invalid flags in response \"%V\" " |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
385 "for key \"%V\"", |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
386 &line, &ctx->key); |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
387 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
388 } |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
389 |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
390 if (flags & mlcf->gzip_flag) { |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
391 h = ngx_list_push(&r->headers_out.headers); |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
392 if (h == NULL) { |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
393 return NGX_ERROR; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
394 } |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
395 |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
396 h->hash = 1; |
5765
d80543940f9a
Style: use ngx_str_set().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents:
5359
diff
changeset
|
397 ngx_str_set(&h->key, "Content-Encoding"); |
d80543940f9a
Style: use ngx_str_set().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents:
5359
diff
changeset
|
398 ngx_str_set(&h->value, "gzip"); |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
399 r->headers_out.content_encoding = h; |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
400 } |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
401 |
581 | 402 length: |
403 | |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
404 start = p; |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
405 p = line.data + line.len; |
581 | 406 |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
407 u->headers_in.content_length_n = ngx_atoof(start, p - start); |
5801
ab48149b77a6
Style: use specified macro instead of magic-number.
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents:
5765
diff
changeset
|
408 if (u->headers_in.content_length_n == NGX_ERROR) { |
581 | 409 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
410 "memcached sent invalid length in response \"%V\" " | |
411 "for key \"%V\"", | |
597 | 412 &line, &ctx->key); |
581 | 413 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
414 } | |
415 | |
416 u->headers_in.status_n = 200; | |
1567
31d4278d51c0
memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents:
1554
diff
changeset
|
417 u->state->status = 200; |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
418 u->buffer.pos = p + sizeof(CRLF) - 1; |
581 | 419 |
420 return NGX_OK; | |
421 } | |
422 | |
423 if (ngx_strcmp(p, "END\x0d") == 0) { | |
424 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, | |
597 | 425 "key: \"%V\" was not found by memcached", &ctx->key); |
581 | 426 |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
427 u->headers_in.content_length_n = 0; |
581 | 428 u->headers_in.status_n = 404; |
1567
31d4278d51c0
memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents:
1554
diff
changeset
|
429 u->state->status = 404; |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
430 u->buffer.pos = p + sizeof("END" CRLF) - 1; |
4121
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
431 u->keepalive = 1; |
581 | 432 |
433 return NGX_OK; | |
434 } | |
435 | |
436 no_valid: | |
437 | |
438 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
439 "memcached sent invalid response: \"%V\"", &line); | |
440 | |
441 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
442 } | |
443 | |
444 | |
445 static ngx_int_t | |
446 ngx_http_memcached_filter_init(void *data) | |
447 { | |
448 ngx_http_memcached_ctx_t *ctx = data; | |
449 | |
450 ngx_http_upstream_t *u; | |
451 | |
452 u = ctx->request->upstream; | |
453 | |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
454 if (u->headers_in.status_n != 404) { |
5300
f538a67c9f77
Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5226
diff
changeset
|
455 u->length = u->headers_in.content_length_n + NGX_HTTP_MEMCACHED_END; |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
456 ctx->rest = NGX_HTTP_MEMCACHED_END; |
5300
f538a67c9f77
Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5226
diff
changeset
|
457 |
f538a67c9f77
Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5226
diff
changeset
|
458 } else { |
f538a67c9f77
Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5226
diff
changeset
|
459 u->length = 0; |
5226
a30ea5c6451d
Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents:
5008
diff
changeset
|
460 } |
581 | 461 |
462 return NGX_OK; | |
463 } | |
464 | |
465 | |
466 static ngx_int_t | |
467 ngx_http_memcached_filter(void *data, ssize_t bytes) | |
468 { | |
469 ngx_http_memcached_ctx_t *ctx = data; | |
470 | |
471 u_char *last; | |
472 ngx_buf_t *b; | |
473 ngx_chain_t *cl, **ll; | |
474 ngx_http_upstream_t *u; | |
475 | |
476 u = ctx->request->upstream; | |
477 b = &u->buffer; | |
478 | |
4118
dbddec65fdab
Upstream: r->upstream->length type change to off_t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4117
diff
changeset
|
479 if (u->length == (ssize_t) ctx->rest) { |
581 | 480 |
481 if (ngx_strncmp(b->last, | |
1548 | 482 ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest, |
3487
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
483 bytes) |
1548 | 484 != 0) |
581 | 485 { |
486 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0, | |
487 "memcached sent invalid trailer"); | |
3487
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
488 |
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
489 u->length = 0; |
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
490 ctx->rest = 0; |
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
491 |
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
492 return NGX_OK; |
581 | 493 } |
494 | |
3487
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
495 u->length -= bytes; |
5d2acf153153
revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
496 ctx->rest -= bytes; |
581 | 497 |
4121
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
498 if (u->length == 0) { |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
499 u->keepalive = 1; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
500 } |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
501 |
581 | 502 return NGX_OK; |
503 } | |
504 | |
505 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { | |
506 ll = &cl->next; | |
507 } | |
508 | |
509 cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs); | |
510 if (cl == NULL) { | |
511 return NGX_ERROR; | |
512 } | |
513 | |
514 cl->buf->flush = 1; | |
515 cl->buf->memory = 1; | |
516 | |
517 *ll = cl; | |
518 | |
1554
30fcc8478d85
two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents:
1548
diff
changeset
|
519 last = b->last; |
30fcc8478d85
two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents:
1548
diff
changeset
|
520 cl->buf->pos = last; |
581 | 521 b->last += bytes; |
522 cl->buf->last = b->last; | |
1908
f2953601ed3c
fix memory leak in long-lived non buffered connections
Igor Sysoev <igor@sysoev.ru>
parents:
1788
diff
changeset
|
523 cl->buf->tag = u->output.tag; |
581 | 524 |
525 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, | |
6480 | 526 "memcached filter bytes:%z size:%z length:%O rest:%z", |
581 | 527 bytes, b->last - b->pos, u->length, ctx->rest); |
528 | |
1554
30fcc8478d85
two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents:
1548
diff
changeset
|
529 if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) { |
581 | 530 u->length -= bytes; |
531 return NGX_OK; | |
532 } | |
533 | |
5359
2fda9065d0f4
Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5300
diff
changeset
|
534 last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END); |
581 | 535 |
536 if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) { | |
537 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0, | |
538 "memcached sent invalid trailer"); | |
4121
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
539 |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
540 b->last = last; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
541 cl->buf->last = last; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
542 u->length = 0; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
543 ctx->rest = 0; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
544 |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
545 return NGX_OK; |
581 | 546 } |
547 | |
1554
30fcc8478d85
two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents:
1548
diff
changeset
|
548 ctx->rest -= b->last - last; |
581 | 549 b->last = last; |
550 cl->buf->last = last; | |
551 u->length = ctx->rest; | |
552 | |
4121
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
553 if (u->length == 0) { |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
554 u->keepalive = 1; |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
555 } |
16c60162c35b
Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4118
diff
changeset
|
556 |
581 | 557 return NGX_OK; |
558 } | |
559 | |
560 | |
561 static void | |
562 ngx_http_memcached_abort_request(ngx_http_request_t *r) | |
563 { | |
564 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
565 "abort http memcached request"); | |
566 return; | |
567 } | |
568 | |
569 | |
570 static void | |
571 ngx_http_memcached_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
572 { | |
573 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
574 "finalize http memcached request"); | |
575 return; | |
576 } | |
577 | |
578 | |
579 static void * | |
580 ngx_http_memcached_create_loc_conf(ngx_conf_t *cf) | |
581 { | |
582 ngx_http_memcached_loc_conf_t *conf; | |
583 | |
584 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memcached_loc_conf_t)); | |
585 if (conf == NULL) { | |
2912
c7d57b539248
return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents:
2392
diff
changeset
|
586 return NULL; |
581 | 587 } |
588 | |
589 /* | |
590 * set by ngx_pcalloc(): | |
591 * | |
592 * conf->upstream.bufs.num = 0; | |
593 * conf->upstream.next_upstream = 0; | |
594 * conf->upstream.temp_path = NULL; | |
595 */ | |
596 | |
5008
fd84344f1df7
Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents:
4835
diff
changeset
|
597 conf->upstream.local = NGX_CONF_UNSET_PTR; |
5832
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
598 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; |
581 | 599 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; |
600 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; | |
601 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; | |
5832
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
602 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; |
581 | 603 |
604 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; | |
605 | |
884 | 606 /* the hardcoded values */ |
581 | 607 conf->upstream.cyclic_temp_file = 0; |
629 | 608 conf->upstream.buffering = 0; |
609 conf->upstream.ignore_client_abort = 0; | |
581 | 610 conf->upstream.send_lowat = 0; |
611 conf->upstream.bufs.num = 0; | |
612 conf->upstream.busy_buffers_size = 0; | |
613 conf->upstream.max_temp_file_size = 0; | |
614 conf->upstream.temp_file_write_size = 0; | |
657 | 615 conf->upstream.intercept_errors = 1; |
675 | 616 conf->upstream.intercept_404 = 1; |
581 | 617 conf->upstream.pass_request_headers = 0; |
618 conf->upstream.pass_request_body = 0; | |
6122
85f00678e54a
Memcached: enabled ranges.
Martin Mlynář <nexus@smoula.net>
parents:
5832
diff
changeset
|
619 conf->upstream.force_ranges = 1; |
581 | 620 |
1787
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
621 conf->index = NGX_CONF_UNSET; |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
622 conf->gzip_flag = NGX_CONF_UNSET_UINT; |
1787
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
623 |
581 | 624 return conf; |
625 } | |
626 | |
627 | |
628 static char * | |
629 ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) | |
630 { | |
631 ngx_http_memcached_loc_conf_t *prev = parent; | |
632 ngx_http_memcached_loc_conf_t *conf = child; | |
633 | |
5008
fd84344f1df7
Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents:
4835
diff
changeset
|
634 ngx_conf_merge_ptr_value(conf->upstream.local, |
fd84344f1df7
Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents:
4835
diff
changeset
|
635 prev->upstream.local, NULL); |
fd84344f1df7
Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents:
4835
diff
changeset
|
636 |
5832
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
637 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
638 prev->upstream.next_upstream_tries, 0); |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
639 |
581 | 640 ngx_conf_merge_msec_value(conf->upstream.connect_timeout, |
641 prev->upstream.connect_timeout, 60000); | |
642 | |
643 ngx_conf_merge_msec_value(conf->upstream.send_timeout, | |
644 prev->upstream.send_timeout, 60000); | |
645 | |
646 ngx_conf_merge_msec_value(conf->upstream.read_timeout, | |
647 prev->upstream.read_timeout, 60000); | |
648 | |
5832
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
649 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
650 prev->upstream.next_upstream_timeout, 0); |
d09b689911ac
Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents:
5801
diff
changeset
|
651 |
581 | 652 ngx_conf_merge_size_value(conf->upstream.buffer_size, |
653 prev->upstream.buffer_size, | |
654 (size_t) ngx_pagesize); | |
655 | |
656 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, | |
657 prev->upstream.next_upstream, | |
658 (NGX_CONF_BITMASK_SET | |
659 |NGX_HTTP_UPSTREAM_FT_ERROR | |
660 |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); | |
661 | |
665 | 662 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { |
663 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET | |
664 |NGX_HTTP_UPSTREAM_FT_OFF; | |
665 } | |
666 | |
1787
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
667 if (conf->upstream.upstream == NULL) { |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
668 conf->upstream.upstream = prev->upstream.upstream; |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
669 } |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
670 |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
671 if (conf->index == NGX_CONF_UNSET) { |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
672 conf->index = prev->index; |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
673 } |
a37fe5ceacc4
inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
674 |
4835
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
675 ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0); |
a4512d7737f6
Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4499
diff
changeset
|
676 |
581 | 677 return NGX_CONF_OK; |
678 } | |
679 | |
680 | |
681 static char * | |
682 ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
683 { | |
2392 | 684 ngx_http_memcached_loc_conf_t *mlcf = conf; |
581 | 685 |
686 ngx_str_t *value; | |
807
3095bf59059b
now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
675
diff
changeset
|
687 ngx_url_t u; |
581 | 688 ngx_http_core_loc_conf_t *clcf; |
689 | |
2392 | 690 if (mlcf->upstream.upstream) { |
581 | 691 return "is duplicate"; |
692 } | |
693 | |
694 value = cf->args->elts; | |
695 | |
807
3095bf59059b
now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
675
diff
changeset
|
696 ngx_memzero(&u, sizeof(ngx_url_t)); |
581 | 697 |
807
3095bf59059b
now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
675
diff
changeset
|
698 u.url = value[1]; |
884 | 699 u.no_resolve = 1; |
815
b630109560b7
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
807
diff
changeset
|
700 |
2392 | 701 mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); |
702 if (mlcf->upstream.upstream == NULL) { | |
884 | 703 return NGX_CONF_ERROR; |
581 | 704 } |
705 | |
706 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); | |
707 | |
708 clcf->handler = ngx_http_memcached_handler; | |
709 | |
7321
45e513c3540d
Fixed invalid access to location defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents:
7238
diff
changeset
|
710 if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { |
581 | 711 clcf->auto_redirect = 1; |
712 } | |
713 | |
2392 | 714 mlcf->index = ngx_http_get_variable_index(cf, &ngx_http_memcached_key); |
1076 | 715 |
2392 | 716 if (mlcf->index == NGX_ERROR) { |
1076 | 717 return NGX_CONF_ERROR; |
718 } | |
719 | |
581 | 720 return NGX_CONF_OK; |
721 } |