summaryrefslogtreecommitdiff
path: root/utils/nsurl/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/nsurl/parse.c')
-rw-r--r--utils/nsurl/parse.c88
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;
}
-