Mercurial > hg > nginx-mail
comparison src/http/modules/ngx_http_memcached_module.c @ 146:36af50a5582d NGINX_0_3_20
nginx 0.3.20
*) Bugfix: in SSI handling.
*) Bugfix: the ngx_http_memcached_module did not support the keys in
the "/usr?args" form.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 11 Jan 2006 00:00:00 +0300 |
parents | 82d695e3d662 |
children | 87699398f955 |
comparison
equal
deleted
inserted
replaced
145:85a84f8da62b | 146:36af50a5582d |
---|---|
17 | 17 |
18 | 18 |
19 typedef struct { | 19 typedef struct { |
20 size_t rest; | 20 size_t rest; |
21 ngx_http_request_t *request; | 21 ngx_http_request_t *request; |
22 ngx_str_t key; | |
22 } ngx_http_memcached_ctx_t; | 23 } ngx_http_memcached_ctx_t; |
23 | 24 |
24 | 25 |
25 static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r); | 26 static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r); |
26 static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r); | 27 static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r); |
200 } | 201 } |
201 | 202 |
202 ctx->rest = NGX_HTTP_MEMCACHED_END; | 203 ctx->rest = NGX_HTTP_MEMCACHED_END; |
203 ctx->request = r; | 204 ctx->request = r; |
204 | 205 |
206 ngx_http_set_ctx(r, ctx, ngx_http_memcached_module); | |
207 | |
205 u->input_filter_init = ngx_http_memcached_filter_init; | 208 u->input_filter_init = ngx_http_memcached_filter_init; |
206 u->input_filter = ngx_http_memcached_filter; | 209 u->input_filter = ngx_http_memcached_filter; |
207 u->input_filter_ctx = ctx; | 210 u->input_filter_ctx = ctx; |
208 | 211 |
209 ngx_http_upstream_init(r); | 212 ngx_http_upstream_init(r); |
213 | 216 |
214 | 217 |
215 static ngx_int_t | 218 static ngx_int_t |
216 ngx_http_memcached_create_request(ngx_http_request_t *r) | 219 ngx_http_memcached_create_request(ngx_http_request_t *r) |
217 { | 220 { |
218 size_t len; | 221 size_t len; |
219 ngx_buf_t *b; | 222 ngx_buf_t *b; |
220 ngx_chain_t *cl; | 223 ngx_chain_t *cl; |
224 ngx_http_memcached_ctx_t *ctx; | |
221 | 225 |
222 len = sizeof("get ") - 1 + r->uri.len + sizeof(" " CRLF) - 1; | 226 len = sizeof("get ") - 1 + r->uri.len + sizeof(" " CRLF) - 1; |
223 if (r->args.len) { | 227 if (r->args.len) { |
224 len += 1+ r->args.len; | 228 len += 1 + r->args.len; |
225 } | 229 } |
226 | 230 |
227 b = ngx_create_temp_buf(r->pool, len); | 231 b = ngx_create_temp_buf(r->pool, len); |
228 if (b == NULL) { | 232 if (b == NULL) { |
229 return NGX_ERROR; | 233 return NGX_ERROR; |
239 | 243 |
240 r->upstream->request_bufs = cl; | 244 r->upstream->request_bufs = cl; |
241 | 245 |
242 *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' '; | 246 *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' '; |
243 | 247 |
248 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); | |
249 | |
250 ctx->key.data = b->last; | |
251 | |
244 b->last = ngx_copy(b->last, r->uri.data, r->uri.len); | 252 b->last = ngx_copy(b->last, r->uri.data, r->uri.len); |
245 | 253 |
246 if (r->args.len) { | 254 if (r->args.len) { |
247 *b->last++ = '?'; | 255 *b->last++ = '?'; |
248 b->last = ngx_copy(b->last, r->args.data, r->args.len); | 256 b->last = ngx_copy(b->last, r->args.data, r->args.len); |
249 } | 257 } |
250 | 258 |
251 #if (NGX_DEBUG) | 259 ctx->key.len = b->last - ctx->key.data; |
252 { | 260 |
253 ngx_str_t s; | |
254 | |
255 s.len = b->last - b->pos; | |
256 s.data = b->pos; | |
257 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 261 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
258 "http memcached request: \"%V\"", &s); | 262 "http memcached request: \"%V\"", &ctx->key); |
259 } | |
260 #endif | |
261 | 263 |
262 *b->last++ = ' '; *b->last++ = CR; *b->last++ = LF; | 264 *b->last++ = ' '; *b->last++ = CR; *b->last++ = LF; |
263 | 265 |
264 return NGX_OK; | 266 return NGX_OK; |
265 } | 267 } |
273 | 275 |
274 | 276 |
275 static ngx_int_t | 277 static ngx_int_t |
276 ngx_http_memcached_process_header(ngx_http_request_t *r) | 278 ngx_http_memcached_process_header(ngx_http_request_t *r) |
277 { | 279 { |
278 u_char *p, *len; | 280 u_char *p, *len; |
279 ngx_str_t line; | 281 ngx_str_t line; |
280 ngx_http_upstream_t *u; | 282 ngx_http_upstream_t *u; |
283 ngx_http_memcached_ctx_t *ctx; | |
281 | 284 |
282 u = r->upstream; | 285 u = r->upstream; |
283 | 286 |
284 for (p = u->buffer.pos; p < u->buffer.last; p++) { | 287 for (p = u->buffer.pos; p < u->buffer.last; p++) { |
285 if (*p == LF) { | 288 if (*p == LF) { |
299 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 302 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
300 "memcached: \"%V\"", &line); | 303 "memcached: \"%V\"", &line); |
301 | 304 |
302 p = u->buffer.pos; | 305 p = u->buffer.pos; |
303 | 306 |
307 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); | |
308 | |
304 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) { | 309 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) { |
305 | 310 |
306 p += sizeof("VALUE ") - 1; | 311 p += sizeof("VALUE ") - 1; |
307 | 312 |
308 if (ngx_strncmp(p, r->uri.data, r->uri.len) != 0) { | 313 if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) { |
309 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 314 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
310 "memcached sent invalid key in response \"%V\" " | 315 "memcached sent invalid key in response \"%V\" " |
311 "for key \"%V\"", | 316 "for key \"%V\"", |
312 &line, &r->uri); | 317 &line, &ctx->key); |
313 | 318 |
314 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | 319 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
315 } | 320 } |
316 | 321 |
317 p += r->uri.len; | 322 p += ctx->key.len; |
318 | 323 |
319 if (*p++ != ' ') { | 324 if (*p++ != ' ') { |
320 goto no_valid; | 325 goto no_valid; |
321 } | 326 } |
322 | 327 |
339 r->headers_out.content_length_n = ngx_atoof(len, p - len - 1); | 344 r->headers_out.content_length_n = ngx_atoof(len, p - len - 1); |
340 if (r->headers_out.content_length_n == -1) { | 345 if (r->headers_out.content_length_n == -1) { |
341 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 346 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
342 "memcached sent invalid length in response \"%V\" " | 347 "memcached sent invalid length in response \"%V\" " |
343 "for key \"%V\"", | 348 "for key \"%V\"", |
344 &line, &r->uri); | 349 &line, &ctx->key); |
345 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | 350 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
346 } | 351 } |
347 | 352 |
348 u->headers_in.status_n = 200; | 353 u->headers_in.status_n = 200; |
349 u->buffer.pos = p + 1; | 354 u->buffer.pos = p + 1; |
351 return NGX_OK; | 356 return NGX_OK; |
352 } | 357 } |
353 | 358 |
354 if (ngx_strcmp(p, "END\x0d") == 0) { | 359 if (ngx_strcmp(p, "END\x0d") == 0) { |
355 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, | 360 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
356 "key: \"%V\" was not found by memcached", &r->uri); | 361 "key: \"%V\" was not found by memcached", &ctx->key); |
357 | 362 |
358 u->headers_in.status_n = 404; | 363 u->headers_in.status_n = 404; |
359 | 364 |
360 return NGX_OK; | 365 return NGX_OK; |
361 } | 366 } |