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
/* 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)) {
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);
/*----------------------------------------------------------------------*/
#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=\"");
#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=\"");
*/
#include "mod_chxj.h"
#include "chxj_jreserved_tag.h"
+#include "chxj_url_encode.h"
typedef struct r_table {
char lower;
}
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);
+}
/* 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("\"");
/*----------------------------------------------------------------------*/
#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);
#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);