Commit 591d8676 authored by Marc-André Lureau's avatar Marc-André Lureau

uri: modify g_uri_parse_params() to take flags

This will allow to further enhance the parsing, without breaking API,
and also makes argument on call side a bit clearer than just TRUE/FALSE.
Signed-off-by: Marc-André Lureau's avatarMarc-André Lureau <marcandre.lureau@redhat.com>
parent d022b719
...@@ -3371,6 +3371,7 @@ g_uri_get_query ...@@ -3371,6 +3371,7 @@ g_uri_get_query
g_uri_get_fragment g_uri_get_fragment
g_uri_get_flags g_uri_get_flags
<SUBSECTION> <SUBSECTION>
GUriParamsFlags
g_uri_parse_params g_uri_parse_params
<SUBSECTION> <SUBSECTION>
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH
......
...@@ -10,7 +10,7 @@ LLVMFuzzerTestOneInput (const unsigned char *data, size_t size) ...@@ -10,7 +10,7 @@ LLVMFuzzerTestOneInput (const unsigned char *data, size_t size)
if (size > G_MAXSSIZE) if (size > G_MAXSSIZE)
return 0; return 0;
parsed_params = g_uri_parse_params ((const gchar *) data, (gssize) size, "&", FALSE); parsed_params = g_uri_parse_params ((const gchar *) data, (gssize) size, "&", G_URI_PARAMS_NONE);
if (parsed_params == NULL) if (parsed_params == NULL)
return 0; return 0;
......
...@@ -1755,7 +1755,7 @@ str_ascii_case_equal (gconstpointer v1, ...@@ -1755,7 +1755,7 @@ str_ascii_case_equal (gconstpointer v1,
* bytes not characters, so it can't be used to delimit UTF-8 strings for * bytes not characters, so it can't be used to delimit UTF-8 strings for
* anything but ASCII characters. You may pass an empty set, in which case * anything but ASCII characters. You may pass an empty set, in which case
* no splitting will occur. * no splitting will occur.
* @case_insensitive: whether parameter names are case insensitive * @flags: flags to modify the way the parameters are handled.
* *
* Many URI schemes include one or more attribute/value pairs as part of the URI * Many URI schemes include one or more attribute/value pairs as part of the URI
* value. This method can be used to parse them into a hash table. * value. This method can be used to parse them into a hash table.
...@@ -1780,7 +1780,7 @@ GHashTable * ...@@ -1780,7 +1780,7 @@ GHashTable *
g_uri_parse_params (const gchar *params, g_uri_parse_params (const gchar *params,
gssize length, gssize length,
const gchar *separators, const gchar *separators,
gboolean case_insensitive) GUriParamsFlags flags)
{ {
GHashTable *hash; GHashTable *hash;
const gchar *end, *attr, *attr_end, *value, *value_end, *s; const gchar *end, *attr, *attr_end, *value, *value_end, *s;
...@@ -1791,7 +1791,7 @@ g_uri_parse_params (const gchar *params, ...@@ -1791,7 +1791,7 @@ g_uri_parse_params (const gchar *params,
g_return_val_if_fail (length >= -1, NULL); g_return_val_if_fail (length >= -1, NULL);
g_return_val_if_fail (separators != NULL, NULL); g_return_val_if_fail (separators != NULL, NULL);
if (case_insensitive) if (flags & G_URI_PARAMS_CASE_INSENSITIVE)
{ {
hash = g_hash_table_new_full (str_ascii_case_hash, hash = g_hash_table_new_full (str_ascii_case_hash,
str_ascii_case_equal, str_ascii_case_equal,
......
...@@ -222,11 +222,26 @@ const gchar *g_uri_get_fragment (GUri *uri); ...@@ -222,11 +222,26 @@ const gchar *g_uri_get_fragment (GUri *uri);
GLIB_AVAILABLE_IN_2_66 GLIB_AVAILABLE_IN_2_66
GUriFlags g_uri_get_flags (GUri *uri); GUriFlags g_uri_get_flags (GUri *uri);
/**
* GUriParamsFlags:
* @G_URI_PARAMS_NONE: No flags set.
* @G_URI_PARAMS_CASE_INSENSITIVE: whether parameter names are case insensitive.
*
* Flags modifying the way parameters are handled.
*
* Since: 2.66
*/
GLIB_AVAILABLE_TYPE_IN_2_66
typedef enum {
G_URI_PARAMS_NONE = 0,
G_URI_PARAMS_CASE_INSENSITIVE = 1 << 0,
} GUriParamsFlags;
GLIB_AVAILABLE_IN_2_66 GLIB_AVAILABLE_IN_2_66
GHashTable * g_uri_parse_params (const gchar *params, GHashTable *g_uri_parse_params (const gchar *params,
gssize length, gssize length,
const gchar *separators, const gchar *separators,
gboolean case_insensitive); GUriParamsFlags flags);
/** /**
* G_URI_ERROR: * G_URI_ERROR:
......
...@@ -1271,7 +1271,7 @@ test_uri_parse_params (gconstpointer test_data) ...@@ -1271,7 +1271,7 @@ test_uri_parse_params (gconstpointer test_data)
/* Inputs */ /* Inputs */
const gchar *uri; const gchar *uri;
gchar *separators; gchar *separators;
gboolean case_insensitive; GUriParamsFlags flags;
/* Outputs */ /* Outputs */
gssize expected_n_params; /* -1 => error expected */ gssize expected_n_params; /* -1 => error expected */
/* key, value, key, value, …, limited to length 2*expected_n_params */ /* key, value, key, value, …, limited to length 2*expected_n_params */
...@@ -1279,15 +1279,13 @@ test_uri_parse_params (gconstpointer test_data) ...@@ -1279,15 +1279,13 @@ test_uri_parse_params (gconstpointer test_data)
} }
tests[] = tests[] =
{ {
{ "", "&", FALSE, 0, { NULL, }}, { "p1=foo&p2=bar;p3=baz", "&;", G_URI_PARAMS_NONE, 3, { "p1", "foo", "p2", "bar", "p3", "baz" }},
{ "p1=foo&p2=bar", "&", FALSE, 2, { "p1", "foo", "p2", "bar" }}, { "p1=foo&p2=bar", "", G_URI_PARAMS_NONE, 1, { "p1", "foo&p2=bar" }},
{ "p1=foo&p2=bar;p3=baz", "&;", FALSE, 3, { "p1", "foo", "p2", "bar", "p3", "baz" }}, { "p1=foo&&P1=bar", "&", G_URI_PARAMS_NONE, -1, { NULL, }},
{ "p1=foo&p2=bar", "", FALSE, 1, { "p1", "foo&p2=bar" }}, { "%00=foo", "&", G_URI_PARAMS_NONE, -1, { NULL, }},
{ "p1=foo&&P1=bar", "&", FALSE, -1, { NULL, }}, { "p1=%00", "&", G_URI_PARAMS_NONE, -1, { NULL, }},
{ "%00=foo", "&", FALSE, -1, { NULL, }}, { "p1=foo&P1=bar", "&", G_URI_PARAMS_CASE_INSENSITIVE, 1, { "p1", "bar", NULL, }},
{ "p1=%00", "&", FALSE, -1, { NULL, }}, { "=%", "&", G_URI_PARAMS_NONE, 1, { "", "%", NULL, }},
{ "p1=foo&P1=bar", "&", TRUE, 1, { "p1", "bar", NULL, }},
{ "=%", "&", FALSE, 1, { "", "%", NULL, }},
}; };
gsize i; gsize i;
...@@ -1317,7 +1315,7 @@ test_uri_parse_params (gconstpointer test_data) ...@@ -1317,7 +1315,7 @@ test_uri_parse_params (gconstpointer test_data)
uri = g_memdup (tests[i].uri, uri_len); uri = g_memdup (tests[i].uri, uri_len);
} }
params = g_uri_parse_params (uri, uri_len, tests[i].separators, tests[i].case_insensitive); params = g_uri_parse_params (uri, uri_len, tests[i].separators, tests[i].flags);
if (tests[i].expected_n_params < 0) if (tests[i].expected_n_params < 0)
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment