From 19ab5e95e9b122df30ac5386e029e384274a86c0 Mon Sep 17 00:00:00 2001 From: konn Date: Fri, 1 Aug 2008 02:02:32 +0000 Subject: [PATCH] * Added Features. - QUERY_STRING of the action attribute changes to return at POST. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/RELEASE_0_11_0@3164 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- include/chxj_tag_util.h | 2 +- include/mod_chxj.h | 3 + src/chxj_chtml10.c | 40 +++++++------ src/chxj_chtml20.c | 43 ++++++++------ src/chxj_chtml30.c | 46 +++++++++------ src/chxj_cookie.c | 136 +++++++++++++++++++++++++++++--------------- src/chxj_dbm.c | 5 +- src/chxj_jhtml.c | 47 +++++++++------ src/chxj_mysql.c | 2 +- src/chxj_serf.c | 15 +++-- src/chxj_tag_util.c | 10 +++- src/chxj_xhtml_mobile_1_0.c | 49 ++++++++++------ src/mod_chxj.c | 103 ++++++++++++++++++++++++++------- 13 files changed, 340 insertions(+), 161 deletions(-) diff --git a/include/chxj_tag_util.h b/include/chxj_tag_util.h index ea3d0099..4c5d5353 100644 --- a/include/chxj_tag_util.h +++ b/include/chxj_tag_util.h @@ -97,7 +97,7 @@ extern char* qs_get_parse_attr( Node* tag, request_rec* r); -extern char * chxj_form_action_to_hidden_tag(apr_pool_t *pool, const char *str, int xmlFlag); +extern char * chxj_form_action_to_hidden_tag(apr_pool_t *pool, const char *str, int xmlFlag, int post_flag); #endif /* * vim:ts=2 et diff --git a/include/mod_chxj.h b/include/mod_chxj.h index 8e38fb6f..ff1fefed 100644 --- a/include/mod_chxj.h +++ b/include/mod_chxj.h @@ -413,6 +413,9 @@ extern char* chxj_node_exchange( #define IMAGE_CACHE_LIMIT_FMT_LEN (20) +#define CHXJ_QUERY_STRING_PARAM_PREFIX "_chxj_qs_" +#define CHXJ_QUERY_STRING_PARAM_PREFIX_ENC "%5Fchxj%5Fqs%5F" + #if HAVE_MALLOC == 0 extern void *rpl_malloc(size_t n); diff --git a/src/chxj_chtml10.c b/src/chxj_chtml10.c index 66c67849..8ed12f45 100644 --- a/src/chxj_chtml10.c +++ b/src/chxj_chtml10.c @@ -1819,12 +1819,13 @@ s_chtml10_start_form_tag(void *pdoc, Node *node) request_rec *r; Attr *attr; char *new_hidden_tag = NULL; + char *attr_value = NULL; + char *attr_method = NULL; chtml10 = GET_CHTML10(pdoc); doc = chtml10->doc; r = doc->r; - W10_L("cookie); - char *q; - q = strchr(value, '?'); - if (q) { - new_hidden_tag = chxj_form_action_to_hidden_tag(doc->pool, value, 0); - *q = 0; - } - - W10_L(" action=\""); - W10_V(value); - W10_L("\""); + attr_value = chxj_encoding_parameter(r, value); + attr_value = chxj_add_cookie_parameter(r, attr_value, chtml10->cookie); } break; @@ -1862,9 +1853,7 @@ s_chtml10_start_form_tag(void *pdoc, Node *node) /*--------------------------------------------------------------------*/ /* CHTML 1.0 */ /*--------------------------------------------------------------------*/ - W10_L(" method=\""); - W10_V(value); - W10_L("\""); + attr_method = apr_pstrdup(doc->pool, value); } break; @@ -1883,6 +1872,25 @@ s_chtml10_start_form_tag(void *pdoc, Node *node) } } + int post_flag = (attr_method && strcasecmp(attr_method, "post") == 0) ? 1 : 0; + + W10_L("pool, attr_value, 0, post_flag); + *q = 0; + } + W10_L(" action=\""); + W10_V(attr_value); + W10_L("\""); + } + if (attr_method) { + W10_L(" method=\""); + W10_V(attr_method); + W10_L("\""); + } W10_L(">"); if (new_hidden_tag) { W10_V(new_hidden_tag); diff --git a/src/chxj_chtml20.c b/src/chxj_chtml20.c index a63f5861..c6a3aa1d 100644 --- a/src/chxj_chtml20.c +++ b/src/chxj_chtml20.c @@ -1426,22 +1426,21 @@ s_chtml20_start_form_tag(void *pdoc, Node *node) request_rec *r; Attr *attr; char *new_hidden_tag = NULL; + char *attr_method = NULL; + char *attr_action = NULL; chtml20 = GET_CHTML20(pdoc); doc = chtml20->doc; r = doc->r; - W_L("cookie); - char *q; - q = strchr(value, '?'); - if (q) { - new_hidden_tag = chxj_form_action_to_hidden_tag(doc->pool, value, 0); - *q = 0; - } - - W_L(" action=\""); - W_V(value); - W_L("\""); + attr_action = chxj_encoding_parameter(r, value); + attr_action= chxj_add_cookie_parameter(r, attr_action, chtml20->cookie); } break; @@ -1473,9 +1462,7 @@ s_chtml20_start_form_tag(void *pdoc, Node *node) /*--------------------------------------------------------------------*/ /* CHTML 1.0 */ /*--------------------------------------------------------------------*/ - W_L(" method=\""); - W_V(value); - W_L("\""); + attr_method = apr_pstrdup(doc->pool, value); } break; @@ -1493,6 +1480,26 @@ s_chtml20_start_form_tag(void *pdoc, Node *node) break; } } + + int post_flag = (attr_method && strcasecmp(attr_method, "post") == 0) ? 1 : 0; + + W_L("pool, attr_action, 0, post_flag); + *q = 0; + } + W_L(" action=\""); + W_V(attr_action); + W_L("\""); + } + if (attr_method) { + W_L(" method=\""); + W_V(attr_method); + W_L("\""); + } W_L(">"); if (new_hidden_tag) { W_V(new_hidden_tag); diff --git a/src/chxj_chtml30.c b/src/chxj_chtml30.c index acd7ae94..c11355d6 100644 --- a/src/chxj_chtml30.c +++ b/src/chxj_chtml30.c @@ -1350,12 +1350,14 @@ s_chtml30_start_form_tag(void *pdoc, Node *node) request_rec *r; Attr *attr; char *new_hidden_tag = NULL; + char *attr_method = NULL; + char *attr_action = NULL; + char *attr_utn = NULL; chtml30 = GET_CHTML30(pdoc); doc = chtml30->doc; r = doc->r; - W_L("cookie); - char *q; - q = strchr(value, '?'); - if (q) { - new_hidden_tag = chxj_form_action_to_hidden_tag(doc->pool, value, 0); - *q = 0; - } - W_L(" action=\""); - W_V(value); - W_L("\""); + attr_action = chxj_encoding_parameter(r, value); + attr_action = chxj_add_cookie_parameter(r, attr_action, chtml30->cookie); } else if (STRCASEEQ('m','M',"method", name)) { /*----------------------------------------------------------------------*/ /* CHTML 1.0 */ /*----------------------------------------------------------------------*/ - W_L(" method=\""); - W_V(value); - W_L("\""); + attr_method = apr_pstrdup(doc->pool, value); } else if (STRCASEEQ('u','U',"utn", name)) { /*----------------------------------------------------------------------*/ /* CHTML 3.0 */ /* It is special only for CHTML. */ /*----------------------------------------------------------------------*/ - W_L(" utn"); + attr_utn = value; } } + + int post_flag = (attr_method && strcasecmp(attr_method, "post") == 0) ? 1 : 0; + + W_L("pool, attr_action, 0, post_flag); + *q = 0; + } + W_L(" action=\""); + W_V(attr_action); + W_L("\""); + } + if (attr_method) { + W_L(" method=\""); + W_V(attr_method); + W_L("\""); + } + if (attr_utn) { + W_L(" utn"); + } W_L(">"); if (new_hidden_tag) { W_V(new_hidden_tag); diff --git a/src/chxj_cookie.c b/src/chxj_cookie.c index 72f640d7..6d88be7e 100644 --- a/src/chxj_cookie.c +++ b/src/chxj_cookie.c @@ -49,6 +49,7 @@ static int valid_path(request_rec *r, const char *value); static int valid_expires(request_rec *r, const char *value); static int valid_secure(request_rec *r, const char *value); static int check_valid_cookie_attribute(request_rec *r, const char *pair); +static int check_valid_cookie_attribute_expires_only(request_rec *r, const char *value); apr_proc_mutex_t *global_cookie_mutex; @@ -108,7 +109,7 @@ chxj_save_cookie(request_rec* r) apr_table_t* new_cookie_table; int has_cookie = 0; cookie_t* cookie; - cookie_t* old_cookie; + cookie_t* old_cookie = NULL; char* refer_string; apr_uri_t parsed_uri; int has_refer; @@ -151,7 +152,7 @@ chxj_save_cookie(request_rec* r) char* buff; char *pair = apr_psprintf(pool, "%s:%s", hentryp[ii].key, hentryp[ii].val); - if (check_valid_cookie_attribute(r, pair)) { + if (check_valid_cookie_attribute_expires_only(r, pair)) { buff = apr_pstrdup(pool, hentryp[ii].val); val = strchr(buff, '='); if (val) { @@ -160,8 +161,8 @@ chxj_save_cookie(request_rec* r) apr_table_set(new_cookie_table, apr_pstrdup(pool, key), apr_pstrdup(pool, val)); if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++; } + has_cookie = 1; } - has_cookie = 1; } } for (ii=0; iinelts; ii++) { @@ -173,17 +174,18 @@ chxj_save_cookie(request_rec* r) char* buff; - buff = apr_pstrdup(pool, err_hentryp[ii].val); - val = strchr(buff, '='); - if (val) { - key = buff; - *val++ = 0; - apr_table_set(new_cookie_table, apr_pstrdup(pool, key), apr_pstrdup(pool, val)); - if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++; - + char *pair = apr_psprintf(pool, "%s:%s", hentryp[ii].key, hentryp[ii].val); + if (check_valid_cookie_attribute_expires_only(r, pair)) { + buff = apr_pstrdup(pool, err_hentryp[ii].val); + val = strchr(buff, '='); + if (val) { + key = buff; + *val++ = 0; + apr_table_set(new_cookie_table, apr_pstrdup(pool, key), apr_pstrdup(pool, val)); + if (strcasecmp(REFERER_COOKIE_KEY, key) == 0) has_refer++; + } + has_cookie = 1; } - - has_cookie = 1; } } apr_table_unset(r->headers_out, "Set-Cookie"); @@ -309,7 +311,7 @@ DBG(r, "REQ[%X] TYPE:[%d]", (apr_size_t)r, dconf->cookie_store_type); on_error: - DBG(r, "end chxj_save_cookie()"); + DBG(r, "REQ[%X] end chxj_save_cookie()", (apr_size_t)r); return cookie; } @@ -568,13 +570,13 @@ check_valid_cookie_attribute(request_rec *r, const char *value) char *pstat; char *pair; char *first_pair; - char *domain_pair; - char *path_pair; - char *expire_pair; - char *secure_pair; + char *domain_pair = NULL; + char *path_pair = NULL; + char *expire_pair = NULL; + char *secure_pair = NULL; char *p; - DBG(r, "start check_valid_cookie_attribute() value:[%s]", value); + DBG(r, "REQ[%X] start check_valid_cookie_attribute() value:[%s]", (apr_size_t)r, value); domain_pair = path_pair = expire_pair = secure_pair = NULL; p = apr_pstrdup(r->pool, value); @@ -602,29 +604,66 @@ check_valid_cookie_attribute(request_rec *r, const char *value) if (domain_pair) { if (!valid_domain(r, domain_pair)) { - DBG(r, "invalid domain. domain_pair:[%s]", domain_pair); + DBG(r, "REQ[%X] invalid domain. domain_pair:[%s]", (apr_size_t)r, domain_pair); return CHXJ_FALSE; } } if (path_pair) { if (!valid_path(r, path_pair)) { - DBG(r, "invalid path. path_pair:[%s]", path_pair); + DBG(r, "REQ[%X] invalid path. path_pair:[%s]", (apr_size_t)r, path_pair); return CHXJ_FALSE; } } if (expire_pair) { if (!valid_expires(r, expire_pair)) { - DBG(r, "invalid expire. expire_pair:[%s]", expire_pair); + DBG(r, "REQ[%X] invalid expire. expire_pair:[%s]", (apr_size_t)r, expire_pair); return CHXJ_FALSE; } } if (secure_pair) { if (!valid_secure(r, secure_pair)) { - DBG(r, "invalid secure. secure_pair:[%s]", secure_pair); + DBG(r, "REQ[%X] invalid secure. secure_pair:[%s]", (apr_size_t)r, secure_pair); return CHXJ_FALSE; } } - DBG(r, "end check_valid_cookie_attribute() value:[%s]", value); + DBG(r, "REQ[%X] end check_valid_cookie_attribute() value:[%s]", (apr_size_t)r, value); + return CHXJ_TRUE; +} + + +static int +check_valid_cookie_attribute_expires_only(request_rec *r, const char *value) +{ + char *pstat; + char *pair; + char *first_pair; + char *expire_pair = NULL; + char *p; + + DBG(r, "REQ[%X] start check_valid_cookie_attribute_expires_only() value:[%s]", (apr_size_t)r, value); + + expire_pair = NULL; + p = apr_pstrdup(r->pool, value); + + /* pass first pair */ + first_pair = apr_strtok(p, ";", &pstat); + + for (;;) { + pair = apr_strtok(NULL, ";", &pstat); + if (! pair) break; + pair = qs_trim_string(r->pool, pair); + if (STRNCASEEQ('e','E',"expires", pair, sizeof("expires")-1)) { + expire_pair = apr_pstrdup(r->pool, pair); + } + } + + if (expire_pair) { + if (!valid_expires(r, expire_pair)) { + DBG(r, "REQ[%X] invalid expire. expire_pair:[%s]", (apr_size_t)r, expire_pair); + return CHXJ_FALSE; + } + } + DBG(r, "REQ[%X] end check_valid_cookie_attribute_expires_only() value:[%s]", (apr_size_t)r, value); return CHXJ_TRUE; } @@ -638,10 +677,11 @@ valid_domain(request_rec *r, const char *value) char *p = apr_pstrdup(r->pool, value); const char *host = apr_table_get(r->headers_in, HTTP_HOST); - DBG(r, "start valid_domain() value:[%s]", value); - DBG(r, "host:[%s]", host); - if (!host) + DBG(r, "REQ[%X] start valid_domain() value:[%s]", (apr_size_t)r, value); + if (!host) { + DBG(r, "REQ[%X] end valid_domain() value:[%s] (has no host header)", (apr_size_t)r, value); return CHXJ_TRUE; + } name = apr_strtok(p,"=", &pstat); name = qs_trim_string(r->pool, name); @@ -656,11 +696,11 @@ valid_domain(request_rec *r, const char *value) len = strlen(host); if (len) { if (chxj_strcasenrcmp(r->pool, host, val, strlen(val))) { - DBG(r, "not match domain. host domain:[%s] vs value:[%s]", host, val); + DBG(r, "REQ[%X] not match domain. host domain:[%s] vs value:[%s]", (apr_size_t)r, host, val); return CHXJ_FALSE; } } - DBG(r, "end valid_domain() value:[%s]", value); + DBG(r, "REQ[%X] end valid_domain() value:[%s]", (apr_size_t)r, value); return CHXJ_TRUE; } @@ -674,7 +714,7 @@ valid_path(request_rec *r, const char *value) char *val; char *pstat; - DBG(r, "start valid_path() unparsed_uri:[%s] value:[%s]", r->unparsed_uri, value); + DBG(r, "REQ[%X] start valid_path() unparsed_uri:[%s] value:[%s]", (apr_size_t)r, r->unparsed_uri, value); if (chxj_starts_with(r->unparsed_uri, "http://")) { uri = strchr(&r->unparsed_uri[sizeof("http://")], '/'); if (uri != NULL) { @@ -697,19 +737,18 @@ valid_path(request_rec *r, const char *value) if ((tmp = strchr(uri, '?'))) { *tmp = '\0'; } - DBG(r, "uri=[%s]", uri); + DBG(r, "REQ[%X] uri=[%s]", (apr_size_t)r, uri); name = apr_strtok(p, "=", &pstat); val = apr_strtok(NULL, "=", &pstat); name = qs_trim_string(r->pool, name); val = qs_trim_string(r->pool, val); DBG(r, "name=[%s] val=[%s]", name, val); - DBG(r, "val:[%s] vs uri:[%s]", val, uri); if (! chxj_starts_with(uri, val)) { - DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (false)", r->unparsed_uri, value); + DBG(r, "REQ[%X] end valid_path() unparsed_uri:[%s] value:[%s] (false)", (apr_size_t)r, r->unparsed_uri, value); return CHXJ_FALSE; } - DBG(r, "end valid_path() unparsed_uri:[%s] value:[%s] (true)", r->unparsed_uri, value); + DBG(r, "REQ[%X] end valid_path() unparsed_uri:[%s] value:[%s] (true)", (apr_size_t)r, r->unparsed_uri, value); return CHXJ_TRUE; } @@ -722,7 +761,7 @@ valid_expires(request_rec *r, const char *value) char *pstat; apr_time_t expires; apr_time_t now; - DBG(r, "start valid_expire() value:[%s]", value); + DBG(r, "REQ[%X] start valid_expire() value:[%s]", (apr_size_t)r, value); name = apr_strtok(p, "=", &pstat); val = apr_strtok(NULL, "=", &pstat); @@ -730,11 +769,11 @@ valid_expires(request_rec *r, const char *value) now = apr_time_now(); expires = chxj_parse_cookie_expires(val); if (expires < now) { - DBG(r, "end valid_expire() value:[%s] (expired)", value); + DBG(r, "REQ[%X] end valid_expire() value:[%s] (expired)", (apr_size_t)r, value); return CHXJ_FALSE; } - DBG(r, "end valid_expire() value:[%s] (non expired)", value); + DBG(r, "REQ[%X] end valid_expire() value:[%s] (non expired)", (apr_size_t)r, value); return CHXJ_TRUE; } @@ -742,13 +781,13 @@ static int valid_secure(request_rec *r, const char *value) { const char *scheme; - DBG(r, "start valid_secure() value:[%s]", value); + DBG(r, "REQ[%X] start valid_secure() value:[%s]", (apr_size_t)r, value); scheme = chxj_apache_run_http_scheme(r); if (strcasecmp("https", scheme)) { - DBG(r, "end valid_secure() value:[%s] (non secure)", value); + DBG(r, "REQ[%X] end valid_secure() value:[%s] (non secure)", (apr_size_t)r, value); return CHXJ_FALSE; } - DBG(r, "end valid_secure() value:[%s] (secure)", value); + DBG(r, "REQ[%X] end valid_secure() value:[%s] (secure)", (apr_size_t)r, value); return CHXJ_TRUE; } @@ -760,7 +799,7 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie) char *dst; char *name = ""; - DBG(r, "start chxj_add_cookie_parameter() cookie_id=[%s]", (cookie) ? cookie->cookie_id : NULL); + DBG(r, "REQ[%X] start chxj_add_cookie_parameter() cookie_id=[%s]", (apr_size_t)r, (cookie) ? cookie->cookie_id : NULL); dst = apr_pstrdup(r->pool, value); @@ -771,7 +810,7 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie) goto on_error; if (chxj_cookie_check_host(r, value) != 0) { - DBG(r, "end chxj_add_cookie_parameter()(check host)"); + DBG(r, "REQ[%X] end chxj_add_cookie_parameter()(check host)", (apr_size_t)r); goto on_error; } @@ -789,12 +828,11 @@ chxj_add_cookie_parameter(request_rec *r, char *value, cookie_t *cookie) dst = apr_psprintf(r->pool, "%s?%s=%s%s", dst, CHXJ_COOKIE_PARAM, cookie->cookie_id, name); } - DBG(r, "end chxj_add_cookie_parameter() dst=[%s]", dst); + DBG(r, "REQ[%X] end chxj_add_cookie_parameter() dst=[%s]", (apr_size_t)r, dst); return dst; on_error: - DBG(r, "end chxj_add_cookie_parameter() (on_error)"); return dst; } @@ -804,15 +842,21 @@ chxj_cookie_check_host(request_rec* r, char* value) { char* hostnm; + DBG(r, "REQ[%X] start chxj_cookie_check_host()", (apr_size_t)r); DBG(r, "hostname=[%s] vs Location:[%s]", r->hostname, value); hostnm = s_get_hostname_from_url(r, value); if (hostnm) { - if (strcasecmp(hostnm, r->hostname) == 0) + if (strcasecmp(hostnm, r->hostname) == 0) { + DBG(r, "REQ[%X] end chxj_cookie_check_host() (true)", (apr_size_t)r); return 0; - else + } + else { + DBG(r, "REQ[%X] end chxj_cookie_check_host() (false)", (apr_size_t)r); return 1; + } } + DBG(r, "REQ[%X] end chxj_cookie_check_host() (true)", (apr_size_t)r); return 0; } diff --git a/src/chxj_dbm.c b/src/chxj_dbm.c index d4e005ab..049bc828 100644 --- a/src/chxj_dbm.c +++ b/src/chxj_dbm.c @@ -373,8 +373,8 @@ chxj_load_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id) ERR(r, "%s:%d" "could not open dbm (type %s) auth file: %s", - "default", __FILE__,__LINE__, + "default", chxj_cookie_db_name_create(r, m->cookie_db_dir)); chxj_cookie_db_unlock(r, file); DBG(r, "REQ[%X] end chxj_load_cookie_dbm() cookie_id:[%s]", (apr_size_t)r, cookie_id); @@ -392,8 +392,9 @@ chxj_load_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id) if (retval != APR_SUCCESS) { ERR(r, "%s:%d" - "could not fetch dbm (type %s) auth file: %s", "default", + "could not fetch dbm (type %s) auth file: %s", __FILE__,__LINE__, + "default", chxj_cookie_db_name_create(r, m->cookie_db_dir)); apr_dbm_close(f); chxj_cookie_db_unlock(r, file); diff --git a/src/chxj_jhtml.c b/src/chxj_jhtml.c index 40d56d24..094b1664 100644 --- a/src/chxj_jhtml.c +++ b/src/chxj_jhtml.c @@ -1337,14 +1337,15 @@ s_jhtml_start_form_tag(void *pdoc, Node *node) Doc *doc; request_rec *r; Attr *attr; - char *dc = NULL; char *new_hidden_tag = NULL; + char *attr_action = NULL; + char *attr_method = NULL; + char *attr_name = NULL; jhtml = GET_JHTML(pdoc); doc = jhtml->doc; r = doc->r; - W_L("cookie); - dc = strchr(value, '?'); - if (dc) { - new_hidden_tag = chxj_form_action_to_hidden_tag(doc->pool, value, 0); - *dc = 0; - } - W_L(" action=\""); - W_V(value); - W_L("\""); + attr_action = chxj_add_cookie_parameter(r, value, jhtml->cookie); } else if (STRCASEEQ('m','M',"method",name)) { /*----------------------------------------------------------------------*/ /* CHTML 1.0 */ /*----------------------------------------------------------------------*/ - W_L(" method=\""); - W_V(value); - W_L("\""); + attr_method = apr_pstrdup(doc->pool, value); } else if (STRCASEEQ('u','U',"utn",name)) { /*----------------------------------------------------------------------*/ @@ -1383,11 +1374,33 @@ s_jhtml_start_form_tag(void *pdoc, Node *node) /* ignore */ } else if (STRCASEEQ('n','N',"name",name)) { - W_L(" name=\""); - W_V(value); - W_L("\""); + attr_name = apr_pstrdup(doc->pool, name); } } + int post_flag = (attr_method && strcasecmp(attr_method, "post") == 0) ? 1 : 0; + + W_L("pool, attr_action, 0, post_flag); + *q = 0; + } + W_L(" action=\""); + W_V(attr_action); + W_L("\""); + } + if (attr_method) { + W_L(" method=\""); + W_V(attr_method); + W_L("\""); + } + if (attr_name) { + W_L(" name=\""); + W_V(attr_name); + W_L("\""); + } W_L(">"); /*-------------------------------------------------------------------------*/ /* Add cookie parameter */ diff --git a/src/chxj_mysql.c b/src/chxj_mysql.c index 65677f08..cbf74dd2 100644 --- a/src/chxj_mysql.c +++ b/src/chxj_mysql.c @@ -1121,7 +1121,7 @@ int chxj_cookie_unlock_mysql(request_rec *r, mod_chxj_config *m) { char query[MAX_STRING_LEN]; - DBG(r, "start chxj_cookie_unlock_mysql()[%x]", (unsigned long)r); + DBG(r, "REQ[%X] start chxj_cookie_unlock_mysql()", (apr_size_t)r); if (! chxj_open_mysql_handle(r, m)) { ERR(r, "Cannot open mysql connection"); DBG(r, "end chxj_save_cookie_expire_mysql()"); diff --git a/src/chxj_serf.c b/src/chxj_serf.c index 0e4016ed..fb38db39 100644 --- a/src/chxj_serf.c +++ b/src/chxj_serf.c @@ -183,18 +183,18 @@ s_handle_response(serf_request_t *UNUSED(request), serf_bucket_t *response, void val++; key = qs_trim_string(ctx->pool, key); val = qs_trim_string(ctx->pool, val); - DBG(ctx->r, "key:[%s], val:[%s]", key, val); + DBG(ctx->r, "REQ[%X] RESPONSE key:[%s], val:[%s]", (apr_size_t)ctx->r, key, val); apr_table_add(ctx->headers_out, key, val); } } ctx->rv = APR_SUCCESS; apr_atomic_dec32(&ctx->requests_outstanding); - DBG(ctx->r, "end of s_handle_response()(NORMAL)"); + DBG(ctx->r, "REQ[%X] end of s_handle_response()(NORMAL)",(apr_size_t)ctx->r); return APR_EOF; } if (APR_STATUS_IS_EAGAIN(rv)) { - DBG(ctx->r, "end of s_handle_response() (EAGAIN)"); + DBG(ctx->r, "REQ[%X] end of s_handle_response() (EAGAIN)", (apr_size_t)ctx->r); return rv; } } @@ -228,13 +228,15 @@ s_setup_request(serf_request_t *request, apr_table_entry_t *hentryp = (apr_table_entry_t*)headers->elts; for (ii=headers->nelts-1; ii>=0; ii--) { serf_bucket_headers_setc(hdrs_bkt, hentryp[ii].key, hentryp[ii].val); - DBG(ctx->r, "REQ[%X] key:[%s], val:[%s]", (apr_size_t)ctx->r, hentryp[ii].key, hentryp[ii].val); + DBG(ctx->r, "REQ[%X] REQUEST key:[%s], val:[%s]", (apr_size_t)ctx->r, hentryp[ii].key, hentryp[ii].val); } if (ctx->post_data) { serf_bucket_headers_setc(hdrs_bkt, "X-Chxj-Forward", "Done"); serf_bucket_headers_setc(hdrs_bkt, "X-Chxj-Content-Length", apr_psprintf(r->pool, "%d", ctx->post_data_len)); + DBG(ctx->r, "REQ[%X] REQUEST key:[%s], val:[%s]", (apr_size_t)ctx->r, "X-Chxj-Forward", "Done"); + DBG(ctx->r, "REQ[%X] REQUEST key:[%s], val:[%s]", (apr_size_t)ctx->r, "X-Chxj-Content-Length", apr_psprintf(r->pool, "%d", ctx->post_data_len)); } - DBG(ctx->r, "REQ[%X] Content-Length:[%s]", (apr_size_t)r, serf_bucket_headers_get(hdrs_bkt, "Content-Length")); + DBG(ctx->r, "REQ[%X] REQUEST Content-Length:[%s]", (apr_size_t)r, serf_bucket_headers_get(hdrs_bkt, "Content-Length")); apr_atomic_inc32(&(ctx->requests_outstanding)); if (ctx->acceptor_ctx->ssl_flag) { @@ -391,6 +393,9 @@ default_chxj_serf_post(request_rec *r, apr_pool_t *ppool, const char *url_path, if (!url.hostname) { url.hostname = "localhost"; } + if (url.query) { + url.path = apr_psprintf(pool, "%s?%s", url.path, url.query); + } rv = apr_sockaddr_info_get(&address, url.hostname, APR_UNSPEC, url.port, 0, pool); if (rv != APR_SUCCESS) { diff --git a/src/chxj_tag_util.c b/src/chxj_tag_util.c index 6591734a..959c9569 100644 --- a/src/chxj_tag_util.c +++ b/src/chxj_tag_util.c @@ -603,7 +603,7 @@ qs_get_parse_attr(Doc* doc, Node* tag, request_rec* r) char * -chxj_form_action_to_hidden_tag(apr_pool_t *pool, const char *str, int xmlFlag) +chxj_form_action_to_hidden_tag(apr_pool_t *pool, const char *str, int xmlFlag, int post) { char *s = apr_pstrdup(pool, str); s = strchr(s, '?'); @@ -623,7 +623,13 @@ chxj_form_action_to_hidden_tag(apr_pool_t *pool, const char *str, int xmlFlag) val = apr_strtok(NULL, "=", &pstat2); if (!val) val = ""; } - char *tmp = apr_psprintf(pool, "", key, chxj_url_decode(pool, val), (xmlFlag == 1) ? " /" : ""); + char *tmp = NULL; + if (! post || strcasecmp(key, "_chxj_cc") == 0 || strcasecmp(key, "_chxj_nc") == 0) { + tmp = apr_psprintf(pool, "", key, chxj_url_decode(pool, val), (xmlFlag == 1) ? " /" : ""); + } + else { + tmp = apr_psprintf(pool, "", key, chxj_url_decode(pool, val), (xmlFlag == 1) ? " /" : ""); + } if (result) { result = apr_pstrcat(pool, result, tmp, NULL); } diff --git a/src/chxj_xhtml_mobile_1_0.c b/src/chxj_xhtml_mobile_1_0.c index 7d099727..5f153641 100644 --- a/src/chxj_xhtml_mobile_1_0.c +++ b/src/chxj_xhtml_mobile_1_0.c @@ -1247,8 +1247,10 @@ s_xhtml_1_0_start_form_tag(void *pdoc, Node *node) request_rec *r = doc->r; Attr *attr; char *new_hidden_tag = NULL; + char *attr_action = NULL; + char *attr_method = NULL; + char *attr_name = NULL; - W_L("cookie); - char *q = strchr(value, '?'); - if (q) { - new_hidden_tag = chxj_form_action_to_hidden_tag(doc->pool, value, 1); - *q = 0; - } - W_L(" action=\""); - W_V(value); - W_L("\""); + attr_action = chxj_encoding_parameter(r, value); + attr_action = chxj_add_cookie_parameter(r, attr_action, xhtml->cookie); } else if (STRCASEEQ('m','M',"method",name)) { - W_L(" method=\""); - W_V(value); - W_L("\""); + attr_method = apr_pstrdup(doc->pool, value); } else if (STRCASEEQ('u','U',"utn",name)) { /* ignore */ } else if (STRCASEEQ('n','N',"name",name)) { - W_L(" name=\""); - W_V(value); - W_L("\""); + attr_name = apr_pstrdup(doc->pool, value); } } + + int post_flag = (attr_method && strcasecmp(attr_method, "post") == 0) ? 1 : 0; + + W_L("pool, attr_action, 1, post_flag); + *q = 0; + } + W_L(" action=\""); + W_V(attr_action); + W_L("\""); + } + if (attr_method) { + W_L(" method=\""); + W_V(attr_method); + W_L("\""); + } + if (attr_name) { + W_L(" name=\""); + W_V(attr_name); + W_L("\""); + } W_L(">"); if (new_hidden_tag) { W_V(new_hidden_tag); diff --git a/src/mod_chxj.c b/src/mod_chxj.c index 9ced1d6f..14a373b5 100644 --- a/src/mod_chxj.c +++ b/src/mod_chxj.c @@ -508,21 +508,26 @@ chxj_convert_input_header(request_rec *r,chxjconvrule_entry* entryp) } } else - if ( (strncasecmp(name, "_chxj_c_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fc%5F", sizeof("%5Fchxj%5Fc%5F")-1) == 0) - || (strncasecmp(name, "_chxj_r_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fr%5F", sizeof("%5Fchxj%5Fr%5F")-1) == 0) - || (strncasecmp(name, "_chxj_s_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fs%5F", sizeof("%5Fchxj%5Fs%5F")-1) == 0)) { - if (value == NULL) - continue; - - if (strlen(value) == 0) - continue; - + if ( strncasecmp(name, "_chxj_c_", 8) == 0 + || strncasecmp(name, "_chxj_r_", 8) == 0 + || strncasecmp(name, "_chxj_s_", 8) == 0) { + if (value == NULL) continue; + if (strlen(value) == 0) continue; if (strlen(result) != 0) result = apr_pstrcat(r->pool, result, "&", NULL); - result = apr_pstrcat(r->pool, result, &name[8], "=", value, NULL); } else + if ( strncasecmp(name, "%5Fchxj%5Fr%5F", 14) == 0 + || strncasecmp(name, "%5Fchxj%5Fc%5F", 14) == 0 + || strncasecmp(name, "%5Fchxj%5Fs%5F", 14) == 0) { + if (value == NULL) continue; + if (strlen(value) == 0) continue; + if (strlen(result) != 0) + result = apr_pstrcat(r->pool, result, "&", NULL); + result = apr_pstrcat(r->pool, result, &name[14], "=", value, NULL); + } + else if (strcasecmp(name, CHXJ_COOKIE_PARAM) == 0 || strcasecmp(name, "%5Fchxj%5Fcc") == 0) { apr_table_unset(r->headers_in, "Cookie"); cookie_lock_t *lock = chxj_cookie_lock(r); @@ -549,7 +554,9 @@ chxj_convert_input_header(request_rec *r,chxjconvrule_entry* entryp) DBG(r, "************************ name:[%s]", name); } apr_table_setn(r->headers_in, "X-Chxj-Cookie-No-Update", "true"); - result = apr_pstrcat(r->pool, result, "&_chxj_nc=true", NULL); + if (! no_update_flag) { + result = apr_pstrcat(r->pool, result, "&_chxj_nc=true", NULL); + } r->args = result; DBG(r, "REQ[%X] result r->args=[%s]", (apr_size_t)r, r->args); @@ -662,9 +669,9 @@ chxj_input_convert( result = apr_pstrcat(r->pool, result, name, "=", value, NULL); } } - else if ((strncasecmp(name, "_chxj_c_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fc%5F", sizeof("%5Fchxj%5Fc%5F")-1) == 0) - || (strncasecmp(name, "_chxj_r_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fr%5F", sizeof("%5Fchxj%5Fr%5F")-1) == 0) - || (strncasecmp(name, "_chxj_s_", 8) == 0 || strncasecmp(name, "%5Fchxj%5Fs%5F", sizeof("%5Fchxj%5Fs%5F")-1) == 0)) { + else if (strncasecmp(name, "_chxj_c_", 8) == 0 + || strncasecmp(name, "_chxj_r_", 8) == 0 + || strncasecmp(name, "_chxj_s_", 8) == 0) { if (value == NULL) continue; @@ -680,18 +687,38 @@ chxj_input_convert( dlen = strlen(value); value = chxj_url_decode(r->pool, value); - DBG(r, "************ before encoding[%s]", value); - dvalue = chxj_rencoding(r, value, &dlen); dvalue = chxj_url_encode(r->pool,dvalue); + result = apr_pstrcat(r->pool, result, &name[8], "=", dvalue, NULL); + } + else { + result = apr_pstrcat(r->pool, result, &name[8], "=", value, NULL); + } + } + else + if ( strncasecmp(name, "%5Fchxj%5Fs%5F", 14) == 0 + || strncasecmp(name, "%5Fchxj%5Fr%5F", 14) == 0 + || strncasecmp(name, "%5Fchxj%5Fc%5F", 14) == 0) { + if (value == NULL) + continue; - DBG(r, "************ after encoding[%s]", dvalue); + if (strlen(value) == 0) + continue; - result = apr_pstrcat(r->pool, result, &name[8], "=", dvalue, NULL); + if (strlen(result) != 0) + result = apr_pstrcat(r->pool, result, "&", NULL); + if (strcasecmp(entryp->encoding, "NONE") != 0 && value && strlen(value)) { + apr_size_t dlen; + char* dvalue; + dlen = strlen(value); + value = chxj_url_decode(r->pool, value); + dvalue = chxj_rencoding(r, value, &dlen); + dvalue = chxj_url_encode(r->pool,dvalue); + result = apr_pstrcat(r->pool, result, &name[14], "=", dvalue, NULL); } else { - result = apr_pstrcat(r->pool, result, &name[8], "=", value, NULL); + result = apr_pstrcat(r->pool, result, &name[14], "=", value, NULL); } } else @@ -718,11 +745,47 @@ chxj_input_convert( result = apr_pstrcat(r->pool, result, "&", NULL); result = apr_pstrcat(r->pool, result, name, "=", value, NULL); } + else + if ( strncasecmp(name, CHXJ_QUERY_STRING_PARAM_PREFIX, sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX)-1) == 0) { + apr_size_t dlen; + char* dvalue; + dlen = strlen(value); + if (dlen && value) { + value = chxj_url_decode(r->pool, value); + dvalue = chxj_rencoding(r, value, &dlen); + dvalue = chxj_url_encode(r->pool,dvalue); + if (r->args && strlen(r->args) > 0) { + r->args = apr_pstrcat(r->pool, r->args, "&", &name[sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX)-1], "=", dvalue, NULL); + } + else { + r->args = apr_pstrcat(r->pool, &name[sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX)-1], "=", dvalue, NULL); + } + } + } + else + if (strncasecmp(name, CHXJ_QUERY_STRING_PARAM_PREFIX_ENC, sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX_ENC)-1) == 0) { + apr_size_t dlen; + char* dvalue; + dlen = strlen(value); + if (dlen && value) { + value = chxj_url_decode(r->pool, value); + dvalue = chxj_rencoding(r, value, &dlen); + dvalue = chxj_url_encode(r->pool,dvalue); + if (r->args && strlen(r->args) > 0) { + r->args = apr_pstrcat(r->pool, r->args, "&", &name[sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX_ENC)-1], "=", dvalue, NULL); + } + else { + r->args = apr_pstrcat(r->pool, &name[sizeof(CHXJ_QUERY_STRING_PARAM_PREFIX_ENC)-1], "=", dvalue, NULL); + } + } + } DBG(r, "REQ[%X] ************************ name:[%s]", (apr_size_t)r, name); } *len = strlen(result); apr_table_setn(r->headers_in, "X-Chxj-Cookie-No-Update", "true"); - result = apr_pstrcat(r->pool, result, "&_chxj_nc=true", NULL); + if (! no_update_flag) { + result = apr_pstrcat(r->pool, result, "&_chxj_nc=true", NULL); + } DBG(r, "REQ[%X] AFTER input convert result = [%s]", (apr_size_t)r, result); DBG(r, "REQ[%X] end chxj_input_convert()", (apr_size_t)r); -- 2.11.0