From fdfc504f21369e682ec03cfc687d9aa61537e96e Mon Sep 17 00:00:00 2001 From: konn Date: Sat, 1 Jul 2006 02:19:16 +0000 Subject: [PATCH] * add cookie simulator. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/trunk@1264 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- include/chxj_cookie.h | 3 +- src/chxj_cookie.c | 87 +++++++++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 42 deletions(-) diff --git a/include/chxj_cookie.h b/include/chxj_cookie.h index dd757daf..1cdeac35 100644 --- a/include/chxj_cookie.h +++ b/include/chxj_cookie.h @@ -19,13 +19,14 @@ #include "mod_chxj.h" #include "apr_file_io.h" +#include "apr_tables.h" #define CHXJ_COOKIE_PARAM "_chxj_cc" extern char* chxj_save_cookie(request_rec *r); extern char* chxj_add_cookie_parameter(request_rec* r, char* value, char* cookie_id); extern int chxj_cookie_check_host(request_rec* r, char* value); -extern char* chxj_load_cookie(request_rec* r, char* cookie_id); +extern apr_array_header_t* chxj_load_cookie(request_rec* r, char* cookie_id); extern apr_file_t* chxj_cookie_db_lock(request_rec* r); extern void chxj_cookie_db_unlock(request_rec* r, apr_file_t* file); diff --git a/src/chxj_cookie.c b/src/chxj_cookie.c index ff6dcd3b..d03f11cb 100644 --- a/src/chxj_cookie.c +++ b/src/chxj_cookie.c @@ -50,7 +50,9 @@ chxj_save_cookie(request_rec* r) mod_chxj_config* dconf; chxjconvrule_entry* entryp; apr_file_t* file; - + apr_table_t* new_cookie_table; + apr_array_header_t* old_cookie_headers; + int has_cookie = 0; DBG(r, "start chxj_save_cookie()"); @@ -76,31 +78,47 @@ chxj_save_cookie(request_rec* r) cookie = apr_palloc(r->pool, 1); cookie[0] = 0; - DBG(r, " "); + new_cookie_table = apr_table_make(r->pool, headers->nelts); + for (ii=0; iinelts; ii++) { if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) { DBG(r, "====================================="); DBG2(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val); - cookie = apr_pstrcat(r->pool, cookie, hentryp[ii].val, "\n", NULL); + + char* key; + char* val; + char* buff; + char* pstatus; + + buff = apr_pstrdup(r->pool, hentryp[ii].val); + key = apr_strtok(buff, "=", &pstatus); + val = apr_strtok(NULL, "=", &pstatus); + + apr_table_add(new_cookie_table, key, val); + + has_cookie = 1; DBG(r, "====================================="); } } - DBG(r, " "); /* * check input parameters */ old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID"); if (old_cookie_id) { - char* tmp = chxj_load_cookie(r, old_cookie_id); - if (tmp) { - cookie = apr_pstrcat(r->pool, cookie, tmp, NULL); + old_cookie_headers = chxj_load_cookie(r, old_cookie_id); + if (old_cookie_headers) { + hentryp = (apr_table_entry_t*)old_cookie_headers->elts; + for (ii=0; iinelts; ii++) { + if (apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) { + apr_table_setn(new_cookie_table, hentryp[ii].key, hentryp[ii].val); + has_cookie = 1; + } + } } } - DBG1(r, "loaded COOKIE=[%s]", cookie); - - if (strlen(cookie) == 0) { + if (! has_cookie == 0) { DBG(r, "no cookie"); return NULL; } @@ -159,8 +177,9 @@ chxj_save_cookie(request_rec* r) /* * create val */ - dbmval.dptr = cookie; - dbmval.dsize = strlen(cookie); + headers = (apr_array_header_t*)apr_table_elts(new_cookie_table); + dbmval.dptr = (char*)headers; + dbmval.dsize = headers->elt_size * headers->nelts + sizeof(apr_array_header_t); /* * store to db @@ -184,9 +203,10 @@ on_error: * * @return loaded data. */ -char* +apr_array_header_t* chxj_load_cookie(request_rec* r, char* cookie_id) { + int ii; apr_status_t retval; apr_datum_t dbmkey; apr_datum_t dbmval; @@ -194,17 +214,15 @@ chxj_load_cookie(request_rec* r, char* cookie_id) mod_chxj_global_config* gconf; mod_chxj_config* dconf; chxjconvrule_entry* entryp; - char* cookie; - char* pstate; - char* buff; - char* loaded_data; apr_file_t* file; + apr_array_header_t* cookie_headers; + apr_table_entry_t* hentryp; DBG(r, "start chxj_load_cookie()"); - loaded_data = NULL; + cookie_headers = NULL; gconf = ap_get_module_config(r->server->module_config, &chxj_module); @@ -212,18 +230,18 @@ chxj_load_cookie(request_rec* r, char* cookie_id) entryp = chxj_apply_convrule(r, dconf->convrules); if (! entryp) { DBG(r, "end chxj_load_cookie() no pattern"); - return loaded_data; + return NULL; } if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) { DBG(r, "end chxj_load_cookie() CookieOff"); - return loaded_data; + return NULL; } file = chxj_cookie_db_lock(r); if (file == NULL) { ERR(r, "mod_chxj: Can't lock cookie db"); - return loaded_data; + return NULL; } retval = apr_dbm_open_ex(&f, @@ -235,7 +253,7 @@ chxj_load_cookie(request_rec* r, char* cookie_id) if (retval != APR_SUCCESS) { ERR2(r, "could not open dbm (type %s) auth file: %s", "default", "/tmp/cookie.db"); chxj_cookie_db_unlock(r, file); - return loaded_data; + return NULL; } /* @@ -249,27 +267,14 @@ chxj_load_cookie(request_rec* r, char* cookie_id) ERR2(r, "could not fetch dbm (type %s) auth file: %s", "default", "/tmp/cookie.db"); goto on_error; } - DBG1(r, "load cookie data[%s]", dbmval.dptr); + cookie_headers = (apr_array_header_t*)dbmval.dptr; - loaded_data = apr_pstrdup(r->pool, dbmval.dptr); - DBG(r, " "); - buff = apr_pstrdup(r->pool, dbmval.dptr); - DBG(r, " "); - for (;;) { - DBG(r, " "); - cookie = apr_strtok(buff, "\n", &pstate); - DBG(r, " "); - if (cookie == NULL) - break; - DBG(r, " "); + hentryp = (apr_table_entry_t*)cookie_headers->elts; - buff = NULL; - DBG(r, " "); - - if (strlen(cookie) == 0) continue; - DBG(r, " "); + for (ii=0; iinelts; ii++) { + DBG2(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val); - apr_table_setn(r->headers_in, "Cookie", cookie); + apr_table_setn(r->headers_in, "Cookie", apr_pstrcat(r->pool, hentryp[ii].key, "=", hentryp[ii].val, NULL)); DBG(r, " "); } DBG(r, " "); @@ -284,7 +289,7 @@ on_error: chxj_cookie_db_unlock(r, file); DBG(r, "end chxj_load_cookie()"); - return loaded_data; + return cookie_headers; } -- 2.11.0