static void signin_search_result_cb()

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);
}