diff options
Diffstat (limited to 'utils/nsurl/parse.c')
-rw-r--r-- | utils/nsurl/parse.c | 88 |
1 files changed, 59 insertions, 29 deletions
diff --git a/utils/nsurl/parse.c b/utils/nsurl/parse.c index ce6f4435d..dbf0c6e2c 100644 --- a/utils/nsurl/parse.c +++ b/utils/nsurl/parse.c @@ -37,6 +37,8 @@ #include <string.h> #include <strings.h> +#include "netsurf/inttypes.h" + #include "utils/ascii.h" #include "utils/corestrings.h" #include "utils/errors.h" @@ -302,6 +304,16 @@ static void nsurl__get_string_markers(const char * const url_s, ((*(pos - off + 5) == 'o') || (*(pos - off + 5) == 'O')))) { marker.scheme_type = NSURL_SCHEME_MAILTO; + } else if (off == SLEN("data") && + (((*(pos - off + 0) == 'd') || + (*(pos - off + 0) == 'D')) && + ((*(pos - off + 1) == 'a') || + (*(pos - off + 1) == 'A')) && + ((*(pos - off + 2) == 't') || + (*(pos - off + 2) == 'T')) && + ((*(pos - off + 3) == 'a') || + (*(pos - off + 3) == 'A')))) { + marker.scheme_type = NSURL_SCHEME_DATA; } /* Skip over colon */ @@ -332,7 +344,7 @@ static void nsurl__get_string_markers(const char * const url_s, * and in the case of mailto: when we assume there is an authority. */ if ((*pos == '/' && *(pos + 1) == '/') || - (is_http && ((joining && *pos == '/') || + (is_http && ((joining && *pos == '/') || (joining == false && marker.scheme_end != marker.start))) || marker.scheme_type == NSURL_SCHEME_MAILTO) { @@ -450,21 +462,29 @@ static void nsurl__get_string_markers(const char * const url_s, marker.fragment = marker.end; } -#ifdef NSURL_DEBUG - NSLOG(netsurf, INFO, "marker.start: %i", marker.start); - NSLOG(netsurf, INFO, "marker.scheme_end: %i", marker.scheme_end); - NSLOG(netsurf, INFO, "marker.authority: %i", marker.authority); - - NSLOG(netsurf, INFO, "marker.colon_first: %i", marker.colon_first); - NSLOG(netsurf, INFO, "marker.at: %i", marker.at); - NSLOG(netsurf, INFO, "marker.colon_last: %i", marker.colon_last); - - NSLOG(netsurf, INFO, "marker.path: %i", marker.path); - NSLOG(netsurf, INFO, "marker.query: %i", marker.query); - NSLOG(netsurf, INFO, "marker.fragment: %i", marker.fragment); - - NSLOG(netsurf, INFO, "marker.end: %i", marker.end); -#endif + NSLOG(netsurf, DEEPDEBUG, + "marker.start: %"PRIsizet, marker.start); + NSLOG(netsurf, DEEPDEBUG, + "marker.scheme_end: %"PRIsizet, marker.scheme_end); + NSLOG(netsurf, DEEPDEBUG, + "marker.authority: %"PRIsizet, marker.authority); + + NSLOG(netsurf, DEEPDEBUG, + "marker.colon_first: %"PRIsizet, marker.colon_first); + NSLOG(netsurf, DEEPDEBUG, + "marker.at: %"PRIsizet, marker.at); + NSLOG(netsurf, DEEPDEBUG, + "marker.colon_last: %"PRIsizet, marker.colon_last); + + NSLOG(netsurf, DEEPDEBUG, + "marker.path: %"PRIsizet, marker.path); + NSLOG(netsurf, DEEPDEBUG, + "marker.query: %"PRIsizet, marker.query); + NSLOG(netsurf, DEEPDEBUG, + "marker.fragment: %"PRIsizet, marker.fragment); + + NSLOG(netsurf, DEEPDEBUG, + "marker.end: %"PRIsizet, marker.end); /* Got all the URL components pegged out now */ *markers = marker; @@ -484,10 +504,10 @@ static size_t nsurl__remove_dot_segments(char *path, char *output) char *output_pos = output; while (*path_pos != '\0') { -#ifdef NSURL_DEBUG - NSLOG(netsurf, INFO, " in:%s", path_pos); - NSLOG(netsurf, INFO, "out:%.*s", output_pos - output, output); -#endif + NSLOG(netsurf, DEEPDEBUG, " in:%s", path_pos); + NSLOG(netsurf, DEEPDEBUG, "out:%.*s", + (int)(output_pos - output), output); + if (*path_pos == '.') { if (*(path_pos + 1) == '.' && *(path_pos + 2) == '/') { @@ -557,7 +577,7 @@ static size_t nsurl__remove_dot_segments(char *path, char *output) /* Copy up to but not including next '/' */ while ((*path_pos != '/') && (*path_pos != '\0')) - *output_pos++ = *path_pos++; + *output_pos++ = *path_pos++; } return output_pos - output; @@ -651,7 +671,9 @@ static nserror nsurl__create_from_section(const char * const url_s, break; case URL_QUERY: - start = pegs->query; + start = (*(url_s + pegs->query) != '?') ? + pegs->query : + pegs->query + 1; end = pegs->fragment; break; @@ -1065,6 +1087,15 @@ static void nsurl__get_string_data(const struct nsurl_components *url, *url_l += SLEN("@"); } + /* spanned query question mark */ + if ((flags & ~(NSURL_F_QUERY | NSURL_F_FRAGMENT)) && + (flags & NSURL_F_QUERY)) { + flags |= NSURL_F_QUERY_PUNCTUATION; + + *url_l += SLEN("?"); + } + + /* spanned fragment hash mark */ if ((flags & ~NSURL_F_FRAGMENT) && (flags & NSURL_F_FRAGMENT)) { flags |= NSURL_F_FRAGMENT_PUNCTUATION; @@ -1138,6 +1169,8 @@ static void nsurl__get_string(const struct nsurl_components *url, char *url_s, } if (flags & NSURL_F_QUERY) { + if (flags & NSURL_F_QUERY_PUNCTUATION) + *(pos++) = '?'; memcpy(pos, lwc_string_data(url->query), l->query); pos += l->query; } @@ -1283,7 +1316,7 @@ nserror nsurl_create(const char * const url_s, nsurl **url) } e = nsurl__components_to_string(&c, NSURL_WITH_FRAGMENT, - sizeof(nsurl), (char **)url, &length); + offsetof(nsurl, string), (char **)url, &length); if (e != NSERROR_OK) { return e; } @@ -1323,10 +1356,8 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined) assert(base != NULL); assert(rel != NULL); -#ifdef NSURL_DEBUG - NSLOG(netsurf, INFO, "base: \"%s\", rel: \"%s\"", nsurl_access(base), - rel); -#endif + NSLOG(netsurf, DEEPDEBUG, "base: \"%s\", rel: \"%s\"", + nsurl_access(base), rel); /* Peg out the URL sections */ nsurl__get_string_markers(rel, &m, true); @@ -1523,7 +1554,7 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined) } error = nsurl__components_to_string(&c, NSURL_WITH_FRAGMENT, - sizeof(nsurl), (char **)joined, &length); + offsetof(nsurl, string), (char **)joined, &length); if (error != NSERROR_OK) { return error; } @@ -1539,4 +1570,3 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined) return NSERROR_OK; } - |