void chxj_cookie_expire_gc(request_rec *r) { mod_chxj_config *dconf; int done_proc = 0; DBG(r, "start chxj_cookie_expire_gc()"); dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (! chxj_cookie_expire_gc_mysql(r, dconf)) { ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_mysql()", APLOG_MARK); return; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! chxj_cookie_expire_gc_memcache(r, dconf)) { ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_memcache()", APLOG_MARK); return; } done_proc = 1; } #endif if (!done_proc) { if (! chxj_cookie_expire_gc_dbm(r, dconf)) { ERR(r, "%s:%d end chxj_cookie_expire_gc(): failed: chxj_cookie_expire_gc_dbm()", APLOG_MARK); return; } } DBG(r, "end chxj_cookie_expire_gc()"); }
/** * The device is specified from UserAgent. * @param r Request_rec is appointed. * @param userAgent UserAgent is appointed here, * @return The style which corresponds is returned. */ device_table * chxj_specified_device(request_rec *r, const char *user_agent) { device_table *dt = &UNKNOWN_DEVICE; mod_chxj_config *conf; mod_chxj_req_config *request_conf; DBG(r, "REQ[%X] start %s()", TO_ADDR(r),__func__); request_conf = chxj_get_req_config(r); if (user_agent) { request_conf->user_agent = apr_pstrdup(r->pool, user_agent); } else { request_conf->user_agent = ""; } conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if(! user_agent){ request_conf->spec = dt; DBG(r, "REQ[%X] end %s() %d", TO_ADDR(r), __func__,conf->detect_device_type); return dt; } dt = s_specified_device_from_xml(r,conf, user_agent); if (conf->detect_device_type == CHXJ_ADD_DETECT_DEVICE_TYPE_TSV ){ s_specified_device_from_tsv(r,dt,user_agent); } /* save to spec cache */ request_conf->spec = dt; DBG(r, "REQ[%X] end %s() %d",TO_ADDR(r), __func__,conf->detect_device_type); return dt; }
static void s_send_request_to_google_analytics(request_rec *r, const char *utm_url) { apr_pool_t *ppool; apr_size_t response_len; char *data; int ii; request_rec *get_r; mod_chxj_config *conf; DBG(r, "REQ[%X] start %s()", TO_ADDR(r),__func__); apr_pool_create(&ppool, r->pool); get_r = apr_palloc(ppool, sizeof(request_rec)); memset(get_r, 0, sizeof(request_rec)); get_r->pool = ppool; get_r->headers_in = apr_table_make(ppool, 4); get_r->headers_out = apr_table_make(ppool, 4); apr_table_setn(get_r->headers_in, "User-Agent",apr_table_get(r->headers_in, "User-Agent")); apr_table_setn(get_r->headers_in, "Host", DL_GOOGLE_HOST); // ichiou data ni totte oku. tsukawanai kedo. data = chxj_serf_get(get_r, ppool, utm_url, 0, &response_len); DBG(r, "REQ[%X] response from google:[%s]", TO_ADDR(r), data); conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if (conf->google_analytics_debug && *conf->google_analytics_debug) { FILE *fp; if ((fp = fopen(conf->google_analytics_debug, "w")) != NULL) { fwrite(data, response_len, 1, fp); fclose(fp); } } DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); }
void chxj_save_cookie_expire(request_rec *r, cookie_t *cookie) { int done_proc = 0; mod_chxj_config *dconf; DBG(r, "start chxj_save_cookie_expire()"); if (!cookie) { DBG(r, "cookie is NULL"); return; } if (!cookie->cookie_id) { DBG(r, "cookie->cookie_id is NULL"); return; } dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); if (!dconf) { DBG(r, "dconf is NULL"); return; } #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (! chxj_save_cookie_expire_mysql(r, dconf, cookie->cookie_id)) { ERR(r, "failed: chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie->cookie_id); DBG(r, "end chxj_save_cookie_expire()"); return; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! chxj_save_cookie_expire_memcache(r, dconf, cookie->cookie_id)) { ERR(r, "failed: chxj_save_cookie_expire_memcache() cookie_id:[%s]", cookie->cookie_id); DBG(r, "end chxj_save_cookie_expire()"); return; } done_proc = 1; } #endif if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) { if (! chxj_save_cookie_expire_dbm(r, dconf, cookie->cookie_id)) { ERR(r, "failed: chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie->cookie_id); DBG(r, "end chxj_save_cookie_expire()"); return; } } DBG(r, "end chxj_save_cookie_expire()"); }
int chxj_cookie_unlock(request_rec *r) { mod_chxj_config *dconf; int done_proc = 0; apr_status_t rv; int rtn = 1; DBG(r, "start chxj_cookie_unlock()"); dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (! chxj_cookie_unlock_mysql(r, dconf)) { ERR(r, "failed: chxj_cookie_unlock_mysql()"); rtn = 0; goto end_chxj_cookie_unlock; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! chxj_cookie_unlock_memcache(r, dconf)) { ERR(r, "failed: chxj_cookie_unlock_memcache()"); rtn = 0; goto end_chxj_cookie_unlock; } done_proc = 1; } #endif if (!done_proc) { if (! chxj_cookie_unlock_dbm(r, dconf)) { ERR(r, "failed: chxj_cookie_unlock_dbm()"); rtn = 0; goto end_chxj_cookie_unlock; } } end_chxj_cookie_unlock: if ((rv = apr_proc_mutex_unlock(global_cookie_mutex)) != APR_SUCCESS) { char errstr[255]; ERR(r, "%s:%d apr_proc_mutex_unlock failure.(%d:%s)", APLOG_MARK, rv, apr_strerror(rv, errstr, 255)); return 0; } DBG(r, "end chxj_cookie_unlock()"); return rtn; }
int chxj_google_analytics_handler(request_rec *r) { mod_chxj_config *conf; DBG(r, "REQ[%X] start %s()", TO_ADDR(r),__func__); conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if (conf->use_google_analytics != 1 || conf->google_analytics_account == NULL || conf->google_analytics_target == NULL) { DBG(r, "REQ[%X] end %s() (ChxjUseGoogleAnalytics Off)", TO_ADDR(r),__func__); return DECLINED; } if (strcmp(r->handler, "chxj-google-analytics-handler")) { DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); return DECLINED; } s_track_page_view(r); chxj_remove_filter(r); DBG(r,"REQ[%X] end %s()", TO_ADDR(r),__func__); return OK; }
/** * The device is specified from TSV file. * @param r Request_rec is appointed. * @param userAgent UserAgent is appointed here, * @return The style which corresponds is returned. */ static device_table * s_specified_device_from_tsv(request_rec *r,device_table *spec,const char *user_agent) { if(spec->device_id == NULL){ return spec; } DBG(r, "REQ[%X] start %s() device_id:[%s]", TO_ADDR(r), __func__,spec->device_id); mod_chxj_config *conf; conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if(conf->device_hash == NULL){ DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); return spec; } char *key = apr_psprintf(r->pool,"%d.%s",spec->provider,spec->device_id); apr_table_t *ht = apr_hash_get(conf->device_hash,key,APR_HASH_KEY_STRING); if(ht != NULL){ DBG(r, "REQ[%X] found ! %s() %s", TO_ADDR(r), __func__,key); int i; for ( i=0; i< conf->device_keys->nelts; i++){ const char *k = ((const char**)conf->device_keys->elts)[i]; char *val = (char *)apr_table_get(ht,k); if(val == NULL){ continue; } DBG(r, "REQ[%X] start chxj_specified_device_from_tsv() [%s] = [%s]:[%s]",TO_ADDR(r),spec->device_id,k,val); if (STRCASEEQ('d','D',"device_name",k)){ spec->device_name = apr_pstrdup(r->pool,val); } if (STRCASEEQ('w','W',"width",k)){ if(chxj_chk_numeric(val) == 0){ spec->width = chxj_atoi(val); } } else if (STRCASEEQ('h','H',"heigh",k)){ if(chxj_chk_numeric(val) == 0){ spec->heigh = chxj_atoi(val); } } else if (STRCASEEQ('h','H',"height",k)){ if(chxj_chk_numeric(val) == 0){ spec->heigh = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_width",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_width = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_heigh",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_heigh = chxj_atoi(val); } } else if (STRCASEEQ('w','W',"wp_height",k)){ if(chxj_chk_numeric(val) == 0){ spec->wp_heigh = chxj_atoi(val); } } else if (STRCASEEQ('c','C',"cache",k)){ if(chxj_chk_numeric(val) == 0){ spec->cache = chxj_atoi(val); } } else if (STRCASEEQ('g','G',"gif",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_gif = tmp; } } else if (STRCASEEQ('j','J',"jpeg",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_jpeg = tmp; } } else if (STRCASEEQ('p','P',"png",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_png = tmp; } } else if (STRCASEEQ('b','B',"bmp2",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_bmp2 = tmp; } } else if (STRCASEEQ('b','B',"bmp4",k)){ int tmp = get_boolean_value(r,val); if(tmp > -1 ){ spec->available_bmp4 = tmp; } } else if (STRCASEEQ('c','C',"color",k)){ if(chxj_chk_numeric(val) == 0){ spec->color = chxj_atoi(val); } } else if (STRCASEEQ('e','E',"emoji_type",k)){ spec->emoji_type = apr_pstrdup(r->pool,val); } else if (STRCASEEQ('h','H',"html_spec_type",k)){ if (STRCASEEQ('x','X',"xhtml_mobile_1_0",val)) { spec->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0; } else if (STRCASEEQ('c','C',"chtml_1_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_1_0; } else if (STRCASEEQ('c','C',"chtml_2_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_2_0; } else if (STRCASEEQ('c','C',"chtml_3_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_3_0; } else if (STRCASEEQ('c','C',"chtml_4_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_4_0; } else if (STRCASEEQ('c','C',"chtml_5_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_5_0; } else if (STRCASEEQ('c','C',"chtml_6_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_6_0; } else if (STRCASEEQ('c','C',"chtml_7_0",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_7_0; } else if (STRCASEEQ('h','H',"hdml",val)) { spec->html_spec_type = CHXJ_SPEC_Hdml; } else if (STRCASEEQ('i','I',"ixhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Chtml_7_0; } else if (STRCASEEQ('j','J',"jhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Jhtml; } else if (STRCASEEQ('j','J',"jxhtml",val)) { spec->html_spec_type = CHXJ_SPEC_Jxhtml; } else if (STRCASEEQ('i','I',"iphone2",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone2; } else if (STRCASEEQ('i','I',"iphone3",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone3; } else if (STRCASEEQ('i','I',"iphone4",val)) { spec->html_spec_type = CHXJ_SPEC_iPhone4; } else if (STRCASEEQ('a','A',"android_s",val)) { spec->html_spec_type = CHXJ_SPEC_softbank_android; } else if (STRCASEEQ('a','A',"android_a",val)) { spec->html_spec_type = CHXJ_SPEC_au_android; } else if (STRCASEEQ('a','A',"android_d",val)) { spec->html_spec_type = CHXJ_SPEC_docomo_android; } else if (STRCASEEQ('a','A',"android",val)) { spec->html_spec_type = CHXJ_SPEC_android; } } else if (STRCASEEQ('o','O',"output_encoding",k)){ spec->output_encoding = apr_pstrdup(r->pool,val); } } } DBG(r, "REQ[%X] end %s() [%d]",TO_ADDR(r),__func__,spec->provider); return spec; }
char * chxj_google_analytics_get_image_url(request_rec *r, const char *pagetitle) { char *url; char *referer; char *query; char *path; char *ptitle; mod_chxj_config *conf; int rdm; apr_pool_t *pool; apr_size_t plen; DBG(r, "REQ[%X] start %s()", TO_ADDR(r),__func__); conf = chxj_get_module_config(r->per_dir_config, &chxj_module); if (conf->use_google_analytics != 1 || conf->google_analytics_account == NULL || conf->google_analytics_target == NULL) { DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); return ""; } srand(time(0)); rdm = rand(); apr_pool_create(&pool, r->pool); plen = 0; ptitle = ""; if (pagetitle) { plen = strlen(pagetitle); ptitle = chxj_iconv(r,pool,apr_pstrdup(pool, pagetitle),&plen,"CP932","UTF-8"); } else { ptitle = "(no name)"; } url = apr_pstrdup(pool, conf->google_analytics_target); url = apr_pstrcat(pool, url, "?", NULL); url = apr_pstrcat(pool, url, "utmac=", conf->google_analytics_account, NULL); url = apr_pstrcat(pool, url, "&utmn=", apr_psprintf(pool, "%d",rdm), NULL); url = apr_pstrcat(pool, url, "&utmdt=", chxj_url_encode(pool, ptitle), NULL); referer = (char *)apr_table_get(r->headers_in, "Referer"); DBG(r, "REQ[%X] referer:[%s]", TO_ADDR(r), referer); query = r->args ? apr_pstrdup(pool, r->args) : ""; DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r), query); path = r->unparsed_uri ? apr_pstrdup(pool, r->unparsed_uri) : ""; DBG(r, "REQ[%X] path:[%s]", TO_ADDR(r), path); if (! referer || *referer == '\0') { referer = "-"; } url = apr_pstrcat(pool, url, "&utmr=", chxj_url_encode(pool,referer), NULL); DBG(r, "REQ[%X] url:[%s]", TO_ADDR(r), url); if (path && *path != '\0') { if (query && *query != '\0') { path = apr_pstrcat(pool, path, "?", query, NULL); } url = apr_pstrcat(pool, url, "&utmp=", chxj_url_encode(pool,path), NULL); } DBG(r, "REQ[%X] url:[%s]", TO_ADDR(r), url); url = apr_pstrcat(pool, url, "&guid=ON", NULL); DBG(r, "REQ[%X] url:[%s]", TO_ADDR(r), url); int len = strlen(url); int ii, jj; char *ret = apr_palloc(pool, len * 4 + 1); memset(ret, 0, len * 4 + 1); for (ii=0,jj=0; ii<len; ii++) { if (url[ii] == '&') { ret[jj++] = '&'; ret[jj++] = 'a'; ret[jj++] = 'm'; ret[jj++] = 'p'; ret[jj++] = ';'; } else { ret[jj++] = url[ii]; } } DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__); return ret; }
cookie_t * chxj_save_cookie(request_rec *r) { int ii; apr_array_header_t *headers; apr_table_entry_t *hentryp; apr_array_header_t *err_headers; apr_table_entry_t *err_hentryp; char *old_cookie_id; char *store_string; mod_chxj_config *dconf; chxjconvrule_entry *entryp; apr_table_t *new_cookie_table; int has_cookie = 0; cookie_t *cookie; cookie_t *old_cookie; char *refer_string; apr_uri_t parsed_uri; int has_refer; DBG(r, "start chxj_save_cookie()"); cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t)); cookie->cookie_id = NULL; has_cookie = 0; has_refer = 0; dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); entryp = chxj_apply_convrule(r, dconf->convrules); if (! entryp) { DBG(r, "end chxj_save_cookie() no pattern"); return NULL; } if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) { DBG(r, "end chxj_save_cookie() CookieOff"); return NULL; } headers = (apr_array_header_t*)apr_table_elts(r->headers_out); hentryp = (apr_table_entry_t*)headers->elts; err_headers = (apr_array_header_t*)apr_table_elts(r->err_headers_out); err_hentryp = (apr_table_entry_t*)err_headers->elts; new_cookie_table = apr_table_make(r->pool, 0); for (ii=0; ii<headers->nelts; ii++) { if (strcasecmp(hentryp[ii].key, "Set-Cookie") == 0) { DBG(r, "====================================="); DBG(r, "cookie=[%s:%s]", hentryp[ii].key, hentryp[ii].val); char* key; char* val; char* buff; buff = apr_pstrdup(r->pool, hentryp[ii].val); val = strchr(buff, '='); if (val) { key = buff; *val++ = 0; apr_table_add(new_cookie_table, key, val); if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++; } has_cookie = 1; DBG(r, "====================================="); } } for (ii=0; ii<err_headers->nelts; ii++) { if (strcasecmp(err_hentryp[ii].key, "Set-Cookie") == 0) { DBG(r, "====================================="); DBG(r, "cookie=[%s:%s]", err_hentryp[ii].key, err_hentryp[ii].val); char* key; char* val; char* buff; buff = apr_pstrdup(r->pool, err_hentryp[ii].val); val = strchr(buff, '='); if (val) { key = buff; *val++ = 0; apr_table_add(new_cookie_table, key, val); if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++; } has_cookie = 1; DBG(r, "====================================="); } } apr_table_unset(r->headers_out, "Set-Cookie"); apr_table_unset(r->err_headers_out, "Set-Cookie"); if (! has_refer) { apr_uri_parse(r->pool,r->uri, &parsed_uri); refer_string = apr_psprintf(r->pool, "%s://%s%s", chxj_run_http_scheme(r), r->hostname, apr_uri_unparse(r->pool, &parsed_uri, APR_URI_UNP_OMITSITEPART)); if (r->args && strlen(r->args)) { refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL); } apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string); DBG(r, "ADD REFER[%s]", refer_string); has_cookie++; } /* * check input parameters */ old_cookie_id = (char*)apr_table_get(r->headers_in, "CHXJ_COOKIE_ID"); if (old_cookie_id) { old_cookie = chxj_load_cookie(r, old_cookie_id); if (old_cookie && old_cookie->cookie_headers) { hentryp = (apr_table_entry_t*)old_cookie->cookie_headers->elts; for (ii=0; ii<old_cookie->cookie_headers->nelts; ii++) { if (hentryp && apr_table_get(new_cookie_table, hentryp[ii].key) == NULL) { apr_table_add(new_cookie_table, hentryp[ii].key, hentryp[ii].val); has_cookie = 1; } } chxj_delete_cookie(r, old_cookie_id); chxj_delete_cookie_expire(r, old_cookie_id); } } if (! has_cookie) { DBG(r, "no cookie"); DBG(r, "end chxj_save_cookie()"); return NULL; } /* * create val */ cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(new_cookie_table); store_string = apr_palloc(r->pool, 1); store_string[0] = 0; hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts; for (ii=0; ii<cookie->cookie_headers->nelts; ii++) { if (ii) store_string = apr_pstrcat(r->pool, store_string, "\n", NULL); store_string = apr_pstrcat(r->pool, store_string, hentryp[ii].key, "=", hentryp[ii].val, NULL); } if (old_cookie_id && IS_COOKIE_LAZY(dconf)) { DBG(r, "LAZY COOKIE save"); cookie->cookie_id = apr_pstrdup(r->pool, old_cookie_id); } else { DBG(r, "NO LAZY COOKIE save. old_cookie_id:[%s] LAZY:[%d]", old_cookie_id,IS_COOKIE_LAZY(dconf)); cookie->cookie_id = alloc_cookie_id(r); } { int done_proc = 0; #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (! chxj_save_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "%s:%d faild: chxj_save_cookie_mysql() cookie_id:[%s]", APLOG_MARK,cookie->cookie_id); cookie = NULL; goto on_error; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! chxj_save_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "%s:%d failed: chxj_save_cookie_memcache() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id); cookie = NULL; goto on_error; } done_proc = 1; } #endif if (IS_COOKIE_STORE_DBM(dconf->cookie_store_type) || ! done_proc) { if (! chxj_save_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "%s:%d failed: chxj_save_cookie_dbm() cookie_id:[%s]", APLOG_MARK, cookie->cookie_id); cookie = NULL; goto on_error; } } } if (cookie) { chxj_save_cookie_expire(r, cookie); } on_error: DBG(r, "end chxj_save_cookie()"); return cookie; }
/* * * @return loaded data. */ cookie_t * chxj_load_cookie(request_rec *r, char *cookie_id) { mod_chxj_config *dconf; chxjconvrule_entry *entryp; cookie_t *cookie; apr_table_t *load_cookie_table; char *load_string = NULL; char *pstat; char *key; char *val; char *pair; char *header_cookie; DBG(r, "start chxj_load_cookie() cookie_id=[%s]", cookie_id); chxj_cookie_expire_gc(r); cookie = (cookie_t*)apr_palloc(r->pool, sizeof(cookie_t)); cookie->cookie_headers = NULL; cookie->cookie_id = apr_pstrdup(r->pool, cookie_id); dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); entryp = chxj_apply_convrule(r, dconf->convrules); if (! entryp) { DBG(r, "end chxj_load_cookie() no pattern"); goto on_error0; } if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) { DBG(r, "end chxj_load_cookie() CookieOff"); goto on_error0; } load_cookie_table = apr_table_make(r->pool, 0); { int done_proc = 0; #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (! (load_string = chxj_load_cookie_mysql(r, dconf, cookie->cookie_id))) { ERR(r, "%s:%d failed: chxj_load_cookie_mysql() cookie_id:[%s]", APLOG_MARK, cookie_id); goto on_error0; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! (load_string = chxj_load_cookie_memcache(r, dconf, cookie->cookie_id))) { ERR(r, "%s:%d failed: chxj_load_cookie_memcache() cookie_id:[%s]", APLOG_MARK,cookie_id); goto on_error0; } done_proc = 1; } #endif if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) { if (! (load_string = chxj_load_cookie_dbm(r, dconf, cookie->cookie_id))) { ERR(r, "%s:%d failed: chxj_load_cookie_dbm() cookie_id:[%s]", APLOG_MARK,cookie_id); goto on_error0; } } } if (load_string) { DBG(r, "load_string=[%s]", load_string); header_cookie = apr_palloc(r->pool, 1); header_cookie[0] = 0; for (;;) { char *tmp_sem; char *tmp_pair; pair = apr_strtok(load_string, "\n", &pstat); load_string = NULL; if (!pair) break; DBG(r, "Cookie:[%s]", pair); tmp_pair = apr_pstrdup(r->pool, pair); val = strchr(tmp_pair, '='); if (val) { key = tmp_pair; *val++ = 0; apr_table_add(load_cookie_table, key, val); DBG(r, "ADD key:[%s] val:[%s]", key, val); } tmp_pair = apr_pstrdup(r->pool, pair); tmp_sem = strchr(tmp_pair, ';'); if (tmp_sem) *tmp_sem = '\0'; if (check_valid_cookie_attribute(r, pair)) { if (strlen(header_cookie)) header_cookie = apr_pstrcat(r->pool, header_cookie, ";", NULL); header_cookie = apr_pstrcat(r->pool, header_cookie, tmp_pair, NULL); } } if (strlen(header_cookie)) { DBG(r, "ADD COOKIE to REQUEST HEADER:[%s]", header_cookie); apr_table_add(r->headers_in, "Cookie", header_cookie); } cookie->cookie_headers = (apr_array_header_t*)apr_table_elts(load_cookie_table); if (apr_table_get(r->headers_in, "referer") == NULL) { apr_table_setn(r->headers_in, "referer", apr_table_get(load_cookie_table, REFERER_COOKIE_KEY)); } /* * save cookie_id to request header. */ apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id); } DBG(r, "end chxj_load_cookie()"); return cookie; on_error0: DBG(r, "end chxj_load_cookie()"); return NULL; }
cookie_t * chxj_update_cookie(request_rec *r, cookie_t *old_cookie) { int ii; apr_array_header_t *headers; apr_table_entry_t *hentryp; char *store_string; mod_chxj_config *dconf; chxjconvrule_entry *entryp; cookie_t *cookie; DBG(r, "start chxj_update_cookie()"); if (!old_cookie || ! old_cookie->cookie_headers || ! old_cookie->cookie_id) { DBG(r, "end chxj_update_cookie() (old_cookie is null)"); return NULL; } cookie = (cookie_t *)apr_palloc(r->pool, sizeof(cookie_t)); cookie->cookie_id = NULL; dconf = chxj_get_module_config(r->per_dir_config, &chxj_module); entryp = chxj_apply_convrule(r, dconf->convrules); if (! entryp) { DBG(r, "end chxj_update_cookie() no pattern"); return NULL; } if (! (entryp->action & CONVRULE_COOKIE_ON_BIT)) { DBG(r, "end chxj_update_cookie() CookieOff"); return NULL; } headers = (apr_array_header_t*)apr_table_elts(r->headers_out); hentryp = (apr_table_entry_t*)headers->elts; chxj_delete_cookie(r, old_cookie->cookie_id); chxj_delete_cookie_expire(r, old_cookie->cookie_id); if (IS_COOKIE_LAZY(dconf)) { DBG(r, "LAZY MODE"); cookie->cookie_id = apr_pstrdup(r->pool, old_cookie->cookie_id); } else { DBG(r, "NO LAZY MODE"); cookie->cookie_id = alloc_cookie_id(r); } cookie->cookie_headers = old_cookie->cookie_headers; store_string = apr_palloc(r->pool, 1); store_string[0] = 0; hentryp = (apr_table_entry_t*)cookie->cookie_headers->elts; for (ii=0; ii<cookie->cookie_headers->nelts; ii++) { if (ii) store_string = apr_pstrcat(r->pool, store_string, "\n", NULL); DBG(r, "OLD COOKIE VALUE=[%s][%s]", hentryp[ii].key, hentryp[ii].val); store_string = apr_pstrcat(r->pool, store_string, hentryp[ii].key, "=", hentryp[ii].val, NULL); } { int done_proc = 0; #if defined(USE_MYSQL_COOKIE) if (IS_COOKIE_STORE_MYSQL(dconf->cookie_store_type)) { if (!chxj_update_cookie_mysql(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "failed: chxj_update_cookie_mysql() cookie_id:[%s]", cookie->cookie_id); goto on_error; } done_proc = 1; } #endif #if defined(USE_MEMCACHE_COOKIE) if (IS_COOKIE_STORE_MEMCACHE(dconf->cookie_store_type)) { if (! chxj_update_cookie_memcache(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "failed: chxj_update_cookie_memcache() cookie_id:[%s]", cookie->cookie_id); goto on_error; } done_proc = 1; } #endif if (!done_proc || IS_COOKIE_STORE_DBM(dconf->cookie_store_type)) { if (! chxj_update_cookie_dbm(r, dconf, cookie->cookie_id, store_string)) { ERR(r, "failed: chxj_update_cookie_dbm() cookie_id:[%s]", cookie->cookie_id); goto on_error; } } } chxj_save_cookie_expire(r, cookie); apr_table_setn(r->headers_in, "CHXJ_COOKIE_ID", cookie->cookie_id); on_error: DBG(r, "end chxj_update_cookie()"); return cookie; }