From 65b510fbc3ad822ab8c75e6d94eaee5b6ceb07a4 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Thu, 23 Jul 2015 00:05:22 +0100 Subject: Rework IDN URL retrieval to return an nserror --- utils/nsurl.c | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'utils/nsurl.c') diff --git a/utils/nsurl.c b/utils/nsurl.c index 78647b4ae..ed6d896b6 100644 --- a/utils/nsurl.c +++ b/utils/nsurl.c @@ -1698,8 +1698,11 @@ const char *nsurl_access(const nsurl *url) return url->string; } -char *nsurl_access_utf8(const nsurl *url) + +/* exported interface, documented in nsurl.h */ +nserror nsurl_access_utf8(const nsurl *url, char **url_s, size_t *url_l) { + nserror err; lwc_string *host; char *idna_host; size_t idna_host_len; @@ -1707,45 +1710,43 @@ char *nsurl_access_utf8(const nsurl *url) size_t scheme_len; char *path; size_t path_len; - char *idna_url; - size_t idna_url_len; assert(url != NULL); host = nsurl_get_component(url, NSURL_HOST); - if(host == NULL) { - return strdup(url->string); - } + if(host == NULL) + return NSERROR_BAD_URL; - if (idna_decode(lwc_string_data(host), lwc_string_length(host), - &idna_host, &idna_host_len) != NSERROR_OK) { - lwc_string_unref(host); - return strdup(url->string); - } + err = idna_decode(lwc_string_data(host), lwc_string_length(host), + &idna_host, &idna_host_len); lwc_string_unref(host); - if (nsurl_get(url, NSURL_SCHEME | NSURL_CREDENTIALS, - &scheme, &scheme_len) != NSERROR_OK) { - return strdup(url->string); - } + if (err != NSERROR_OK) + return err; - if (nsurl_get(url, NSURL_PORT | NSURL_PATH | NSURL_QUERY | NSURL_FRAGMENT, - &path, &path_len) != NSERROR_OK) { - return strdup(url->string); - } + err = nsurl_get(url, NSURL_SCHEME | NSURL_CREDENTIALS, + &scheme, &scheme_len); - idna_url_len = scheme_len + idna_host_len + path_len + 1; /* +1 for \0 */ - idna_url = malloc(idna_url_len); + if (err != NSERROR_OK) + return err; - if (idna_url == NULL) { - return strdup(url->string); - } + err = nsurl_get(url, NSURL_PORT | NSURL_PATH | NSURL_QUERY | NSURL_FRAGMENT, + &path, &path_len); + + if (err != NSERROR_OK) + return err; + + *url_l = scheme_len + idna_host_len + path_len + 1; /* +1 for \0 */ + *url_s = malloc(*url_l); - snprintf(idna_url, idna_url_len, "%s%s%s", scheme, idna_host, path); + if (*url_s == NULL) + return NSERROR_NOMEM; + + snprintf(*url_s, *url_l, "%s%s%s", scheme, idna_host, path); - return(idna_url); + return NSERROR_OK; } -- cgit v1.2.3