annotate src/http/modules/ngx_http_memcached_module.c @ 5359:2fda9065d0f4

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