annotate src/http/modules/ngx_http_memcached_module.c @ 6963:3ff293cfdab8

Slice filter: prevented slice redirection (ticket #1219). When a slice subrequest was redirected to a new location, its context was lost. After its completion, a new slice subrequest for the same slice was created. This could lead to infinite loop. Now the slice module makes sure each slice subrequest starts output with the slice context available.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 31 Mar 2017 21:47:56 +0300
parents 1d0e03db9f8e
children 06cf0c4b8618
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"),
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
64 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
3399
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
5832
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
105 { ngx_string("memcached_next_upstream_tries"),
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
106 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
107 ngx_conf_set_num_slot,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
108 NGX_HTTP_LOC_CONF_OFFSET,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
109 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_tries),
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
110 NULL },
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
111
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
112 { ngx_string("memcached_next_upstream_timeout"),
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
113 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
114 ngx_conf_set_msec_slot,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
115 NGX_HTTP_LOC_CONF_OFFSET,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
116 offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_timeout),
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
117 NULL },
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
118
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
119 { ngx_string("memcached_gzip_flag"),
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
120 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
121 ngx_conf_set_num_slot,
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
122 NGX_HTTP_LOC_CONF_OFFSET,
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
123 offsetof(ngx_http_memcached_loc_conf_t, gzip_flag),
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
124 NULL },
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
125
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_null_command
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 };
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
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
130 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
131 NULL, /* preconfiguration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NULL, /* postconfiguration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 NULL, /* create main configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 NULL, /* init main configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* create server configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NULL, /* merge server configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
4499
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
140 ngx_http_memcached_create_loc_conf, /* create location configuration */
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
141 ngx_http_memcached_merge_loc_conf /* merge location configuration */
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
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 ngx_module_t ngx_http_memcached_module = {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 NGX_MODULE_V1,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 &ngx_http_memcached_module_ctx, /* module context */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 ngx_http_memcached_commands, /* module directives */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 NGX_HTTP_MODULE, /* module type */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 NULL, /* init master */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 NULL, /* init module */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 NULL, /* init process */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 NULL, /* init thread */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 NULL, /* exit thread */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 NULL, /* exit process */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 NULL, /* exit master */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 NGX_MODULE_V1_PADDING
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
161 static ngx_str_t ngx_http_memcached_key = ngx_string("memcached_key");
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
162
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
163
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 #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
165 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
166
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_http_memcached_handler(ngx_http_request_t *r)
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 ngx_int_t rc;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 ngx_http_memcached_ctx_t *ctx;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ngx_http_memcached_loc_conf_t *mlcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
645
4946078f0a79 nginx-0.3.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
176 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
177 return NGX_HTTP_NOT_ALLOWED;
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
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
180 rc = ngx_http_discard_request_body(r);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
1374
aabbf66b61ea omit unnecessary conditions
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
182 if (rc != NGX_OK) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 return rc;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 if (ngx_http_set_content_type(r) != NGX_OK) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
190 if (ngx_http_upstream_create(r) != NGX_OK) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 return NGX_HTTP_INTERNAL_SERVER_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
194 u = r->upstream;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
195
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3487
diff changeset
196 ngx_str_set(&u->schema, "memcached://");
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
197 u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
199 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 u->conf = &mlcf->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 u->create_request = ngx_http_memcached_create_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 u->reinit_request = ngx_http_memcached_reinit_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 u->process_header = ngx_http_memcached_process_header;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 u->abort_request = ngx_http_memcached_abort_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 u->finalize_request = ngx_http_memcached_finalize_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 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
210 if (ctx == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 return NGX_HTTP_INTERNAL_SERVER_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 }
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 ctx->request = r;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
216 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
217
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 u->input_filter_init = ngx_http_memcached_filter_init;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 u->input_filter = ngx_http_memcached_filter;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 u->input_filter_ctx = ctx;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221
3061
f444f291ed38 fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3006
diff changeset
222 r->main->count++;
f444f291ed38 fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3006
diff changeset
223
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 ngx_http_upstream_init(r);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 return NGX_DONE;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 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
232 {
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
233 size_t len;
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
234 uintptr_t escape;
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
235 ngx_buf_t *b;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
236 ngx_chain_t *cl;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
237 ngx_http_memcached_ctx_t *ctx;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
238 ngx_http_variable_value_t *vv;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
239 ngx_http_memcached_loc_conf_t *mlcf;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
240
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
241 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
242
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
243 vv = ngx_http_get_indexed_variable(r, mlcf->index);
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
244
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
245 if (vv == NULL || vv->not_found || vv->len == 0) {
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
246 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
247 "the \"$memcached_key\" variable is not set");
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
248 return NGX_ERROR;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
249 }
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
250
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
251 escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
252
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
253 len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 b = ngx_create_temp_buf(r->pool, len);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 if (b == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 cl = ngx_alloc_chain_link(r->pool);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 cl->buf = b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 cl->next = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 r->upstream->request_bufs = cl;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 *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
271
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
272 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
273
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
274 ctx->key.data = b->last;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
275
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
276 if (escape == 0) {
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
277 b->last = ngx_copy(b->last, vv->data, vv->len);
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
278
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
279 } else {
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
280 b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len,
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
281 NGX_ESCAPE_MEMCACHED);
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
282 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
284 ctx->key.len = b->last - ctx->key.data;
581
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 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
287 "http memcached request: \"%V\"", &ctx->key);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
1088
2d8e72584534 eliminate the useless space symbol
Igor Sysoev <igor@sysoev.ru>
parents: 1076
diff changeset
289 *b->last++ = CR; *b->last++ = LF;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 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
297 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 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
304 {
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
305 u_char *p, *start;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
306 ngx_str_t line;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
307 ngx_uint_t flags;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
308 ngx_table_elt_t *h;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
309 ngx_http_upstream_t *u;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
310 ngx_http_memcached_ctx_t *ctx;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
311 ngx_http_memcached_loc_conf_t *mlcf;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 u = r->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 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
316 if (*p == LF) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 goto found;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 }
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 return NGX_AGAIN;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 found:
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
325 line.data = u->buffer.pos;
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
326 line.len = p - u->buffer.pos;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
328 if (line.len == 0 || *(p - 1) != CR) {
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
329 goto no_valid;
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
330 }
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
331
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
332 *p = '\0';
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
333 line.len--;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335 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
336 "memcached: \"%V\"", &line);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 p = u->buffer.pos;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
340 ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
341 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
342
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345 p += sizeof("VALUE ") - 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
347 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
348 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
349 "memcached sent invalid key in response \"%V\" "
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 "for key \"%V\"",
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
351 &line, &ctx->key);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
356 p += ctx->key.len;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 if (*p++ != ' ') {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359 goto no_valid;
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
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
362 /* flags */
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
363
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
364 start = p;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 while (*p) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367 if (*p++ == ' ') {
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
368 if (mlcf->gzip_flag) {
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
369 goto flags;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
370 } else {
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
371 goto length;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
372 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 goto no_valid;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
378 flags:
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
379
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
380 flags = ngx_atoi(start, p - start - 1);
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
381
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
382 if (flags == (ngx_uint_t) NGX_ERROR) {
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
383 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
384 "memcached sent invalid flags in response \"%V\" "
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
385 "for key \"%V\"",
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
386 &line, &ctx->key);
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
387 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
388 }
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
389
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
390 if (flags & mlcf->gzip_flag) {
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
391 h = ngx_list_push(&r->headers_out.headers);
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
392 if (h == NULL) {
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
393 return NGX_ERROR;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
394 }
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
395
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
396 h->hash = 1;
5765
d80543940f9a Style: use ngx_str_set().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5359
diff changeset
397 ngx_str_set(&h->key, "Content-Encoding");
d80543940f9a Style: use ngx_str_set().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5359
diff changeset
398 ngx_str_set(&h->value, "gzip");
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
399 r->headers_out.content_encoding = h;
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
400 }
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
401
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 length:
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
404 start = p;
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
405 p = line.data + line.len;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
407 u->headers_in.content_length_n = ngx_atoof(start, p - start);
5801
ab48149b77a6 Style: use specified macro instead of magic-number.
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5765
diff changeset
408 if (u->headers_in.content_length_n == NGX_ERROR) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 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
410 "memcached sent invalid length in response \"%V\" "
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 "for key \"%V\"",
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
412 &line, &ctx->key);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 u->headers_in.status_n = 200;
1567
31d4278d51c0 memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents: 1554
diff changeset
417 u->state->status = 200;
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
418 u->buffer.pos = p + sizeof(CRLF) - 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 return NGX_OK;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 if (ngx_strcmp(p, "END\x0d") == 0) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 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
425 "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
426
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
427 u->headers_in.content_length_n = 0;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 u->headers_in.status_n = 404;
1567
31d4278d51c0 memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents: 1554
diff changeset
429 u->state->status = 404;
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
430 u->buffer.pos = p + sizeof("END" CRLF) - 1;
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
431 u->keepalive = 1;
581
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 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 no_valid:
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 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
439 "memcached sent invalid response: \"%V\"", &line);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 ngx_http_memcached_filter_init(void *data)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 ngx_http_memcached_ctx_t *ctx = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 u = ctx->request->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
454 if (u->headers_in.status_n != 404) {
5300
f538a67c9f77 Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5226
diff changeset
455 u->length = u->headers_in.content_length_n + NGX_HTTP_MEMCACHED_END;
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
456 ctx->rest = NGX_HTTP_MEMCACHED_END;
5300
f538a67c9f77 Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5226
diff changeset
457
f538a67c9f77 Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5226
diff changeset
458 } else {
f538a67c9f77 Upstream: u->length now defaults to -1 (API change).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5226
diff changeset
459 u->length = 0;
5226
a30ea5c6451d Memcached: stricten header validation.
Ruslan Ermilov <ru@nginx.com>
parents: 5008
diff changeset
460 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 ngx_http_memcached_filter(void *data, ssize_t bytes)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 ngx_http_memcached_ctx_t *ctx = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 u_char *last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 ngx_buf_t *b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 ngx_chain_t *cl, **ll;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 u = ctx->request->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 b = &u->buffer;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478
4118
dbddec65fdab Upstream: r->upstream->length type change to off_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4117
diff changeset
479 if (u->length == (ssize_t) ctx->rest) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 if (ngx_strncmp(b->last,
1548
a83aa8c53552 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
482 ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,
3487
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
483 bytes)
1548
a83aa8c53552 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
484 != 0)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 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
487 "memcached sent invalid trailer");
3487
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
488
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
489 u->length = 0;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
490 ctx->rest = 0;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
491
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
492 return NGX_OK;
581
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
3487
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
495 u->length -= bytes;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
496 ctx->rest -= bytes;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
498 if (u->length == 0) {
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
499 u->keepalive = 1;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
500 }
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
501
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 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
506 ll = &cl->next;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 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
510 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 }
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 cl->buf->flush = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 cl->buf->memory = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 *ll = cl;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
519 last = b->last;
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
520 cl->buf->pos = last;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 b->last += bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 cl->buf->last = b->last;
1908
f2953601ed3c fix memory leak in long-lived non buffered connections
Igor Sysoev <igor@sysoev.ru>
parents: 1788
diff changeset
523 cl->buf->tag = u->output.tag;
581
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 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6122
diff changeset
526 "memcached filter bytes:%z size:%z length:%O rest:%z",
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 bytes, b->last - b->pos, u->length, ctx->rest);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
529 if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530 u->length -= bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5300
diff changeset
534 last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END);
581
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 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
537 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
538 "memcached sent invalid trailer");
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
539
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
540 b->last = last;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
541 cl->buf->last = last;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
542 u->length = 0;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
543 ctx->rest = 0;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
544
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
545 return NGX_OK;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
548 ctx->rest -= b->last - last;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 b->last = last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 cl->buf->last = last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 u->length = ctx->rest;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
553 if (u->length == 0) {
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
554 u->keepalive = 1;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
555 }
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
556
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 return NGX_OK;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 static void
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 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
563 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 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
565 "abort http memcached request");
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 return;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 static void
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 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
572 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 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
574 "finalize http memcached request");
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 return;
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 static void *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 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
581 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582 ngx_http_memcached_loc_conf_t *conf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 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
585 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2392
diff changeset
586 return NULL;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589 /*
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 * set by ngx_pcalloc():
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 * conf->upstream.bufs.num = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 * conf->upstream.next_upstream = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 * conf->upstream.temp_path = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 * conf->upstream.uri = { 0, NULL };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 * conf->upstream.location = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597 */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598
5008
fd84344f1df7 Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents: 4835
diff changeset
599 conf->upstream.local = NGX_CONF_UNSET_PTR;
5832
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
600 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
5832
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
604 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
608 /* the hardcoded values */
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 conf->upstream.cyclic_temp_file = 0;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
610 conf->upstream.buffering = 0;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
611 conf->upstream.ignore_client_abort = 0;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 conf->upstream.send_lowat = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 conf->upstream.bufs.num = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 conf->upstream.busy_buffers_size = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 conf->upstream.max_temp_file_size = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 conf->upstream.temp_file_write_size = 0;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
617 conf->upstream.intercept_errors = 1;
675
e924670896ab nginx-0.3.59-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
618 conf->upstream.intercept_404 = 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 conf->upstream.pass_request_headers = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620 conf->upstream.pass_request_body = 0;
6122
85f00678e54a Memcached: enabled ranges.
Martin Mlynář <nexus@smoula.net>
parents: 5832
diff changeset
621 conf->upstream.force_ranges = 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622
1787
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
623 conf->index = NGX_CONF_UNSET;
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
624 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
625
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 return conf;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 static char *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631 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
632 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633 ngx_http_memcached_loc_conf_t *prev = parent;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 ngx_http_memcached_loc_conf_t *conf = child;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635
5008
fd84344f1df7 Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents: 4835
diff changeset
636 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
637 prev->upstream.local, NULL);
fd84344f1df7 Fixed and improved the "*_bind" directives of proxying modules.
Ruslan Ermilov <ru@nginx.com>
parents: 4835
diff changeset
638
5832
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
639 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
640 prev->upstream.next_upstream_tries, 0);
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
641
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643 prev->upstream.connect_timeout, 60000);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 prev->upstream.send_timeout, 60000);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 prev->upstream.read_timeout, 60000);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650
5832
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
651 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
652 prev->upstream.next_upstream_timeout, 0);
d09b689911ac Upstream: limited next_upstream time and tries (ticket #544).
Roman Arutyunyan <arut@nginx.com>
parents: 5801
diff changeset
653
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 ngx_conf_merge_size_value(conf->upstream.buffer_size,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 prev->upstream.buffer_size,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 (size_t) ngx_pagesize);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 prev->upstream.next_upstream,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 (NGX_CONF_BITMASK_SET
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 |NGX_HTTP_UPSTREAM_FT_ERROR
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
664 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
665 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
666 |NGX_HTTP_UPSTREAM_FT_OFF;
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
667 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
668
1787
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
669 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
670 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
671 }
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
672
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
673 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
674 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
675 }
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
676
4835
a4512d7737f6 Memcached: memcached_gzip_flag directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4499
diff changeset
677 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
678
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679 return NGX_CONF_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 static char *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684 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
685 {
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
686 ngx_http_memcached_loc_conf_t *mlcf = conf;
581
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 ngx_str_t *value;
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
689 ngx_url_t u;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 ngx_http_core_loc_conf_t *clcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
692 if (mlcf->upstream.upstream) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 return "is duplicate";
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696 value = cf->args->elts;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
697
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
698 ngx_memzero(&u, sizeof(ngx_url_t));
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
699
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
700 u.url = value[1];
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
701 u.no_resolve = 1;
815
b630109560b7 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 807
diff changeset
702
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
703 mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
704 if (mlcf->upstream.upstream == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
705 return NGX_CONF_ERROR;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
707
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708 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
709
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710 clcf->handler = ngx_http_memcached_handler;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712 if (clcf->name.data[clcf->name.len - 1] == '/') {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713 clcf->auto_redirect = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
716 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
717
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
718 if (mlcf->index == NGX_ERROR) {
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
719 return NGX_CONF_ERROR;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
720 }
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
721
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
722 return NGX_CONF_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723 }