annotate src/http/modules/ngx_http_memcached_module.c @ 4377:726a1ca9b52b

Proxy: made proxy_pass with variables more consistent. If proxy_pass was used with variables and there was no URI component, nginx always used unparsed URI. This isn't consistent with "no variables" case, where e.g. rewrites are applied even if there is no URI component. Fix is to use the same logic in both cases, i.e. only use unparsed URI if it's valid and request is the main one.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 23 Dec 2011 16:04:09 +0000
parents 16c60162c35b
children d620f497c50f
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
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 #include <ngx_config.h>
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
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 typedef struct {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 ngx_http_upstream_conf_t upstream;
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
14 ngx_int_t index;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 } ngx_http_memcached_loc_conf_t;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 typedef struct {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 size_t rest;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 ngx_http_request_t *request;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
21 ngx_str_t key;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 } ngx_http_memcached_ctx_t;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 ngx_int_t rc);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 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
35 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
36 void *parent, void *child);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 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
39 void *conf);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 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
43 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 { 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
46 { 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
47 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 { ngx_null_string, 0 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
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 static ngx_command_t ngx_http_memcached_commands[] = {
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 { ngx_string("memcached_pass"),
1788
f10228d7ea06 allow memached_pass inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1787
diff changeset
55 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
56 ngx_http_memcached_pass,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 0,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 NULL },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3061
diff changeset
61 { ngx_string("memcached_bind"),
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3061
diff changeset
62 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3399
ac9c0380337d fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3271
diff changeset
63 ngx_http_upstream_bind_set_slot,
3271
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3061
diff changeset
64 NGX_HTTP_LOC_CONF_OFFSET,
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3061
diff changeset
65 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
66 NULL },
fcd98af88df3 proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents: 3061
diff changeset
67
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 { ngx_string("memcached_connect_timeout"),
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 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
70 ngx_conf_set_msec_slot,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 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
73 NULL },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 { ngx_string("memcached_send_timeout"),
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 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
77 ngx_conf_set_msec_slot,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 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
80 NULL },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 { ngx_string("memcached_buffer_size"),
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 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
84 ngx_conf_set_size_slot,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 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
87 NULL },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 { ngx_string("memcached_read_timeout"),
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 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
91 ngx_conf_set_msec_slot,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 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
94 NULL },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 { ngx_string("memcached_next_upstream"),
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 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
98 ngx_conf_set_bitmask_slot,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NGX_HTTP_LOC_CONF_OFFSET,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 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
101 &ngx_http_memcached_next_upstream_masks },
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 ngx_null_command
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
107 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
108 NULL, /* preconfiguration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 NULL, /* postconfiguration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 NULL, /* create main configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 NULL, /* init main configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 NULL, /* create server configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 NULL, /* merge server configuration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 ngx_http_memcached_create_loc_conf, /* create location configration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 ngx_http_memcached_merge_loc_conf /* merge location configration */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_module_t ngx_http_memcached_module = {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 NGX_MODULE_V1,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 &ngx_http_memcached_module_ctx, /* module context */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 ngx_http_memcached_commands, /* module directives */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 NGX_HTTP_MODULE, /* module type */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 NULL, /* init master */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 NULL, /* init module */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 NULL, /* init process */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 NULL, /* init thread */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 NULL, /* exit thread */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NULL, /* exit process */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 NULL, /* exit master */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 NGX_MODULE_V1_PADDING
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 };
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
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
138 static ngx_str_t ngx_http_memcached_key = ngx_string("memcached_key");
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
139
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
140
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 #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
142 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
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 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 ngx_http_memcached_handler(ngx_http_request_t *r)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 ngx_int_t rc;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 ngx_http_memcached_ctx_t *ctx;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_http_memcached_loc_conf_t *mlcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152
645
4946078f0a79 nginx-0.3.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
153 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
154 return NGX_HTTP_NOT_ALLOWED;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1333
diff changeset
157 rc = ngx_http_discard_request_body(r);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
1374
aabbf66b61ea omit unnecessary conditions
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
159 if (rc != NGX_OK) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 return rc;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 if (ngx_http_set_content_type(r) != NGX_OK) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 return NGX_HTTP_INTERNAL_SERVER_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
167 if (ngx_http_upstream_create(r) != NGX_OK) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 return NGX_HTTP_INTERNAL_SERVER_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
171 u = r->upstream;
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
172
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3487
diff changeset
173 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
174 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
175
3006
95972b9e790b ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
176 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
177
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 u->conf = &mlcf->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 u->create_request = ngx_http_memcached_create_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 u->reinit_request = ngx_http_memcached_reinit_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 u->process_header = ngx_http_memcached_process_header;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 u->abort_request = ngx_http_memcached_abort_request;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 u->finalize_request = ngx_http_memcached_finalize_request;
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 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
187 if (ctx == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 return NGX_HTTP_INTERNAL_SERVER_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 ctx->rest = NGX_HTTP_MEMCACHED_END;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 ctx->request = r;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
194 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
195
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 u->input_filter_init = ngx_http_memcached_filter_init;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 u->input_filter = ngx_http_memcached_filter;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 u->input_filter_ctx = ctx;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199
3061
f444f291ed38 fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3006
diff changeset
200 r->main->count++;
f444f291ed38 fix request counter for memcached, introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents: 3006
diff changeset
201
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 ngx_http_upstream_init(r);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 return NGX_DONE;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 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
210 {
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
211 size_t len;
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
212 uintptr_t escape;
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
213 ngx_buf_t *b;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
214 ngx_chain_t *cl;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
215 ngx_http_memcached_ctx_t *ctx;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
216 ngx_http_variable_value_t *vv;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
217 ngx_http_memcached_loc_conf_t *mlcf;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
218
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
219 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
220
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
221 vv = ngx_http_get_indexed_variable(r, mlcf->index);
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
222
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
223 if (vv == NULL || vv->not_found || vv->len == 0) {
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
224 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
225 "the \"$memcached_key\" variable is not set");
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
226 return NGX_ERROR;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
227 }
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
228
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
229 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
230
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
231 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
232
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 b = ngx_create_temp_buf(r->pool, len);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 if (b == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 cl = ngx_alloc_chain_link(r->pool);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 return NGX_ERROR;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 cl->buf = b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 cl->next = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 r->upstream->request_bufs = cl;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 *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
249
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
250 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
251
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
252 ctx->key.data = b->last;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
253
1333
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
254 if (escape == 0) {
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
255 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
256
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
257 } else {
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
258 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
259 NGX_ESCAPE_MEMCACHED);
07ebeeb55700 escape space, etc in $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 1332
diff changeset
260 }
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
262 ctx->key.len = b->last - ctx->key.data;
581
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 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
265 "http memcached request: \"%V\"", &ctx->key);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266
1088
2d8e72584534 eliminate the useless space symbol
Igor Sysoev <igor@sysoev.ru>
parents: 1076
diff changeset
267 *b->last++ = CR; *b->last++ = LF;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 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
275 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 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
282 {
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
283 u_char *p, *len;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
284 ngx_str_t line;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
285 ngx_http_upstream_t *u;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
286 ngx_http_memcached_ctx_t *ctx;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 u = r->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 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
291 if (*p == LF) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 goto found;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 return NGX_AGAIN;
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 found:
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 *p = '\0';
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 line.len = p - u->buffer.pos - 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 line.data = u->buffer.pos;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 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
306 "memcached: \"%V\"", &line);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 p = u->buffer.pos;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
310 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
311
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 p += sizeof("VALUE ") - 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
316 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
317 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
318 "memcached sent invalid key in response \"%V\" "
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 "for key \"%V\"",
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
320 &line, &ctx->key);
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
325 p += ctx->key.len;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 if (*p++ != ' ') {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 goto no_valid;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 /* skip flags */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 while (*p) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 if (*p++ == ' ') {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335 goto length;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 goto no_valid;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 length:
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 len = p;
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 while (*p && *p++ != CR) { /* void */ }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346
4117
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3523
diff changeset
347 u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);
103b0d9afe07 Upstream: content_length_n API change.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3523
diff changeset
348 if (u->headers_in.content_length_n == -1) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 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
350 "memcached sent invalid length in response \"%V\" "
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 "for key \"%V\"",
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
352 &line, &ctx->key);
581
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 u->headers_in.status_n = 200;
1567
31d4278d51c0 memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents: 1554
diff changeset
357 u->state->status = 200;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 u->buffer.pos = p + 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 if (ngx_strcmp(p, "END\x0d") == 0) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 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
365 "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
366
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367 u->headers_in.status_n = 404;
1567
31d4278d51c0 memcached did not set $upstream_response_time
Igor Sysoev <igor@sysoev.ru>
parents: 1554
diff changeset
368 u->state->status = 404;
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
369 u->keepalive = 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 }
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 no_valid:
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 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
377 "memcached sent invalid response: \"%V\"", &line);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 ngx_http_memcached_filter_init(void *data)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 ngx_http_memcached_ctx_t *ctx = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 u = ctx->request->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 u->length += NGX_HTTP_MEMCACHED_END;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 static ngx_int_t
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 ngx_http_memcached_filter(void *data, ssize_t bytes)
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 ngx_http_memcached_ctx_t *ctx = data;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 u_char *last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 ngx_buf_t *b;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405 ngx_chain_t *cl, **ll;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 ngx_http_upstream_t *u;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 u = ctx->request->upstream;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 b = &u->buffer;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
4118
dbddec65fdab Upstream: r->upstream->length type change to off_t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4117
diff changeset
411 if (u->length == (ssize_t) ctx->rest) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 if (ngx_strncmp(b->last,
1548
a83aa8c53552 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
414 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
415 bytes)
1548
a83aa8c53552 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
416 != 0)
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 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
419 "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
420
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
421 u->length = 0;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
422 ctx->rest = 0;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
423
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
424 return NGX_OK;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426
3487
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
427 u->length -= bytes;
5d2acf153153 revert partially r1555 and fix the error "memcached sent invalid trailer"
Igor Sysoev <igor@sysoev.ru>
parents: 3399
diff changeset
428 ctx->rest -= bytes;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
430 if (u->length == 0) {
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
431 u->keepalive = 1;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
432 }
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
433
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 return NGX_OK;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 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
438 ll = &cl->next;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 }
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 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
442 if (cl == NULL) {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 return NGX_ERROR;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 cl->buf->flush = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 cl->buf->memory = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 *ll = cl;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
451 last = b->last;
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
452 cl->buf->pos = last;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 b->last += bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 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
455 cl->buf->tag = u->output.tag;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 "memcached filter bytes:%z size:%z length:%z rest:%z",
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 bytes, b->last - b->pos, u->length, ctx->rest);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
461 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
462 u->length -= bytes;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 return NGX_OK;
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
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
466 last += u->length - NGX_HTTP_MEMCACHED_END;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 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
469 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
470 "memcached sent invalid trailer");
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
471
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
472 b->last = last;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
473 cl->buf->last = last;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
474 u->length = 0;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
475 ctx->rest = 0;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
476
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
477 return NGX_OK;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479
1554
30fcc8478d85 two commits those go together by mistake
Igor Sysoev <igor@sysoev.ru>
parents: 1548
diff changeset
480 ctx->rest -= b->last - last;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 b->last = last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 cl->buf->last = last;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 u->length = ctx->rest;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484
4121
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
485 if (u->length == 0) {
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
486 u->keepalive = 1;
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
487 }
16c60162c35b Keepalive support in memcached.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4118
diff changeset
488
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 return NGX_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 static void
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 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
495 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 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
497 "abort http memcached request");
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 return;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 static void
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 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
504 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 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
506 "finalize http memcached request");
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 return;
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 static void *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 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
513 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 ngx_http_memcached_loc_conf_t *conf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 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
517 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
518 return NULL;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 /*
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 * set by ngx_pcalloc():
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 * conf->upstream.bufs.num = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 * conf->upstream.next_upstream = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 * conf->upstream.temp_path = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 * conf->upstream.uri = { 0, NULL };
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 * conf->upstream.location = NULL;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 */
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
537 /* the hardcoded values */
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 conf->upstream.cyclic_temp_file = 0;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
539 conf->upstream.buffering = 0;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
540 conf->upstream.ignore_client_abort = 0;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 conf->upstream.send_lowat = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 conf->upstream.bufs.num = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 conf->upstream.busy_buffers_size = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 conf->upstream.max_temp_file_size = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 conf->upstream.temp_file_write_size = 0;
657
400711951595 nginx-0.3.50-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 649
diff changeset
546 conf->upstream.intercept_errors = 1;
675
e924670896ab nginx-0.3.59-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
547 conf->upstream.intercept_404 = 1;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 conf->upstream.pass_request_headers = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 conf->upstream.pass_request_body = 0;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
1787
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
551 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
552
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553 return conf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 static char *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 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
559 {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 ngx_http_memcached_loc_conf_t *prev = parent;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 ngx_http_memcached_loc_conf_t *conf = child;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 prev->upstream.connect_timeout, 60000);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 prev->upstream.send_timeout, 60000);
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 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 prev->upstream.read_timeout, 60000);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 ngx_conf_merge_size_value(conf->upstream.buffer_size,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 prev->upstream.buffer_size,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 (size_t) ngx_pagesize);
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 prev->upstream.next_upstream,
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 (NGX_CONF_BITMASK_SET
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579 |NGX_HTTP_UPSTREAM_FT_ERROR
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
582 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
583 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
584 |NGX_HTTP_UPSTREAM_FT_OFF;
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
585 }
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
586
1787
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
587 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
588 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
589 }
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
590
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
591 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
592 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
593 }
a37fe5ceacc4 inherit $memached_key index and memcached_pass upstream inside "if" block
Igor Sysoev <igor@sysoev.ru>
parents: 1658
diff changeset
594
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 return NGX_CONF_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 }
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
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 static char *
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600 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
601 {
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
602 ngx_http_memcached_loc_conf_t *mlcf = conf;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 ngx_str_t *value;
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
605 ngx_url_t u;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 ngx_http_core_loc_conf_t *clcf;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
608 if (mlcf->upstream.upstream) {
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 return "is duplicate";
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 value = cf->args->elts;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
614 ngx_memzero(&u, sizeof(ngx_url_t));
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615
807
3095bf59059b now the "memcached_pass" directive uses ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
616 u.url = value[1];
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
617 u.no_resolve = 1;
815
b630109560b7 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 807
diff changeset
618
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
619 mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
620 if (mlcf->upstream.upstream == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 815
diff changeset
621 return NGX_CONF_ERROR;
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 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
625
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 clcf->handler = ngx_http_memcached_handler;
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 if (clcf->name.data[clcf->name.len - 1] == '/') {
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 clcf->auto_redirect = 1;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 }
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
632 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
633
2392
3530e5bd4826 change variable name
Igor Sysoev <igor@sysoev.ru>
parents: 2391
diff changeset
634 if (mlcf->index == NGX_ERROR) {
1076
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
635 return NGX_CONF_ERROR;
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
636 }
2deb6d858c53 $memcached_key
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
637
581
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638 return NGX_CONF_OK;
326634fb9d47 nginx-0.3.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 }