summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Griffis <pgriffis@igalia.com>2022-01-27 08:34:28 -0600
committerPatrick Griffis <pgriffis@igalia.com>2022-01-28 10:59:40 -0600
commit2594eb7c6f9c76955fb8e74f6096130944e719a9 (patch)
tree42e0fd90b071dd44617395ca88e9526ae7cc5db9
parentd93656501daf47dcf33e6371764e0f6fa6095134 (diff)
downloadlibsoup-wip/uri-normalize-fixes.tar.gz
uri: Improve soup_uri_copy_with_normalized_flags encoding non-encoded segmentswip/uri-normalize-fixes
-rw-r--r--libsoup/soup-uri-utils.c62
1 files changed, 55 insertions, 7 deletions
diff --git a/libsoup/soup-uri-utils.c b/libsoup/soup-uri-utils.c
index 8fea9a63..61ba590a 100644
--- a/libsoup/soup-uri-utils.c
+++ b/libsoup/soup-uri-utils.c
@@ -432,10 +432,48 @@ soup_uri_copy (GUri *uri,
);
}
+static char *
+maybe_encode_userinfo (const char *userinfo, GUriFlags flags)
+{
+ if (!userinfo || flags & G_URI_FLAGS_ENCODED)
+ return g_strdup (userinfo);
+
+ return g_uri_escape_string (userinfo, G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, FALSE);
+}
+
+static char *
+maybe_encode_path (const char *path, GUriFlags flags)
+{
+ if (!path || flags & G_URI_FLAGS_ENCODED || flags & G_URI_FLAGS_ENCODED_PATH)
+ return g_strdup (path);
+
+ return g_uri_escape_string (path, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE);
+}
+
+static char *
+maybe_encode_query (const char *query, GUriFlags flags)
+{
+ if (!query || flags & G_URI_FLAGS_ENCODED || flags & G_URI_FLAGS_ENCODED_QUERY)
+ return g_strdup (query);
+
+ return g_uri_escape_string (query, NULL, FALSE);
+}
+
+static char *
+maybe_encode_fragment (const char *fragment, GUriFlags flags)
+{
+ if (!fragment || flags & G_URI_FLAGS_ENCODED || flags & G_URI_FLAGS_ENCODED_FRAGMENT)
+ return g_strdup (fragment);
+
+ return g_uri_escape_string (fragment, NULL, FALSE);
+}
+
GUri *
soup_uri_copy_with_normalized_flags (GUri *uri)
{
GUriFlags flags = g_uri_get_flags (uri);
+ char *path, *query, *fragment, *userinfo;
+ GUri *new_uri;
/* We require its encoded (hostname encoding optional) */
if (((flags & (G_URI_FLAGS_ENCODED_PATH | G_URI_FLAGS_ENCODED_QUERY | G_URI_FLAGS_ENCODED_FRAGMENT)) ||
@@ -444,18 +482,28 @@ soup_uri_copy_with_normalized_flags (GUri *uri)
(flags & G_URI_FLAGS_SCHEME_NORMALIZE))
return g_uri_ref (uri);
- return g_uri_build_with_user (
+ userinfo = maybe_encode_userinfo (g_uri_get_userinfo (uri), flags);
+ path = maybe_encode_path (g_uri_get_path (uri), flags);
+ query = maybe_encode_query (g_uri_get_query (uri), flags);
+ fragment = maybe_encode_fragment (g_uri_get_fragment (uri), flags);
+
+ new_uri = g_uri_build (
g_uri_get_flags (uri) | SOUP_HTTP_URI_FLAGS,
g_uri_get_scheme (uri),
- g_uri_get_user (uri),
- g_uri_get_password (uri),
- g_uri_get_auth_params (uri),
+ userinfo,
g_uri_get_host (uri),
g_uri_get_port (uri),
- g_uri_get_path (uri),
- g_uri_get_query (uri),
- g_uri_get_fragment (uri)
+ path,
+ query,
+ fragment
);
+
+ g_free (userinfo);
+ g_free (path);
+ g_free (query);
+ g_free (fragment);
+
+ return new_uri;
}
char *