From 5817f82ba852fd72466dea176548c5cedfad677a Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 26 Jun 2005 22:18:37 +0000 Subject: [project @ 2005-06-26 22:18:37 by jmb] Improve clarity of use of utf8_to_enc. Remove use of curl_escape - url_escape does similar things, just better. svn path=/import/netsurf/; revision=1766 --- render/form.c | 46 +++++++++++++++++++++++++++++++++++++--------- utils/url.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ utils/url.h | 1 + 3 files changed, 87 insertions(+), 9 deletions(-) diff --git a/render/form.c b/render/form.c index e20fb658f..6af143be0 100644 --- a/render/form.c +++ b/render/form.c @@ -16,10 +16,10 @@ #include #include #include -#include "curl/curl.h" #include "netsurf/render/box.h" #include "netsurf/render/form.h" #include "netsurf/utils/log.h" +#include "netsurf/utils/url.h" #include "netsurf/utils/utf8.h" #include "netsurf/utils/utils.h" @@ -497,6 +497,7 @@ char *form_url_encode(struct form *form, char *charset; unsigned int len = 0, len1; utf8_convert_ret err; + url_func_result url_err; if (!s) return 0; @@ -517,11 +518,14 @@ char *form_url_encode(struct form *form, err = utf8_to_enc(control->name, "ISO-8859-1", 0, &n_temp); } - if (err != UTF8_CONVERT_OK) { + if (err == UTF8_CONVERT_NOMEM) { free(charset); free(s); return 0; } + + assert(err == UTF8_CONVERT_OK); + err = utf8_to_enc(control->value, charset, 0, &v_temp); if (err == UTF8_CONVERT_BADENC) { err = utf8_to_enc(control->value, @@ -530,19 +534,43 @@ char *form_url_encode(struct form *form, err = utf8_to_enc(control->value, "ISO-8859-1", 0, &v_temp); } - if (err != UTF8_CONVERT_OK) { + if (err == UTF8_CONVERT_NOMEM) { + free(n_temp); + free(charset); + free(s); + return 0; + } + + assert(err == UTF8_CONVERT_OK); + + url_err = url_escape(n_temp, &name); + if (url_err == URL_FUNC_NOMEM) { + free(v_temp); + free(n_temp); + free(charset); + free(s); + return 0; + } + + assert(url_err == URL_FUNC_OK); + + url_err = url_escape(v_temp, &value); + if (url_err == URL_FUNC_NOMEM) { + free(name); + free(v_temp); free(n_temp); free(charset); free(s); return 0; } - name = curl_escape(n_temp, 0); - value = curl_escape(v_temp, 0); + + assert(url_err == URL_FUNC_OK); + len1 = len + strlen(name) + strlen(value) + 2; s2 = realloc(s, len1 + 1); if (!s2) { - curl_free(value); - curl_free(name); + free(value); + free(name); free(v_temp); free(n_temp); free(charset); @@ -552,8 +580,8 @@ char *form_url_encode(struct form *form, s = s2; sprintf(s + len, "%s=%s&", name, value); len = len1; - curl_free(name); - curl_free(value); + free(name); + free(value); free(v_temp); free(n_temp); } diff --git a/utils/url.c b/utils/url.c index fa3d0dd8d..d94c5fad3 100644 --- a/utils/url.c +++ b/utils/url.c @@ -595,7 +595,56 @@ url_func_result url_nice(const char *url, char **result) return URL_FUNC_OK; } +/** + * Escape a string suitable for inclusion in an URI + * + * \param unescaped The unescaped string + * \param result Pointer to location to store escaped string + * \return URL_FUNC_OK on success + */ +url_func_result url_escape(const char *unescaped, char **result) +{ + int len; + char *escaped, *d; + const char *c; + + if (!unescaped || !result) + return URL_FUNC_FAILED; + + *result = NULL; + + len = strlen(unescaped); + + escaped = malloc(len * 3 + 1); + if (!escaped) + return URL_FUNC_NOMEM; + for (c = unescaped, d = escaped; *c; c++) { + if (!isascii(*c) || + strchr(";/?:@&=+$," "<>#%\"{}|\\^[]`", *c) || + *c <= 0x20 || *c == 0x7f) { + *d++ = '%'; + *d++ = "0123456789ABCDEF"[((*c >> 4) & 0xf)]; + *d++ = "0123456789ABCDEF"[(*c & 0xf)]; + } + else { + /* unreserved characters: [a-zA-Z0-9-_.!~*'()] */ + *d++ = *c; + } + } + + (*result) = malloc(++d - escaped + 1); + if (!(*result)) { + free(escaped); + return URL_FUNC_NOMEM; + } + snprintf((*result), d - escaped, "%s", escaped); + (*result)[d - escaped] = '\0'; + + free(escaped); + + return URL_FUNC_OK; +} #ifdef TEST diff --git a/utils/url.h b/utils/url.h index 8ebc1e3f2..d803eafeb 100644 --- a/utils/url.h +++ b/utils/url.h @@ -25,5 +25,6 @@ url_func_result url_join(const char *rel, const char *base, char **result); url_func_result url_host(const char *url, char **result); url_func_result url_scheme(const char *url, char **result); url_func_result url_nice(const char *url, char **result); +url_func_result url_escape(const char *unescaped, char **result); #endif -- cgit v1.2.3