OSDN Git Service

* merge from old-trunk for jreserved-functions.
authorAtsushi Konno <konn@users.sourceforge.jp>
Sun, 14 Dec 2008 10:55:17 +0000 (19:55 +0900)
committerAtsushi Konno <konn@users.sourceforge.jp>
Sun, 14 Dec 2008 10:55:17 +0000 (19:55 +0900)
include/chxj_jreserved_tag.h
src/chxj_jhtml.c
src/chxj_jreserved_tag.c
src/chxj_jxhtml.c

index ffba525..da898df 100644 (file)
@@ -21,4 +21,6 @@
 
 extern char *chxj_jreserved_to_safe_tag(request_rec *r, const char *src);
 extern char *chxj_safe_to_jreserved_tag(request_rec *r, const char *src);
+
+extern char *chxj_jreserved_tag_to_safe_for_query_string(request_rec *r, const char *query_string);
 #endif
index d379376..557cbb7 100644 (file)
@@ -1048,7 +1048,7 @@ s_jhtml_start_a_tag(void *pdoc, Node *node)
       /* CHTML1.0                                                             */
       /*----------------------------------------------------------------------*/
       W_L(" name=\"");
-      W_V(chxj_jreserved_to_safe_tag(r, value));
+      W_V(value);
       W_L("\"");
     }
     else if (STRCASEEQ('h','H',"href",name)) {
@@ -1058,6 +1058,7 @@ s_jhtml_start_a_tag(void *pdoc, Node *node)
       value = chxj_encoding_parameter(r, value);
       if (! chxj_starts_with(value, "mailto:") && ! chxj_starts_with(value, "telto:")) {
         value = chxj_add_cookie_parameter(r, value, jhtml->cookie);
+        value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
       }
       W_L(" href=\"");
       W_V(value);
@@ -2023,6 +2024,7 @@ s_jhtml_start_img_tag(void *pdoc, Node *node)
       /*----------------------------------------------------------------------*/
 #ifdef IMG_NOT_CONVERT_FILENAME
       value = chxj_encoding_parameter(r, value);
+      value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
       value = chxj_add_cookie_parameter(r, value, jhtml->cookie);
       value = chxj_add_cookie_no_update_parameter(r, value);
       W_L(" src=\"");
@@ -2031,6 +2033,7 @@ s_jhtml_start_img_tag(void *pdoc, Node *node)
 #else
       value = chxj_img_conv(r, spec, value);
       value = chxj_encoding_parameter(r, value);
+      value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
       value = chxj_add_cookie_parameter(r, value, jhtml->cookie);
       value = chxj_add_cookie_no_update_parameter(r, value);
       W_L(" src=\"");
index 9abbef5..9281f46 100644 (file)
@@ -16,6 +16,7 @@
  */
 #include "mod_chxj.h"
 #include "chxj_jreserved_tag.h"
+#include "chxj_url_encode.h"
 
 typedef struct r_table {
   char lower;
@@ -148,3 +149,49 @@ chxj_safe_to_jreserved_tag(request_rec *r, const char *src)
   }
   return (char *)src;
 }
+
+char *
+chxj_jreserved_tag_to_safe_for_query_string(request_rec *r, const char *query_string)
+{
+  apr_pool_t *pool;
+  apr_pool_create(&pool, r->pool);
+  char *s = apr_pstrdup(pool, query_string);
+  char *fname;
+
+  if (!s) return apr_pstrdup(pool, "");
+  char *result = s;
+  s = strchr(s, '?');
+  if (!s) return result;
+  *s = 0;
+  s++;
+  fname = apr_pstrdup(pool, result);
+  result = NULL;
+
+  char *pstat;
+  char *pstat2;
+  for (;;) {
+    char *pair = apr_strtok(s, "&", &pstat);
+    if (! pair) break;
+    s = NULL;
+    char *key = apr_strtok(pair, "=",  &pstat2);
+    char *val = "";
+    if (key) {
+      val = apr_strtok(NULL, "=", &pstat2);
+      if (!val) val = "";
+    }
+    char *tmp = NULL;
+    if (strcasecmp(key, "guid") == 0) {
+      tmp = apr_psprintf(pool, "%s=%s", key, val);
+    }
+    else {
+      tmp = apr_psprintf(pool, "%s=%s", chxj_jreserved_to_safe_tag(r, key), chxj_url_decode(pool, val));
+      if (result) {
+        result = apr_pstrcat(pool, result, "&" ,tmp, NULL);
+      }
+      else {
+        result = tmp;
+      }
+    }
+  }
+  return apr_pstrcat(pool, fname, "?" , result, NULL);
+}
index 534ca8a..f2413ed 100644 (file)
@@ -1058,6 +1058,9 @@ s_jxhtml_start_a_tag(void *pdoc, Node *node)
       /* CHTML1.0                                                             */
       /*----------------------------------------------------------------------*/
       value = chxj_encoding_parameter(r, value);
+      if (! chxj_starts_with(value, "mailto:") && ! chxj_starts_with(value, "telto:")) {
+        value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
+      }
       W_L(" href=\"");
       W_V(value);
       W_L("\"");
@@ -2093,6 +2096,7 @@ s_jxhtml_start_img_tag(void *pdoc, Node *node)
       /*----------------------------------------------------------------------*/
 #ifdef IMG_NOT_CONVERT_FILENAME
       value = chxj_encoding_parameter(r, value);
+      value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
       value = chxj_add_cookie_no_update_parameter(r, value);
       W_L(" src=\"");
       W_V(value);
@@ -2100,6 +2104,7 @@ s_jxhtml_start_img_tag(void *pdoc, Node *node)
 #else
       value = chxj_img_conv(r, spec, value);
       value = chxj_encoding_parameter(r, value);
+      value = chxj_jreserved_tag_to_safe_for_query_string(r, value);
       value = chxj_add_cookie_no_update_parameter(r, value);
       W_L(" src=\"");
       W_V(value);