in chime/chime-signin.c [897:952]
static void signin_search_result_cb(SoupSession *session, SoupMessage *msg, gpointer data)
{
GHashTable *provider_info = NULL;
SoupMessage *next;
SoupSessionCallback handler;
SoupURI *destination;
gchar *json, *type, *path;
struct signin *state = data;
if (msg->status_code == 400) {
/* This is a known quirk */
fail_bad_response(state, _("Invalid e-mail address <%s>"), state->email);
return;
}
fail_on_response_error(msg, state);
json = parse_regex(msg, "data *= *({[^}]+}) *;", 1);
if (!(json && *json)) {
fail_bad_response(state, _("Could not locate provider data in response"));
goto out;
}
provider_info = parse_json(json);
if (!provider_info) {
fail_bad_response(state, _("Error searching for sign-in provider"));
goto out;
}
type = g_hash_table_lookup(provider_info, "provider");
if (!g_strcmp0(type, "amazon")) {
handler = amazon_signin_cb;
} else if (!g_strcmp0(type, "wd")) {
handler = wd_signin_cb;
} else {
chime_debug("Unrecognized sign-in provider %s\n", type);
fail_bad_response(state, _("Unknown sign-in provider"));
goto out;
}
path = g_hash_table_lookup(provider_info, "path");
if (!path) {
chime_debug("Server did not provide a path\n");
fail_bad_response(state, _("Incomplete provider response"));
goto out;
}
destination = soup_uri_new_with_base(soup_message_get_uri(msg), path);
next = soup_message_new_from_uri(SOUP_METHOD_GET, destination);
soup_message_set_first_party(next, destination);
soup_session_queue_message(session, next, handler, state);
soup_uri_free(destination);
out:
g_hash_table_destroy(provider_info);
g_free(json);
}