GHashTable* balde_parse_query_string(const gchar *query_string) { GHashTable *qs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); if (query_string == NULL) goto point1; gchar **kv = g_strsplit(query_string, "&", 0); for (guint i = 0; kv[i] != NULL; i++) { gchar **pieces = g_strsplit(kv[i], "=", 2); if (g_strv_length(pieces) != 2) goto point2; gchar *key = balde_urldecode(pieces[0]); gchar *value = balde_urldecode(pieces[1]); if (key == NULL || value == NULL) { g_free(key); g_free(value); goto point2; } g_hash_table_replace(qs, key, value); point2: g_strfreev(pieces); } g_strfreev(kv); point1: return qs; }
void test_urldecode(void) { gchar *rv = balde_urldecode("saf%3Dgfd+123"); g_assert_cmpstr(rv, ==, "saf=gfd 123"); g_free(rv); }