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;
101 apr_array_header_t *err_headers;
102 apr_table_entry_t *err_hentryp;
105 mod_chxj_config *dconf;
106 chxjconvrule_entry *entryp;
107 apr_table_t* new_cookie_table;
110 cookie_t* old_cookie;
112 apr_uri_t parsed_uri;
116 DBG(r, "start chxj_save_cookie()");
118 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
119 cookie->cookie_id = NULL;
124 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
125 entryp = chxj_apply_convrule(r, dconf->convrules);
127 DBG(r, "end chxj_save_cookie() no pattern");
130 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
131 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;
137 err_headers = (apr_array_header_t*)apr_table_elts(r->err_headers_out);
138 err_hentryp = (apr_table_entry_t*)err_headers->elts;
140 new_cookie_table = apr_table_make(r->pool, 0);
142 for (ii=0; ii<headers->nelts; ii++) {
143 if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) {
144 DBG(r, "=====================================");
145 DBG(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val);
152 buff = apr_pstrdup(r->pool, hentryp[ii].val);
153 val = strchr(buff, '=');
157 apr_table_add(new_cookie_table, key, val);
158 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
163 DBG(r, "=====================================");
166 for (ii=0; ii<err_headers->nelts; ii++) {
167 if (strcasecmp(err_hentryp[ii].key, "Set-Cookie") == 0) {
168 DBG(r, "=====================================");
169 DBG(r, "cookie=[%s:%s]", err_hentryp[ii].key, err_hentryp[ii].val);
176 buff = apr_pstrdup(r->pool, err_hentryp[ii].val);
177 val = strchr(buff, '=');
181 apr_table_add(new_cookie_table, key, val);
182 if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++;
187 DBG(r, "=====================================");
190 apr_table_unset(r->headers_out, "Set-Cookie");
191 apr_table_unset(r->err_headers_out, "Set-Cookie");
195 apr_uri_parse(r->pool,r->uri, &parsed_uri);
196 refer_string = apr_psprintf(r->pool,
198 chxj_run_http_scheme(r),
200 apr_uri_unparse(r->pool,
202 APR_URI_UNP_OMITSITEPART));
203 if (r->args && strlen(r->args)) {
204 refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL);
206 apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
207 DBG(r, "ADD REFER[%s]", refer_string);
213 * check input parameters
215 old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID");
217 old_cookie = chxj_load_cookie(r, old_cookie_id);
218 if (old_cookie && old_cookie->cookie_headers) {
219 hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts;
220 for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) {
221 if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) {
222 apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val);
226 chxj_delete_cookie(r, old_cookie_id);
227 chxj_delete_cookie_expire(r, old_cookie_id);
233 DBG(r, "end chxj_save_cookie()");
240 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table);
241 store_string = apr_palloc(r->pool, 1);
243 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
245 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
246 if (ii) store_string = apr_pstrcat(r->pool,
251 store_string = apr_pstrcat(r->pool,
259 if (old_cookie_id && IS_COOKIE_LAZY(dconf)) {
260 DBG(r, "LAZY COOKIE save");
261 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie_id);
264 DBG(r, "NO LAZY COOKIE save");
265 cookie->cookie_id = alloc_cookie_id(r);
268 DBG(r, "TYPE:[%d]", dconf->cookie_store_type);
271 #if defined(USE_MYSQL_COOKIE)
272 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
273 if (! chxj_save_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
274 ERR(r, "faild: chxj_save_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
280 #if defined(USE_MEMCACHE_COOKIE)
281 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
282 if (! chxj_save_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
283 ERR(r, "failed: chxj_save_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
289 if (IS_COOKIE_STORE_DBM(dconf->cookie_store_type) || ! done_proc) {
290 if (! chxj_save_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
291 ERR(r, "failed: chxj_save_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
298 chxj_save_cookie_expire(r, cookie);
303 DBG(r, "end chxj_save_cookie()");
311 chxj_update_cookie(request_rec* r, cookie_t* old_cookie)
314 apr_array_header_t* headers;
315 apr_table_entry_t* hentryp;
317 mod_chxj_config* dconf;
318 chxjconvrule_entry* entryp;
322 DBG(r, "start chxj_update_cookie()");
323 if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) {
324 DBG(r, "end chxj_update_cookie() (old_cookie is null)");
328 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
329 cookie->cookie_id = NULL;
332 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
333 entryp = chxj_apply_convrule(r, dconf->convrules);
335 DBG(r, "end chxj_update_cookie() no pattern");
338 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
339 DBG(r, "end chxj_update_cookie() CookieOff");
344 headers = (apr_array_header_t*)apr_table_elts(r->headers_out);
345 hentryp = (apr_table_entry_t*)headers->elts;
348 chxj_delete_cookie(r, old_cookie->cookie_id);
349 chxj_delete_cookie_expire(r, old_cookie->cookie_id);
351 if (IS_COOKIE_LAZY(dconf)) {
353 cookie->cookie_id = apr_pstrdup(r->pool, old_cookie->cookie_id);
356 DBG(r, "NO LAZY MODE");
357 cookie->cookie_id = alloc_cookie_id(r);
360 cookie->cookie_headers = old_cookie->cookie_headers;
361 store_string = apr_palloc(r->pool, 1);
363 hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts;
365 for (ii=0; ii<cookie->cookie_headers->nelts; ii++) {
366 if (ii) store_string = apr_pstrcat(r->pool,
371 DBG(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val);
372 store_string = apr_pstrcat(r->pool,
382 #if defined(USE_MYSQL_COOKIE)
383 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
384 if (!chxj_update_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) {
385 ERR(r, "failed: chxj_update_cookie_mysql() cookie_id:[%s]", cookie->cookie_id);
392 #if defined(USE_MEMCACHE_COOKIE)
393 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
394 if (! chxj_update_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) {
395 ERR(r, "failed: chxj_update_cookie_memcache() cookie_id:[%s]", cookie->cookie_id);
401 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
402 if (! chxj_update_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) {
403 ERR(r, "failed: chxj_update_cookie_dbm() cookie_id:[%s]", cookie->cookie_id);
409 chxj_save_cookie_expire(r, cookie);
411 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
415 DBG(r, "end chxj_update_cookie()");
422 * @return loaded data.
425 chxj_load_cookie(request_rec* r, char* cookie_id)
427 mod_chxj_config *dconf;
428 chxjconvrule_entry *entryp;
430 apr_table_t *load_cookie_table;
431 char *load_string = NULL;
438 DBG(r, "========================================================");
439 DBG(r, "========================================================");
440 DBG(r, "========================================================");
441 DBG(r, "========================================================");
442 DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id);
443 chxj_cookie_expire_gc(r);
445 cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t));
446 cookie->cookie_headers = NULL;
447 cookie->cookie_id = apr_pstrdup(r->pool, cookie_id);
449 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
450 entryp = chxj_apply_convrule(r, dconf->convrules);
452 DBG(r, "end chxj_load_cookie() no pattern");
455 if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) {
456 DBG(r, "end chxj_load_cookie() CookieOff");
459 load_cookie_table = apr_table_make(r->pool, 0);
463 #if defined(USE_MYSQL_COOKIE)
464 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
465 if (! (load_string = chxj_load_cookie_mysql(r, dconf, cookie->cookie_id))) {
466 ERR(r, "failed: chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
472 #if defined(USE_MEMCACHE_COOKIE)
473 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
474 if (! (load_string = chxj_load_cookie_memcache(r, dconf, cookie->cookie_id))) {
475 ERR(r, "failed: chxj_load_cookie_memcache() cookie_id:[%s]", cookie_id);
481 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
482 if (! (load_string = chxj_load_cookie_dbm(r, dconf, cookie->cookie_id))) {
483 ERR(r, "failed: chxj_load_cookie_dbm() cookie_id:[%s]", cookie_id);
490 DBG(r, "load_string=[%s]", load_string);
491 header_cookie = apr_palloc(r->pool, 1);
492 header_cookie[0] = 0;
495 pair = apr_strtok(load_string, "\n", &pstat);
499 DBG(r, "Cookie:[%s]", pair);
502 tmp_pair = apr_pstrdup(r->pool, pair);
503 val = strchr(tmp_pair, '=');
507 apr_table_add(load_cookie_table, key, val);
508 DBG(r, "ADD key:[%s] val:[%s]", key, val);
510 tmp_pair = apr_pstrdup(r->pool, pair);
511 tmp_sem = strchr(tmp_pair, ';');
515 if (check_valid_cookie_attribute(r, pair)) {
516 if (strlen(header_cookie))
517 header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL);
519 header_cookie = apr_pstrcat(r->pool, header_cookie, tmp_pair, NULL);
522 if (strlen(header_cookie)) {
523 DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie);
524 apr_table_add(r->headers_in, "Cookie", header_cookie);
527 cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table);
529 if (apr_table_get(r->headers_in, "referer") == NULL) {
530 apr_table_setn(r->headers_in,
532 apr_table_get(load_cookie_table, REFERER_COOKIE_KEY));
536 * save cookie_id to request header.
538 apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id);
541 DBG(r, "end chxj_load_cookie()");
542 DBG(r, "========================================================");
543 DBG(r, "========================================================");
544 DBG(r, "========================================================");
545 DBG(r, "========================================================");
552 DBG(r, "end chxj_load_cookie()");
553 DBG(r, "========================================================");
554 DBG(r, "========================================================");
555 DBG(r, "========================================================");
556 DBG(r, "========================================================");
561 check_valid_cookie_attribute(request_rec *r, const char *value)
572 DBG(r, "start check_valid_cookie_attribute() value:[%s]", value);
574 domain_pair = path_pair = expire_pair = secure_pair = NULL;
575 p = apr_pstrdup(r->pool, value);
577 /* pass first pair */
578 first_pair = apr_strtok(p, ";", &pstat);
581 pair = apr_strtok(NULL, ";", &pstat);
583 pair = qs_trim_string(r->pool, pair);
584 if (STRNCASEEQ('d','D',"domain", pair, sizeof("domain")-1)) {
585 domain_pair = apr_pstrdup(r->pool, pair);
587 else if (STRNCASEEQ('p','P',"path", pair, sizeof("path")-1)) {
588 path_pair = apr_pstrdup(r->pool, pair);
590 else if (STRNCASEEQ('e','E',"expires", pair, sizeof("expires")-1)) {
591 expire_pair = apr_pstrdup(r->pool, pair);
593 else if (STRNCASEEQ('s','S',"secure", pair, sizeof("secure")-1)) {
594 secure_pair = apr_pstrdup(r->pool, pair);
599 if (!valid_domain(r, domain_pair)) {
600 DBG(r, "invalid domain. domain_pair:[%s]", domain_pair);
605 if (!valid_path(r, path_pair)) {
606 DBG(r, "invalid path. path_pair:[%s]", path_pair);
611 if (!valid_expires(r, expire_pair)) {
612 DBG(r, "invalid expire. expire_pair:[%s]", expire_pair);
617 if (!valid_secure(r, secure_pair)) {
618 DBG(r, "invalid secure. secure_pair:[%s]", secure_pair);
622 DBG(r, "end check_valid_cookie_attribute() value:[%s]", value);
627 valid_domain(request_rec *r, const char *value)
633 char *p = apr_pstrdup(r->pool, value);
634 const char *host = apr_table_get(r->headers_in, HTTP_HOST);
636 DBG(r, "start valid_domain() value:[%s]", value);
637 DBG(r, "host:[%s]", host);
641 name = apr_strtok(p,"=", &pstat);
642 name = qs_trim_string(r->pool, name);
643 val = apr_strtok(NULL, "=", &pstat);
644 val = qs_trim_string(r->pool, val);
647 if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) {
648 DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val);
652 DBG(r, "end valid_domain() value:[%s]", value);
657 valid_path(request_rec *r, const char *value)
659 char *p = apr_pstrdup(r->pool, value);
666 DBG(r, "start valid_path() unparsed_uri:[%s] value:[%s]", r->unparsed_uri, value);
667 if (chxj_starts_with(r->unparsed_uri, "http://")) {
668 uri = strchr(&r->unparsed_uri[sizeof("http://")], '/');
670 uri = apr_pstrdup(r->pool, uri);
673 else if (chxj_starts_with(r->unparsed_uri, "https://")) {
674 uri = strchr(&r->unparsed_uri[sizeof("https://")], '/');
676 uri = apr_pstrdup(r->pool, uri);
679 else if (chxj_starts_with(r->unparsed_uri, "/")) {
680 uri = apr_pstrdup(r->pool, r->unparsed_uri);
683 uri = apr_pstrdup(r->pool, "/");
686 if ((tmp = strchr(uri, '?'))) {
689 DBG(r, "uri=[%s]", uri);
690 name = apr_strtok(p, "=", &pstat);
691 val = apr_strtok(NULL, "=", &pstat);
692 name = qs_trim_string(r->pool, name);
693 val = qs_trim_string(r->pool, val);
694 DBG(r, "name=[%s] val=[%s]", name, val);
696 DBG(r, "val:[%s] vs uri:[%s]", val, uri);
697 if (! chxj_starts_with(uri, val)) {
698 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (false)", r->unparsed_uri, value);
701 DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (true)", r->unparsed_uri, value);
706 valid_expires(request_rec *r, const char *value)
710 char *p = apr_pstrdup(r->pool, value);
714 DBG(r, "start valid_expire() value:[%s]", value);
716 name = apr_strtok(p, "=", &pstat);
717 val = apr_strtok(NULL, "=", &pstat);
718 DBG(r, "name=[%s] val=[%s]", name, val);
719 now = apr_time_now();
720 expires = chxj_parse_cookie_expires(val);
722 DBG(r, "end valid_expire() value:[%s] (expired)", value);
726 DBG(r, "end valid_expire() value:[%s] (non expired)", value);
731 valid_secure(request_rec *r, const char *value)
734 DBG(r, "start valid_secure() value:[%s]", value);
735 scheme = chxj_apache_run_http_scheme(r);
736 if (strcasecmp("https", scheme)) {
737 DBG(r, "end valid_secure() value:[%s] (non secure)", value);
740 DBG(r, "end valid_secure() value:[%s] (secure)", value);
746 chxj_add_cookie_parameter(request_rec* r, char* value, cookie_t* cookie)
751 DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL);
753 dst = apr_pstrdup(r->pool, value);
758 if (!cookie->cookie_id)
761 if (chxj_cookie_check_host(r, value) != 0) {
762 DBG(r, "end chxj_add_cookie_parameter()(check host)");
766 qs = strchr(dst, '?');
768 dst = apr_psprintf(r->pool, "%s&%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
771 dst = apr_psprintf(r->pool, "%s?%s=%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id);
774 DBG(r, "end chxj_add_cookie_parameter() dst=[%s]", dst);
779 DBG(r, "end chxj_add_cookie_parameter() (on_error)");
785 chxj_cookie_check_host(request_rec* r, char* value)
789 DBG(r, "hostname=[%s]", r->hostname);
791 hostnm = s_get_hostname_from_url(r, value);
793 if (strcasecmp(hostnm, r->hostname) == 0)
803 s_get_hostname_from_url(request_rec* r, char* value)
808 if (strncasecmp(value, "http://", 7) == 0 )
809 return s_cut_until_end_hostname(r, &value[7]);
811 if (strncasecmp(value, "https://", 8) == 0)
812 return s_cut_until_end_hostname(r, &value[8]);
819 s_cut_until_end_hostname(request_rec* r, char* value)
824 hostnm = sp = apr_pstrdup(r->pool, value);
826 if (*sp == '/'|| *sp == '?') {
837 chxj_delete_cookie(request_rec *r, const char *cookie_id)
840 mod_chxj_config *dconf;
842 DBG(r, "start chxj_delete_cookie()");
843 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
845 #if defined(USE_MYSQL_COOKIE)
846 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
847 if (! chxj_delete_cookie_mysql(r, dconf, cookie_id)) {
848 ERR(r, "failed: chxj_delete_cookie_mysql() cookie_id:[%s]", cookie_id);
849 DBG(r, "end chxj_delete_cookie()");
856 #if defined(USE_MEMCACHE_COOKIE)
857 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
858 if (! chxj_delete_cookie_memcache(r, dconf, cookie_id)) {
859 ERR(r, "failed: chxj_delete_cookie_memcache() cookie_id:[%s]", cookie_id);
860 DBG(r, "end chxj_delete_cookie()");
866 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
867 if (! chxj_delete_cookie_dbm(r, dconf, cookie_id)) {
868 ERR(r, "failed: chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
869 DBG(r, "end chxj_delete_cookie()");
874 DBG(r, "end chxj_delete_cookie()");
882 chxj_save_cookie_expire(request_rec* r, cookie_t* cookie)
885 mod_chxj_config *dconf;
887 DBG(r, "start chxj_save_cookie_expire()");
889 DBG(r, "cookie is NULL");
892 if (!cookie->cookie_id) {
893 DBG(r, "cookie->cookie_id is NULL");
897 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
899 DBG(r, "dconf is NULL");
903 #if defined(USE_MYSQL_COOKIE)
904 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
905 if (! chxj_save_cookie_expire_mysql(r, dconf, cookie->cookie_id)) {
906 ERR(r, "failed: chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie->cookie_id);
907 DBG(r, "end chxj_save_cookie_expire()");
913 #if defined(USE_MEMCACHE_COOKIE)
914 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
915 if (! chxj_save_cookie_expire_memcache(r, dconf, cookie->cookie_id)) {
916 ERR(r, "failed: chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie->cookie_id);
917 DBG(r, "end chxj_save_cookie_expire()");
923 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
924 if (! chxj_save_cookie_expire_dbm(r, dconf, cookie->cookie_id)) {
925 ERR(r, "failed: chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie->cookie_id);
926 DBG(r, "end chxj_save_cookie_expire()");
931 DBG(r, "end chxj_save_cookie_expire()");
939 chxj_delete_cookie_expire(request_rec* r, char* cookie_id)
942 mod_chxj_config* dconf;
944 DBG(r, "start chxj_delete_cookie_expire()");
946 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
948 #if defined(USE_MYSQL_COOKIE)
949 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
950 if (! chxj_delete_cookie_expire_mysql(r, dconf, cookie_id)) {
951 ERR(r, "failed: chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
957 #if defined(USE_MEMCACHE_COOKIE)
958 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
959 if (!chxj_delete_cookie_expire_memcache(r, dconf, cookie_id)) {
960 ERR(r, "failed: chxj_delete_cookie_expire_memcache() cookie_id:[%s]", cookie_id);
966 if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) {
967 if (!chxj_delete_cookie_expire_dbm(r, dconf, cookie_id)) {
968 ERR(r, "failed: chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
973 DBG(r, "end chxj_delete_cookie_expire()");
980 chxj_cookie_expire_gc(request_rec* r)
982 mod_chxj_config *dconf;
985 DBG(r, "start chxj_cookie_expire_gc()");
987 dconf = chxj_get_module_config(r->per_dir_config, &chxj_module);
988 #if defined(USE_MYSQL_COOKIE)
989 if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) {
990 if (! chxj_cookie_expire_gc_mysql(r, dconf)) {
991 ERR(r, "failed: chxj_cookie_expire_gc_mysql()");
997 #if defined(USE_MEMCACHE_COOKIE)
998 if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) {
999 if (! chxj_cookie_expire_gc_memcache(r, dconf)) {
1000 ERR(r, "failed: chxj_cookie_expire_gc_memcache()");
1007 if (! chxj_cookie_expire_gc_dbm(r, dconf)) {
1008 ERR(r, "failed: chxj_cookie_expire_gc_dbm()");
1012 DBG(r, "end chxj_cookie_expire_gc()");
1016 chxj_parse_cookie_expires(const char *s)
1018 if (!s) return (apr_time_t)0;
1019 return apr_date_parse_rfc(s);