/** * soup_form_decode: * @encoded_form: data of type "application/x-www-form-urlencoded" * * Decodes @form, which is an urlencoded dataset as defined in the * HTML 4.01 spec. * * Return value: (element-type utf8 utf8) (transfer full): a hash * table containing the name/value pairs from @encoded_form, which you * can free with g_hash_table_destroy(). **/ GHashTable * soup_form_decode (const char *encoded_form) { GHashTable *form_data_set; char **pairs, *eq, *name, *value; int i; form_data_set = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); pairs = g_strsplit (encoded_form, "&", -1); for (i = 0; pairs[i]; i++) { name = pairs[i]; eq = strchr (name, '='); if (eq) { *eq = '\0'; value = eq + 1; } else value = NULL; if (!value || !form_decode (name) || !form_decode (value)) { g_free (name); continue; } g_hash_table_replace (form_data_set, name, value); } g_free (pairs); return form_data_set; }
static GList * query_split (const char *query) { GList *items; char **pairs; int i; items = NULL; pairs = g_strsplit (query, "&", -1); for (i = 0; pairs[i]; i++) { QueryItem *item; char *decoded_name = NULL; char *pair, *eq; pair = pairs[i]; eq = strchr (pair, '='); if (eq) decoded_name = g_strndup (pair, eq - pair); else decoded_name = g_strdup (pair); if (!form_decode (decoded_name)) { g_free (decoded_name); decoded_name = NULL; } item = g_slice_new0 (QueryItem); item->decoded_name = decoded_name; item->pair = pair; items = g_list_prepend (items, item); } g_free (pairs); return g_list_reverse (items); }