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.
20 #include "chxj_cookie.h"
21 #include "chxj_url_encode.h"
22 #include "chxj_apply_convrule.h"
23 #include "chxj_str_util.h"
25 #include "ap_release.h"
31 #include "apr_base64.h"
36 #if defined(USE_MYSQL_COOKIE)
37 # include "chxj_mysql.h"
39 #if defined(USE_MEMCACHE_COOKIE)
40 # include "chxj_memcache.h"
45 static char* s_get_hostname_from_url(request_rec* r, char* value);
46 static char* s_cut_until_end_hostname(request_rec*, char* value);
47 static int valid_domain(request_rec *r, const char *value);
48 static int valid_path(request_rec *r, const char *value);
49 static int valid_expires(request_rec *r, const char *value);
50 static int valid_secure(request_rec *r, const char *value);
51 static int check_valid_cookie_attribute(request_rec *r, const char *pair);
55 alloc_cookie_id(request_rec *r)
59 unsigned char *md5_value;
64 uuid_string = apr_palloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
65 memset(uuid_string, 0, APR_UUID_FORMATTED_LENGTH + 1);
66 apr_uuid_format(uuid_string, &uuid);;
68 md5_value = (unsigned char*)apr_palloc(r->pool, APR_MD5_DIGESTSIZE + 1);
69 memset(md5_value, 0, APR_MD5_DIGESTSIZE + 1);
71 retval = apr_md5(md5_value,
72 (const char*)uuid_string,
73 APR_UUID_FORMATTED_LENGTH);
74 if (retval != APR_SUCCESS) {
75 ERR(r, "md5 failed.");
79 cookie_id = apr_palloc(r->pool, apr_base64_encode_len(APR_MD5_DIGESTSIZE)+1);
80 memset(cookie_id, 0, APR_MD5_DIGESTSIZE+1);
81 apr_base64_encode(cookie_id, (char*)md5_value, APR_MD5_DIGESTSIZE);
83 DBG(r, "cookie_id=[%s]", cookie_id);
85 cookie_id = chxj_url_encode(r,cookie_id);
87 DBG(r, "cookie_id=[%s]", cookie_id);
96 chxj_save_cookie(request_rec *r)
99 apr_array_header_t *headers;
100 apr_table_entry_t *hentryp;
103 mod_chxj_config *dconf;
104 chxjconvrule_entry *entryp;
105 apr_table_t *new_cookie_table;
108 cookie_t *old_cookie;
110 apr_uri_t parsed_uri;
114 DBG(r, "start chxj_save_cookie()");
116 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
117 cookie->cookie_id = NULL;
122 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
123 entryp = chxj_apply_convrule(r, dconf->convrules);
125 DBG(r, "end chxj_save_cookie() no pattern");
128 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
129 DBG(r, "end chxj_save_cookie() CookieOff");
135 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
136 hentryp = (apr_table_entry_t*)headers->elts;
139 new_cookie_table = apr_table_make(r->pool, 0);
141 for (ii=0; ii<headers->nelts; ii++) {
142 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
143 DBG(r, "=====================================");
144 DBG(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
151 buff = apr_pstrdup(r->pool, hentryp[ii].val);
152 val = strchr(buff, '=');
156 apr_table_add(new_cookie_table, key, val);
157 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
162 DBG(r, "=====================================");
165 apr_table_unset(r->headers_out, "Set-Cookie");
168 apr_uri_parse(r->pool,r->uri, &parsed_uri);
169 refer_string = apr_psprintf(r->pool,
171 chxj_run_http_scheme(r),
173 apr_uri_unparse(r->pool,
175 APR_URI_UNP_OMITSITEPART));
176 if (r->args && strlen(r->args)) {
177 refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL);
179 apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
180 DBG(r, "ADD REFER[%s]", refer_string);
186 * check input parameters
188 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
190 old_cookie = chxj_load_cookie(r, old_cookie_id);
191 if (old_cookie && old_cookie->cookie_headers) {
192 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
193 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
194 if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
195 apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
199 chxj_delete_cookie(r, old_cookie_id);
200 chxj_delete_cookie_expire(r, old_cookie_id);
206 DBG(r, "end chxj_save_cookie()");
213 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
214 store_string = apr_palloc(r->pool, 1);
216 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
218 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
219 if (ii) store_string = apr_pstrcat(r->pool,
224 store_string = apr_pstrcat(r->pool,
232 if (old_cookie_id && IS_COOKIE_LAZY(dconf)) {
233 DBG(r, "LAZY COOKIE save");
234 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie_id);
237 DBG(r, "NO LAZY COOKIE save");
238 cookie->cookie_id = alloc_cookie_id(r);
243 #if defined(USE_MYSQL_COOKIE)
244 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
245 if (! chxj_save_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
246 ERR(r, "faild: chxj_save_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
252 #if defined(USE_MEMCACHE_COOKIE)
253 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
254 if (! chxj_save_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
255 ERR(r, "failed: chxj_save_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
261 if (IS_COOKIE_STORE_DBM(dconf->cookie_store_type) || ! done_proc) {
262 if (! chxj_save_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
263 ERR(r, "failed: chxj_save_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
270 chxj_save_cookie_expire(r, cookie);
275 DBG(r, "end chxj_save_cookie()");
283 chxj_update_cookie(request_rec *r, cookie_t *old_cookie)
286 apr_array_header_t *headers;
287 apr_table_entry_t *hentryp;
289 mod_chxj_config *dconf;
290 chxjconvrule_entry *entryp;
294 DBG(r, "start chxj_update_cookie()");
295 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
296 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
300 cookie = (cookie_t *)apr_palloc(r->pool, sizeof(cookie_t));
301 cookie->cookie_id = NULL;
303 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
304 entryp = chxj_apply_convrule(r, dconf->convrules);
306 DBG(r, "end chxj_update_cookie() no pattern");
309 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
310 DBG(r, "end chxj_update_cookie() CookieOff");
314 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
315 hentryp = (apr_table_entry_t*)headers->elts;
317 chxj_delete_cookie(r, old_cookie->cookie_id);
318 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
320 if (IS_COOKIE_LAZY(dconf)) {
322 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie->cookie_id);
325 DBG(r, "NO LAZY MODE");
326 cookie->cookie_id = alloc_cookie_id(r);
329 cookie->cookie_headers = old_cookie->cookie_headers;
330 store_string = apr_palloc(r->pool, 1);
332 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
334 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
335 if (ii) store_string = apr_pstrcat(r->pool,
340 DBG(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
341 store_string = apr_pstrcat(r->pool,
351 #if defined(USE_MYSQL_COOKIE)
352 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
353 if (!chxj_update_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
354 ERR(r, "failed: chxj_update_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
361 #if defined(USE_MEMCACHE_COOKIE)
362 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
363 if (! chxj_update_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
364 ERR(r, "failed: chxj_update_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
370 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
371 if (! chxj_update_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
372 ERR(r, "failed: chxj_update_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
378 chxj_save_cookie_expire(r, cookie);
380 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
384 DBG(r, "end chxj_update_cookie()");
391 * @return loaded data.
394 chxj_load_cookie(request_rec *r, char *cookie_id)
396 mod_chxj_config *dconf;
397 chxjconvrule_entry *entryp;
399 apr_table_t *load_cookie_table;
400 char *load_string = NULL;
407 DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
408 chxj_cookie_expire_gc(r);
410 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
411 cookie->cookie_headers = NULL;
412 cookie->cookie_id = apr_pstrdup(r->pool, cookie_id);
414 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
415 entryp = chxj_apply_convrule(r, dconf->convrules);
417 DBG(r, "end chxj_load_cookie() no pattern");
420 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
421 DBG(r, "end chxj_load_cookie() CookieOff");
424 load_cookie_table = apr_table_make(r->pool, 0);
428 #if defined(USE_MYSQL_COOKIE)
429 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
430 if (! (load_string = chxj_load_cookie_mysql(r, dconf, cookie->cookie_id))) {
431 ERR(r, "failed: chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
437 #if defined(USE_MEMCACHE_COOKIE)
438 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
439 if (! (load_string = chxj_load_cookie_memcache(r, dconf, cookie->cookie_id))) {
440 ERR(r, "failed: chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
446 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
447 if (! (load_string = chxj_load_cookie_dbm(r, dconf, cookie->cookie_id))) {
448 ERR(r, "failed: chxj_load_cookie_dbm() cookie_id:[%s]", cookie_id);
455 DBG(r, "load_string=[%s]", load_string);
456 header_cookie = apr_palloc(r->pool, 1);
457 header_cookie[0] = 0;
461 pair = apr_strtok(load_string, "\n", &pstat);
465 DBG(r, "Cookie:[%s]", pair);
467 tmp_pair = apr_pstrdup(r->pool, pair);
468 val = strchr(tmp_pair, '=');
472 apr_table_add(load_cookie_table, key, val);
473 DBG(r, "ADD key:[%s] val:[%s]", key, val);
475 tmp_pair = apr_pstrdup(r->pool, pair);
476 tmp_sem = strchr(tmp_pair, ';');
480 if (check_valid_cookie_attribute(r, pair)) {
481 if (strlen(header_cookie))
482 header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL);
484 header_cookie = apr_pstrcat(r->pool, header_cookie, tmp_pair, NULL);
487 if (strlen(header_cookie)) {
488 DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie);
489 apr_table_add(r->headers_in, "Cookie", header_cookie);
492 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
494 if (apr_table_get(r->headers_in, "referer") == NULL) {
495 apr_table_setn(r->headers_in,
497 apr_table_get(load_cookie_table, REFERER_COOKIE_KEY));
501 * save cookie_id to request header.
503 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
506 DBG(r, "end chxj_load_cookie()");
512 DBG(r, "end chxj_load_cookie()");
517 check_valid_cookie_attribute(request_rec *r, const char *value)
528 DBG(r, "start check_valid_cookie_attribute() value:[%s]", value);
530 domain_pair = path_pair = expire_pair = secure_pair = NULL;
531 p = apr_pstrdup(r->pool, value);
533 /* pass first pair */
534 first_pair = apr_strtok(p, ";", &pstat);
537 pair = apr_strtok(NULL, ";", &pstat);
539 pair = qs_trim_string(r->pool, pair);
540 if (STRNCASEEQ('d','D',"domain", pair, sizeof("domain")-1)) {
541 domain_pair = apr_pstrdup(r->pool, pair);
543 else if (STRNCASEEQ('p','P',"path", pair, sizeof("path")-1)) {
544 path_pair = apr_pstrdup(r->pool, pair);
546 else if (STRNCASEEQ('e','E',"expires", pair, sizeof("expires")-1)) {
547 expire_pair = apr_pstrdup(r->pool, pair);
549 else if (STRNCASEEQ('s','S',"secure", pair, sizeof("secure")-1)) {
550 secure_pair = apr_pstrdup(r->pool, pair);
555 if (!valid_domain(r, domain_pair)) {
556 DBG(r, "invalid domain. domain_pair:[%s]", domain_pair);
561 if (!valid_path(r, path_pair)) {
562 DBG(r, "invalid path. path_pair:[%s]", path_pair);
567 if (!valid_expires(r, expire_pair)) {
568 DBG(r, "invalid expire. expire_pair:[%s]", expire_pair);
573 if (!valid_secure(r, secure_pair)) {
574 DBG(r, "invalid secure. secure_pair:[%s]", secure_pair);
578 DBG(r, "end check_valid_cookie_attribute() value:[%s]", value);
584 valid_domain(request_rec *r, const char *value)
590 char *p = apr_pstrdup(r->pool, value);
591 const char *host = apr_table_get(r->headers_in, HTTP_HOST);
593 DBG(r, "start valid_domain() value:[%s]", value);
594 DBG(r, "host:[%s]", host);
598 name = apr_strtok(p,"=", &pstat);
599 name = qs_trim_string(r->pool, name);
600 val = apr_strtok(NULL, "=", &pstat);
601 val = qs_trim_string(r->pool, val);
604 if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) {
605 DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val);
609 DBG(r, "end valid_domain() value:[%s]", value);
615 valid_path(request_rec *r, const char *value)
617 char *p = apr_pstrdup(r->pool, value);
624 DBG(r, "start valid_path() unparsed_uri:[%s] value:[%s]", r->unparsed_uri, value);
625 if (chxj_starts_with(r->unparsed_uri, "http://")) {
626 uri = strchr(&r->unparsed_uri[sizeof("http://")], '/');
628 uri = apr_pstrdup(r->pool, uri);
631 else if (chxj_starts_with(r->unparsed_uri, "https://")) {
632 uri = strchr(&r->unparsed_uri[sizeof("https://")], '/');
634 uri = apr_pstrdup(r->pool, uri);
637 else if (chxj_starts_with(r->unparsed_uri, "/")) {
638 uri = apr_pstrdup(r->pool, r->unparsed_uri);
641 uri = apr_pstrdup(r->pool, "/");
644 if ((tmp = strchr(uri, '?'))) {
647 DBG(r, "uri=[%s]", uri);
648 name = apr_strtok(p, "=", &pstat);
649 val = apr_strtok(NULL, "=", &pstat);
650 name = qs_trim_string(r->pool, name);
651 val = qs_trim_string(r->pool, val);
652 DBG(r, "name=[%s] val=[%s]", name, val);
654 DBG(r, "val:[%s] vs uri:[%s]", val, uri);
655 if (! chxj_starts_with(uri, val)) {
656 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (false)", r->unparsed_uri, value);
659 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (true)", r->unparsed_uri, value);
665 valid_expires(request_rec *r, const char *value)
669 char *p = apr_pstrdup(r->pool, value);
674 DBG(r, "start valid_expire() value:[%s]", value);
675 name = apr_strtok(p, "=", &pstat);
676 val = apr_strtok(NULL, "=", &pstat);
677 DBG(r, "name=[%s] val=[%s]", name, val);
678 now = apr_time_now();
679 expires = chxj_parse_cookie_expires(val);
681 DBG(r, "end valid_expire() value:[%s] (expired)", value);
685 DBG(r, "end valid_expire() value:[%s] (non expired)", value);
691 valid_secure(request_rec *r, const char *value)
694 DBG(r, "start valid_secure() value:[%s]", value);
695 scheme = chxj_apache_run_http_scheme(r);
696 if (strcasecmp("https", scheme)) {
697 DBG(r, "end valid_secure() value:[%s] (non secure)", value);
700 DBG(r, "end valid_secure() value:[%s] (secure)", value);
706 chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie)
711 DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
713 dst = apr_pstrdup(r->pool, value);
718 if (!cookie->cookie_id)
721 if (chxj_cookie_check_host(r, value) != 0) {
722 DBG(r, "end chxj_add_cookie_parameter()(check host)");
726 qs = strchr(dst, '?');
728 dst = apr_psprintf(r->pool, "%s&%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
731 dst = apr_psprintf(r->pool, "%s?%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
734 DBG(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
739 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
745 chxj_cookie_check_host(request_rec *r, char *value)
749 DBG(r, "hostname=[%s]", r->hostname);
751 hostnm = s_get_hostname_from_url(r, value);
753 if (strcasecmp(hostnm, r->hostname) == 0)
763 s_get_hostname_from_url(request_rec *r, char *value)
768 if (strncasecmp(value, "http://", 7) == 0 )
769 return s_cut_until_end_hostname(r, &value[7]);
771 if (strncasecmp(value, "https://", 8) == 0)
772 return s_cut_until_end_hostname(r, &value[8]);
779 s_cut_until_end_hostname(request_rec *r, char *value)
784 hostnm = sp = apr_pstrdup(r->pool, value);
786 if (*sp == '/'|| *sp == '?') {
797 chxj_delete_cookie(request_rec *r, const char *cookie_id)
800 mod_chxj_config *dconf;
802 DBG(r, "start chxj_delete_cookie()");
803 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
805 #if defined(USE_MYSQL_COOKIE)
806 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
807 if (! chxj_delete_cookie_mysql(r, dconf, cookie_id)) {
808 ERR(r, "failed: chxj_delete_cookie_mysql() cookie_id:[%s]", cookie_id);
809 DBG(r, "end chxj_delete_cookie()");
816 #if defined(USE_MEMCACHE_COOKIE)
817 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
818 if (! chxj_delete_cookie_memcache(r, dconf, cookie_id)) {
819 ERR(r, "failed: chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
820 DBG(r, "end chxj_delete_cookie()");
826 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
827 if (! chxj_delete_cookie_dbm(r, dconf, cookie_id)) {
828 ERR(r, "failed: chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
829 DBG(r, "end chxj_delete_cookie()");
834 DBG(r, "end chxj_delete_cookie()");
842 chxj_save_cookie_expire(request_rec *r, cookie_t *cookie)
845 mod_chxj_config *dconf;
847 DBG(r, "start chxj_save_cookie_expire()");
849 DBG(r, "cookie is NULL");
852 if (!cookie->cookie_id) {
853 DBG(r, "cookie->cookie_id is NULL");
857 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
859 DBG(r, "dconf is NULL");
863 #if defined(USE_MYSQL_COOKIE)
864 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
865 if (! chxj_save_cookie_expire_mysql(r, dconf, cookie->cookie_id)) {
866 ERR(r, "failed: chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie->cookie_id);
867 DBG(r, "end chxj_save_cookie_expire()");
873 #if defined(USE_MEMCACHE_COOKIE)
874 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
875 if (! chxj_save_cookie_expire_memcache(r, dconf, cookie->cookie_id)) {
876 ERR(r, "failed: chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie->cookie_id);
877 DBG(r, "end chxj_save_cookie_expire()");
883 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
884 if (! chxj_save_cookie_expire_dbm(r, dconf, cookie->cookie_id)) {
885 ERR(r, "failed: chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie->cookie_id);
886 DBG(r, "end chxj_save_cookie_expire()");
891 DBG(r, "end chxj_save_cookie_expire()");
896 chxj_delete_cookie_expire(request_rec *r, char *cookie_id)
899 mod_chxj_config *dconf;
901 DBG(r, "start chxj_delete_cookie_expire()");
903 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
905 #if defined(USE_MYSQL_COOKIE)
906 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
907 if (! chxj_delete_cookie_expire_mysql(r, dconf, cookie_id)) {
908 ERR(r, "failed: chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
914 #if defined(USE_MEMCACHE_COOKIE)
915 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
916 if (!chxj_delete_cookie_expire_memcache(r, dconf, cookie_id)) {
917 ERR(r, "failed: chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
923 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
924 if (!chxj_delete_cookie_expire_dbm(r, dconf, cookie_id)) {
925 ERR(r, "failed: chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
930 DBG(r, "end chxj_delete_cookie_expire()");
935 chxj_cookie_expire_gc(request_rec *r)
937 mod_chxj_config *dconf;
940 DBG(r, "start chxj_cookie_expire_gc()");
942 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
943 #if defined(USE_MYSQL_COOKIE)
944 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
945 if (! chxj_cookie_expire_gc_mysql(r, dconf)) {
946 ERR(r, "failed: chxj_cookie_expire_gc_mysql()");
952 #if defined(USE_MEMCACHE_COOKIE)
953 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
954 if (! chxj_cookie_expire_gc_memcache(r, dconf)) {
955 ERR(r, "failed: chxj_cookie_expire_gc_memcache()");
962 if (! chxj_cookie_expire_gc_dbm(r, dconf)) {
963 ERR(r, "failed: chxj_cookie_expire_gc_dbm()");
967 DBG(r, "end chxj_cookie_expire_gc()");
971 chxj_parse_cookie_expires(const char *s)
973 if (!s) return (apr_time_t)0;
974 return apr_date_parse_rfc(s);