2 * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #ifdef USE_MEMCACHE_COOKIE
19 #include "chxj_cookie.h"
20 #include "chxj_url_encode.h"
21 #include "chxj_apply_convrule.h"
22 #include "chxj_str_util.h"
24 #include "ap_release.h"
29 #include "apr_base64.h"
34 /* for apr-memcache */
35 #include "apr_memcache.h"
37 #define MEMCACHE_MIN_CONNECTION (0)
38 #define MEMCACHE_SMAX_CONNECTION (1)
39 #define MEMCACHE_MAX_CONNECTION (1)
40 #define MEMCACHE_TTL_CONNECTION (60)
43 #define MEMCACHE_MAX_SERVER (10)
44 #define MEMCACHE_FLAGS (0)
46 #define DEFAULT_MEMCACHE_TIMEOUT (1000)
47 #define DEFAULT_DELETE_TIMEOUT (0)
49 #define DEFAULT_COOKIE_DB_NAME "chxj_cookie"
50 #define DEFAULT_COOKIE_EXPIRE_DB_NAME "chxj_cookie_expire"
52 /* The underlying apr_memcache system is thread safe. */
53 static apr_memcache_t* mc = NULL;
56 _memcache_cleanup(void *UNUSED(notused))
63 chxj_memcache_init(request_rec *r, mod_chxj_config *m)
65 apr_memcache_server_t* st;
66 DBG(r, "start chxj_memcache_init()");
68 if (!chxj_memcache_and_memcache_server_create(r, m, &st, &mc)) {
69 ERR(r, "failed: chxj_memcache_and_memcache_server_create()");
72 apr_pool_cleanup_register(r->pool, (void *)NULL, _memcache_cleanup, _memcache_cleanup);
74 DBG(r, "end chxj_memcache_init()");
79 chxj_memcache_and_memcache_server_create(request_rec *r, mod_chxj_config *m, apr_memcache_server_t **memcache_server, apr_memcache_t **memcache)
81 DBG(r, "start chxj_memcache_server_create()");
82 if (apr_memcache_server_create(r->pool,
85 MEMCACHE_MIN_CONNECTION,
86 MEMCACHE_SMAX_CONNECTION,
87 MEMCACHE_MAX_CONNECTION,
88 MEMCACHE_TTL_CONNECTION,
89 memcache_server) != APR_SUCCESS) {
90 ERR(r, "failed apr_memcache_server_create() host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
93 DBG(r, "done create_server");
94 if (apr_memcache_create(r->pool, MEMCACHE_MAX_SERVER, MEMCACHE_FLAGS, memcache) != APR_SUCCESS) {
95 ERR(r, "failed apr_memcache_create()");
98 DBG(r, "done create memcache");
99 if (apr_memcache_add_server(*memcache, *memcache_server) != APR_SUCCESS) {
100 ERR(r, "failed apr_memcache_add_server()");
103 DBG(r, "end chxj_memcache_server_create()");
110 chxj_memcache_set_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
113 apr_uint32_t timeout = (apr_uint32_t) ((m->cookie_timeout) ? m->cookie_timeout : DEFAULT_COOKIE_TIMEOUT);
114 DBG(r, "start chxj_memcache_set_cookie()");
117 if ((ret = apr_memcache_set(mc, cookie_id, (char *)store_string, strlen(store_string), timeout, 0)) != APR_SUCCESS) {
118 if (ret == APR_EAGAIN) {
121 ERR(r, "failed: apr_memcache_set() ret:[%d]", ret);
127 DBG(r, "end chxj_memcache_set_cookie()");
133 chxj_memcache_reset_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id)
136 DBG(r, "start chxj_memcache_reset_cookie()");
139 if (! (store_string = chxj_memcache_get_cookie(r, m, cookie_id))) {
140 ERR(r, "failed: chxj_memcache_get_cookie() cookie_id:[%s]", cookie_id);
144 if (! chxj_memcache_set_cookie(r, m, cookie_id, store_string)) {
145 ERR(r, "failed: apr_memcache_set()");
149 DBG(r, "end chxj_memcache_reset_cookie()");
155 chxj_memcache_get_cookie(request_rec *r, mod_chxj_config *UNUSED(m), const char *cookie_id)
161 DBG(r, "start chxj_memcache_get_cookie()");
164 if ((ret = apr_memcache_getp(mc, r->pool, cookie_id, &load_string, &len, 0)) != APR_SUCCESS) {
165 if (ret == APR_EAGAIN) {
168 ERR(r, "failed: apr_memcache_get() cookie_id:[%s] ret:[%d]", cookie_id, ret);
174 ret_value = apr_palloc(r->pool, len+1);
175 memset(ret_value, 0, len+1);
176 memcpy(ret_value, load_string, len);
178 DBG(r, "end chxj_memcache_get_cookie()");
184 chxj_memcache_delete_cookie(request_rec *r, mod_chxj_config *UNUSED(m), const char *cookie_id)
187 DBG(r, "start chxj_memcache_delete_cookie()");
190 if ((ret = apr_memcache_delete(mc, cookie_id, 0)) != APR_SUCCESS) {
191 if (ret == APR_EAGAIN) {
194 ERR(r, "failed: apr_memcache_delete() cookie_id:[%s] ret:[%d]", cookie_id, ret);
200 DBG(r, "end chxj_memcache_delete_cookie()");
207 chxj_save_cookie_memcache(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
209 DBG(r, "start chxj_save_cookie_memcache() cookie_id:[%s]", cookie_id);
210 if (! chxj_memcache_init(r, m)) {
211 ERR(r, "Cannot create memcache server");
212 DBG(r, "end chxj_save_cookie_memcache() cookie_id:[%s]", cookie_id);
216 if (! chxj_memcache_set_cookie(r, m, cookie_id, store_string)) {
217 ERR(r, "cannot store to memcache host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
218 DBG(r, "end chxj_save_cookie_memcache() cookie_id:[%s]", cookie_id);
221 DBG(r, "stored DATA:[%s]", chxj_memcache_get_cookie(r, m, cookie_id));
222 DBG(r, "end chxj_save_cookie_memcache() cookie_id:[%s]", cookie_id);
228 chxj_update_cookie_memcache(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
230 DBG(r, "start chxj_update_cookie_memcache() cookie_id:[%s]", cookie_id);
231 if (! chxj_memcache_init(r, m)) {
232 ERR(r, "Cannot create memcache server");
233 DBG(r, "end chxj_update_cookie_memcache() cookie_id:[%s]", cookie_id);
237 if (! chxj_memcache_set_cookie(r, m, cookie_id, store_string)) {
238 ERR(r, "cannot store to memcache host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
239 DBG(r, "end chxj_update_cookie_memcache() cookie_id:[%s]", cookie_id);
242 DBG(r, "end chxj_update_cookie_memcache() cookie_id:[%s]", cookie_id);
248 chxj_load_cookie_memcache(request_rec *r, mod_chxj_config *m, const char *cookie_id)
251 DBG(r, "start chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
253 if (! chxj_memcache_init(r, m)) {
254 ERR(r, "Cannot create memcache server");
255 DBG(r, "end chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
259 if (! (load_string = chxj_memcache_get_cookie(r, m, cookie_id))) {
260 ERR(r, "cannot store to memcache host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
261 DBG(r, "end chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
264 DBG(r, "end chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
270 chxj_delete_cookie_memcache(request_rec *r, mod_chxj_config *m, const char *cookie_id)
272 DBG(r, "start chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
273 if (! chxj_memcache_init(r, m)) {
274 ERR(r, "Cannot create memcache server");
275 DBG(r, "end chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
279 if (! chxj_memcache_delete_cookie(r, m, cookie_id)) {
280 ERR(r, "cannot store to memcache host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
281 DBG(r, "end chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
284 DBG(r, "end chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
290 chxj_save_cookie_expire_memcache(request_rec *r, mod_chxj_config *m, const char *cookie_id)
292 DBG(r, "start chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
293 if (! chxj_memcache_init(r, m)) {
294 ERR(r, "Cannot create memcache server");
295 DBG(r, "end chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
299 if (! chxj_memcache_reset_cookie(r, m, cookie_id)) {
300 ERR(r, "cannot store to memcache host:[%s] port:[%d]", m->memcache.host, m->memcache.port);
301 DBG(r, "end chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
304 DBG(r, "end chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
310 chxj_delete_cookie_expire_memcache(request_rec *r, mod_chxj_config *UNUSED(m), const char *cookie_id)
312 DBG(r, "start chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
314 DBG(r, "end chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
320 chxj_cookie_expire_gc_memcache(request_rec *r, mod_chxj_config *UNUSED(m))
322 DBG(r, "start chxj_cookie_expire_gc_memcache()");
324 DBG(r, "end chxj_cookie_expire_gc_memcache()");