diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2014-05-30 20:03:04 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2014-06-04 13:24:24 +0100 |
commit | db0856606a7f2da053a2a7ff2cee12b69d23cb52 (patch) | |
tree | 51512a989d90c43f4c50bf661f52c7be5acd28e3 /utils/nsurl.c | |
parent | 9d2d717e9ff7be2ee5d76f615db91750adbee9de (diff) | |
download | netsurf-db0856606a7f2da053a2a7ff2cee12b69d23cb52.tar.gz netsurf-db0856606a7f2da053a2a7ff2cee12b69d23cb52.tar.bz2 |
IDNA2008 support.
Diffstat (limited to 'utils/nsurl.c')
-rw-r--r-- | utils/nsurl.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/utils/nsurl.c b/utils/nsurl.c index 5c0a48511..7e8792cff 100644 --- a/utils/nsurl.c +++ b/utils/nsurl.c @@ -28,6 +28,7 @@ #include "utils/corestrings.h" #include "utils/errors.h" +#include "utils/idna.h" #include "utils/log.h" #include "utils/nsurl.h" #include "utils/utils.h" @@ -690,8 +691,10 @@ static nserror nsurl__create_from_section(const char * const url_s, const char *pos; const char *pos_url_s; char *norm_start = pos_norm; + char *host; size_t copy_len; size_t length; + size_t host_len; enum { NSURL_F_NO_PORT = (1 << 0) } flags = 0; @@ -756,7 +759,8 @@ static nserror nsurl__create_from_section(const char * const url_s, continue; } - if (nsurl__is_unreserved(ascii_offset) == false) { + if ((section != URL_SCHEME && section != URL_HOST) && + (nsurl__is_unreserved(ascii_offset) == false)) { /* This character should be escaped after all, * just let it get copied */ copy_len += 3; @@ -778,7 +782,8 @@ static nserror nsurl__create_from_section(const char * const url_s, length -= 2; - } else if (nsurl__is_no_escape(*pos) == false) { + } else if ((section != URL_SCHEME && section != URL_HOST) && + (nsurl__is_no_escape(*pos) == false)) { /* This needs to be escaped */ if (copy_len > 0) { @@ -955,9 +960,15 @@ static nserror nsurl__create_from_section(const char * const url_s, } /* host */ - if (lwc_intern_string(norm_start, length, - &url->host) != lwc_error_ok) { - return NSERROR_NOMEM; + /* Encode host according to IDNA2008 */ + if (idna_encode(norm_start, length, &host, &host_len) == NSERROR_OK) { + if (lwc_intern_string(host, host_len, + &url->host) != lwc_error_ok) { + return NSERROR_NOMEM; + } + free(host); + } else { + return NSERROR_BAD_URL; } } |