annotate src/http/modules/ngx_http_memcached_module.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro и N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 003bd800ec2a
children e6da4931e0e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 typedef struct {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 ngx_http_upstream_conf_t upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_peers_t *peers;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 } ngx_http_memcached_loc_conf_t;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 typedef struct {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 size_t rest;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 ngx_http_request_t *request;
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
22 ngx_str_t key;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 } ngx_http_memcached_ctx_t;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 static ngx_int_t ngx_http_memcached_filter_init(void *data);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 static void ngx_http_memcached_abort_request(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 static void ngx_http_memcached_finalize_request(ngx_http_request_t *r,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 ngx_int_t rc);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 static void *ngx_http_memcached_create_loc_conf(ngx_conf_t *cf);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 static char *ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 void *parent, void *child);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 static char *ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 void *conf);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 static ngx_conf_bitmask_t ngx_http_memcached_next_upstream_masks[] = {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 { ngx_null_string, 0 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 static ngx_command_t ngx_http_memcached_commands[] = {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 { ngx_string("memcached_pass"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 ngx_http_memcached_pass,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 { ngx_string("memcached_connect_timeout"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 ngx_conf_set_msec_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 offsetof(ngx_http_memcached_loc_conf_t, upstream.connect_timeout),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 { ngx_string("memcached_send_timeout"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 ngx_conf_set_msec_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 offsetof(ngx_http_memcached_loc_conf_t, upstream.send_timeout),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 { ngx_string("memcached_buffer_size"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 ngx_conf_set_size_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 offsetof(ngx_http_memcached_loc_conf_t, upstream.buffer_size),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 { ngx_string("memcached_read_timeout"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 ngx_conf_set_msec_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 offsetof(ngx_http_memcached_loc_conf_t, upstream.read_timeout),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 { ngx_string("memcached_next_upstream"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ngx_conf_set_bitmask_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 &ngx_http_memcached_next_upstream_masks },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 { ngx_string("memcached_upstream_max_fails"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 ngx_conf_set_num_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 offsetof(ngx_http_memcached_loc_conf_t, upstream.max_fails),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 { ngx_string("memcached_upstream_fail_timeout"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 ngx_conf_set_sec_slot,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 NGX_HTTP_LOC_CONF_OFFSET,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 offsetof(ngx_http_memcached_loc_conf_t, upstream.fail_timeout),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 NULL },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 ngx_null_command
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 ngx_http_module_t ngx_http_memcached_module_ctx = {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 NULL, /* preconfiguration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 NULL, /* postconfiguration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 NULL, /* create main configuration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 NULL, /* init main configuration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 NULL, /* create server configuration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 NULL, /* merge server configuration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_http_memcached_create_loc_conf, /* create location configration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 ngx_http_memcached_merge_loc_conf /* merge location configration */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 ngx_module_t ngx_http_memcached_module = {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 NGX_MODULE_V1,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 &ngx_http_memcached_module_ctx, /* module context */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 ngx_http_memcached_commands, /* module directives */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 NGX_HTTP_MODULE, /* module type */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 NULL, /* init master */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 NULL, /* init module */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 NULL, /* init process */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 NULL, /* init thread */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 NULL, /* exit thread */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 NULL, /* exit process */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 NULL, /* exit master */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 NGX_MODULE_V1_PADDING
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 #define NGX_HTTP_MEMCACHED_END (sizeof(ngx_http_memcached_end) - 1)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 static u_char ngx_http_memcached_end[] = CRLF "END" CRLF;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 ngx_http_memcached_handler(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 ngx_int_t rc;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 ngx_http_memcached_ctx_t *ctx;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 ngx_http_memcached_loc_conf_t *mlcf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156
194
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
157 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 return NGX_HTTP_NOT_ALLOWED;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 rc = ngx_http_discard_body(r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 if (rc != NGX_OK && rc != NGX_AGAIN) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 return rc;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 if (ngx_http_set_content_type(r) != NGX_OK) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 return NGX_HTTP_INTERNAL_SERVER_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 if (u == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 return NGX_HTTP_INTERNAL_SERVER_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 u->peer.log = r->connection->log;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 u->peer.log_error = NGX_ERROR_ERR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 u->peer.peers = mlcf->peers;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 u->peer.tries = mlcf->peers->number;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 #if (NGX_THREADS)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 u->peer.lock = &r->connection->lock;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 #endif
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 u->conf = &mlcf->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 u->create_request = ngx_http_memcached_create_request;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 u->reinit_request = ngx_http_memcached_reinit_request;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 u->process_header = ngx_http_memcached_process_header;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 u->abort_request = ngx_http_memcached_abort_request;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 u->finalize_request = ngx_http_memcached_finalize_request;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 r->upstream = u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 if (ctx == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 return NGX_HTTP_INTERNAL_SERVER_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 ctx->rest = NGX_HTTP_MEMCACHED_END;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 ctx->request = r;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
206 ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
207
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 u->input_filter_init = ngx_http_memcached_filter_init;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 u->input_filter = ngx_http_memcached_filter;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 u->input_filter_ctx = ctx;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 ngx_http_upstream_init(r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 return NGX_DONE;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 ngx_http_memcached_create_request(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 {
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
221 size_t len;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
222 ngx_buf_t *b;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
223 ngx_chain_t *cl;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
224 ngx_http_memcached_ctx_t *ctx;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 len = sizeof("get ") - 1 + r->uri.len + sizeof(" " CRLF) - 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 if (r->args.len) {
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
228 len += 1 + r->args.len;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 b = ngx_create_temp_buf(r->pool, len);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 if (b == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 cl = ngx_alloc_chain_link(r->pool);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 if (cl == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 cl->buf = b;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 cl->next = NULL;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 r->upstream->request_bufs = cl;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
248 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
249
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
250 ctx->key.data = b->last;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
251
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 b->last = ngx_copy(b->last, r->uri.data, r->uri.len);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 if (r->args.len) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 *b->last++ = '?';
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 b->last = ngx_copy(b->last, r->args.data, r->args.len);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
259 ctx->key.len = b->last - ctx->key.data;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
262 "http memcached request: \"%V\"", &ctx->key);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 *b->last++ = ' '; *b->last++ = CR; *b->last++ = LF;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 ngx_http_memcached_reinit_request(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278 ngx_http_memcached_process_header(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 {
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
280 u_char *p, *len;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
281 ngx_str_t line;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
282 ngx_http_upstream_t *u;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
283 ngx_http_memcached_ctx_t *ctx;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 u = r->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 for (p = u->buffer.pos; p < u->buffer.last; p++) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 if (*p == LF) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 goto found;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 return NGX_AGAIN;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 found:
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 *p = '\0';
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 line.len = p - u->buffer.pos - 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 line.data = u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 "memcached: \"%V\"", &line);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 p = u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
307 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
308
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 p += sizeof("VALUE ") - 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
313 if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 "memcached sent invalid key in response \"%V\" "
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 "for key \"%V\"",
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
317 &line, &ctx->key);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
322 p += ctx->key.len;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 if (*p++ != ' ') {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325 goto no_valid;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 /* skip flags */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 while (*p) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 if (*p++ == ' ') {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 goto length;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 goto no_valid;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 length:
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 len = p;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 while (*p && *p++ != CR) { /* void */ }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 if (r->headers_out.content_length_n == -1) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 "memcached sent invalid length in response \"%V\" "
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 "for key \"%V\"",
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
349 &line, &ctx->key);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 u->headers_in.status_n = 200;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354 u->buffer.pos = p + 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 if (ngx_strcmp(p, "END\x0d") == 0) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
361 "key: \"%V\" was not found by memcached", &ctx->key);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 u->headers_in.status_n = 404;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 no_valid:
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 "memcached sent invalid response: \"%V\"", &line);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 ngx_http_memcached_filter_init(void *data)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 ngx_http_memcached_ctx_t *ctx = data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 u = ctx->request->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 u->length += NGX_HTTP_MEMCACHED_END;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393 ngx_http_memcached_filter(void *data, ssize_t bytes)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 ngx_http_memcached_ctx_t *ctx = data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 u_char *last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 ngx_buf_t *b;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 ngx_chain_t *cl, **ll;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 u = ctx->request->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 b = &u->buffer;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405 if (u->length == ctx->rest) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 if (ngx_strncmp(b->last,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 - ctx->rest,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 bytes) != 0)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 "memcached sent invalid trailer");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416 u->length -= bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 ctx->rest -= bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 ll = &cl->next;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 if (cl == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 cl->buf->flush = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 cl->buf->memory = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434 *ll = cl;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436 cl->buf->pos = b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 b->last += bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 cl->buf->last = b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 "memcached filter bytes:%z size:%z length:%z rest:%z",
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 bytes, b->last - b->pos, u->length, ctx->rest);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 if (b->last - b->pos <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 u->length -= bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 last = b->pos + u->length - NGX_HTTP_MEMCACHED_END;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 "memcached sent invalid trailer");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457 ctx->rest = u->length - (b->last - b->pos);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 b->last = last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 cl->buf->last = last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460 u->length = ctx->rest;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 ngx_http_memcached_abort_request(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470 "abort http memcached request");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 ngx_http_memcached_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 "finalize http memcached request");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 static void *
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 ngx_http_memcached_create_loc_conf(ngx_conf_t *cf)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 ngx_http_memcached_loc_conf_t *conf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memcached_loc_conf_t));
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 if (conf == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 return NGX_CONF_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 /*
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495 * set by ngx_pcalloc():
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 *
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497 * conf->upstream.bufs.num = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498 * conf->upstream.next_upstream = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499 * conf->upstream.temp_path = NULL;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 * conf->upstream.schema = { 0, NULL };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
501 * conf->upstream.uri = { 0, NULL };
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
502 * conf->upstream.location = NULL;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
503 *
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
504 * conf->peers = NULL;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
505 */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
506
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
510
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
511 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
512
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
513 conf->upstream.max_fails = NGX_CONF_UNSET_UINT;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 conf->upstream.fail_timeout = NGX_CONF_UNSET;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 /* "fastcgi_cyclic_temp_file" is disabled */
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 conf->upstream.cyclic_temp_file = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 /* the hardcoded values */
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
520 conf->upstream.buffering = 0;
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
521 conf->upstream.ignore_client_abort = 0;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522 conf->upstream.send_lowat = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 conf->upstream.bufs.num = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524 conf->upstream.busy_buffers_size = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 conf->upstream.max_temp_file_size = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526 conf->upstream.temp_file_write_size = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527 conf->upstream.pass_x_powered_by = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 conf->upstream.redirect_errors = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529 conf->upstream.redirect_404 = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
530 conf->upstream.pass_server = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
531 conf->upstream.pass_date = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
532 conf->upstream.pass_request_headers = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
533 conf->upstream.pass_request_body = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535 return conf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
536 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
537
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539 static char *
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 ngx_http_memcached_loc_conf_t *prev = parent;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 ngx_http_memcached_loc_conf_t *conf = child;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 ngx_uint_t i;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 prev->upstream.connect_timeout, 60000);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 prev->upstream.send_timeout, 60000);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554 prev->upstream.read_timeout, 60000);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 ngx_conf_merge_size_value(conf->upstream.buffer_size,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557 prev->upstream.buffer_size,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558 (size_t) ngx_pagesize);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561 prev->upstream.next_upstream,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 (NGX_CONF_BITMASK_SET
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563 |NGX_HTTP_UPSTREAM_FT_ERROR
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566 ngx_conf_merge_unsigned_value(conf->upstream.max_fails,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567 prev->upstream.max_fails, 1);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569 ngx_conf_merge_sec_value(conf->upstream.fail_timeout,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 prev->upstream.fail_timeout, 10);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 if (conf->peers && conf->peers->number > 1) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573 for (i = 0; i < conf->peers->number; i++) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
574 conf->peers->peer[i].weight = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
575 conf->peers->peer[i].max_fails = conf->upstream.max_fails;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
576 conf->peers->peer[i].fail_timeout = conf->upstream.fail_timeout;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
577 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
578 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
579
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 return NGX_CONF_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584 static char *
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585 ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 ngx_http_memcached_loc_conf_t *lcf = conf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589 ngx_str_t *value;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
590 ngx_inet_upstream_t inet_upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591 ngx_http_core_loc_conf_t *clcf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
592
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
593 if (lcf->upstream.schema.len) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
594 return "is duplicate";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
596
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
597 value = cf->args->elts;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
599 ngx_memzero(&inet_upstream, sizeof(ngx_inet_upstream_t));
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
600
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 inet_upstream.name = value[1];
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602 inet_upstream.url = value[1];
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 lcf->peers = ngx_inet_upstream_parse(cf, &inet_upstream);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605 if (lcf->peers == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606 return NGX_CONF_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
608
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609 lcf->upstream.schema.len = sizeof("memcached://") - 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
610 lcf->upstream.schema.data = (u_char *) "memcached://";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
614 clcf->handler = ngx_http_memcached_handler;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616 lcf->upstream.location = clcf->name;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
618 if (clcf->name.data[clcf->name.len - 1] == '/') {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
619 clcf->auto_redirect = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
620 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
621
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622 return NGX_CONF_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 }