libpurple/protocols/facebook/api.c

changeset 41839
143c68ca625d
parent 41728
e9b96ef5ea38
child 41880
4371fa2ce648
--- a/libpurple/protocols/facebook/api.c	Wed Oct 26 02:06:39 2022 -0500
+++ b/libpurple/protocols/facebook/api.c	Wed Oct 26 02:07:31 2022 -0500
@@ -625,36 +625,41 @@
 }
 
 static gboolean
-fb_api_http_chk(FbApi *api, SoupMessage *res, JsonNode **root)
+fb_api_http_chk(FbApi *api, SoupSession *session, GAsyncResult *result,
+                SoupMessage *msg, JsonNode **root)
 {
-	const gchar *data;
-	const gchar *msg;
+	GBytes *response_body = NULL;
+	const gchar *reason = NULL;
+	const gchar *data = NULL;
 	GError *err = NULL;
 	gint code;
-	gsize size;
-
-	msg = soup_message_get_reason_phrase(res);
-	code = soup_message_get_status(res);
-	data = res->response_body->data;
-	size = res->response_body->length;
-
-	fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Response (%p):", res);
-	if (msg != NULL) {
-		fb_util_debug(FB_UTIL_DEBUG_INFO, "  Response Error: %s (%d)", msg,
+	gsize size = 0;
+
+	reason = soup_message_get_reason_phrase(msg);
+	code = soup_message_get_status(msg);
+
+	fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Response (%p):", msg);
+	if (reason != NULL) {
+		fb_util_debug(FB_UTIL_DEBUG_INFO, "  Response Error: %s (%d)", reason,
 		              code);
 	} else {
 		fb_util_debug(FB_UTIL_DEBUG_INFO, "  Response Error: %d", code);
 	}
 
+	if (fb_http_error_chk(msg, &err) && (root == NULL)) {
+		return TRUE;
+	}
+
+	response_body = soup_session_send_and_read_finish(session, result, &err);
+	if(response_body != NULL) {
+		data = g_bytes_get_data(response_body, &size);
+	}
+
 	if (G_LIKELY(size > 0)) {
 		fb_util_debug(FB_UTIL_DEBUG_INFO, "  Response Data: %.*s",
 		              (gint) size, data);
 	}
 
-	if (fb_http_error_chk(res, &err) && (root == NULL)) {
-		return TRUE;
-	}
-
 	/* Rudimentary check to prevent wrongful error parsing */
 	if ((size < 2) || (data[0] != '{') || (data[size - 1] != '}')) {
 		FB_API_ERROR_EMIT(api, err, return FALSE);
@@ -675,7 +680,7 @@
 static SoupMessage *
 fb_api_http_req(FbApi *api, const gchar *url, const gchar *name,
                 const gchar *method, FbHttpParams *params,
-                SoupSessionCallback callback)
+                GAsyncReadyCallback callback)
 {
 	gchar *data;
 	gchar *key;
@@ -726,7 +731,9 @@
 		g_free(data);
 	}
 
-	soup_session_queue_message(api->cons, msg, callback, api);
+	g_object_set_data(G_OBJECT(msg), "facebook-api", api);
+	soup_session_send_and_read_async(api->cons, msg, G_PRIORITY_DEFAULT, NULL,
+	                                 callback, msg);
 
 	fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Request (%p):", msg);
 	fb_util_debug(FB_UTIL_DEBUG_INFO, "  Request URL: %s", url);
@@ -736,7 +743,7 @@
 
 static SoupMessage *
 fb_api_http_query(FbApi *api, gint64 query, JsonBuilder *builder,
-                  SoupSessionCallback hcb)
+                  GAsyncReadyCallback hcb)
 {
 	const gchar *name;
 	FbHttpParams *prms;
@@ -784,19 +791,22 @@
 }
 
 static void
-fb_api_cb_http_bool(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                    gpointer data)
-{
-	FbApi *api = data;
-
-	if (!fb_api_http_chk(api, res, NULL)) {
+fb_api_cb_http_bool(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
+	JsonNode *root;
+
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
-	if (!purple_strequal(res->response_body->data, "true")) {
+	if (!json_node_get_boolean(root)) {
 		fb_api_error_literal(api, FB_API_ERROR,
 		                     _("Failed generic API operation"));
 	}
+
+	json_node_free(root);
 }
 
 static void
@@ -969,16 +979,16 @@
 }
 
 static void
-fb_api_cb_seqid(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                gpointer data)
-{
+fb_api_cb_seqid(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *str;
-	FbApi *api = data;
 	FbJsonValues *values;
 	GError *err = NULL;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -1996,11 +2006,11 @@
 }
 
 static void
-fb_api_cb_attach(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                 gpointer data)
-{
+fb_api_cb_attach(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *str;
-	FbApi *api = data;
 	FbApiMessage *msg;
 	FbJsonValues *values;
 	gchar *name;
@@ -2011,7 +2021,7 @@
 
 	static const gchar *imgexts[] = {".jpg", ".png", ".gif"};
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2026,7 +2036,7 @@
 		return;
 	);
 
-	msg = g_object_steal_data(G_OBJECT(res), "fb-api-msg");
+	msg = g_object_steal_data(G_OBJECT(soupmsg), "fb-api-msg");
 	str = fb_json_values_next_str(values, NULL);
 	name = g_ascii_strdown(str, -1);
 
@@ -2066,15 +2076,15 @@
 }
 
 static void
-fb_api_cb_auth(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-               gpointer data)
-{
-	FbApi *api = data;
+fb_api_cb_auth(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	FbJsonValues *values;
 	GError *err = NULL;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2133,18 +2143,18 @@
 }
 
 static void
-fb_api_cb_contact(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                  gpointer data)
-{
+fb_api_cb_contact(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *str;
-	FbApi *api = data;
 	FbApiUser user;
 	FbJsonValues *values;
 	GError *err = NULL;
 	JsonNode *node;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2285,12 +2295,12 @@
 }
 
 static void
-fb_api_cb_contacts(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                   gpointer data)
-{
+fb_api_cb_contacts(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *cursor;
 	const gchar *delta_cursor;
-	FbApi *api = data;
 	FbJsonValues *values;
 	gboolean complete;
 	gboolean is_delta;
@@ -2301,7 +2311,7 @@
 	JsonNode *croot;
 	JsonNode *node;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2597,12 +2607,12 @@
 }
 
 static void
-fb_api_cb_unread_msgs(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                      gpointer data)
-{
+fb_api_cb_unread_msgs(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *body;
 	const gchar *str;
-	FbApi *api = data;
 	FbApiMessage *dmsg;
 	FbApiMessage msg;
 	FbId id;
@@ -2615,7 +2625,7 @@
 	JsonNode *root;
 	JsonNode *xode;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2729,18 +2739,18 @@
 }
 
 static void
-fb_api_cb_unread(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                 gpointer data)
-{
+fb_api_cb_unread(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *id;
-	FbApi *api = data;
 	FbJsonValues *values;
 	GError *err = NULL;
 	gint64 count;
 	JsonBuilder *bldr;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2808,10 +2818,10 @@
 }
 
 static void
-fb_api_cb_sticker(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                  gpointer data)
-{
-	FbApi *api = data;
+fb_api_cb_sticker(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	FbApiMessage *msg;
 	FbJsonValues *values;
 	GError *err = NULL;
@@ -2819,7 +2829,7 @@
 	JsonNode *node;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2835,7 +2845,7 @@
 		return;
 	);
 
-	msg = g_object_steal_data(G_OBJECT(res), "fb-api-msg");
+	msg = g_object_steal_data(G_OBJECT(soupmsg), "fb-api-msg");
 	msg->flags |= FB_API_MESSAGE_FLAG_IMAGE;
 	msg->text = fb_json_values_next_str_dup(values, NULL);
 	msgs = g_slist_prepend(msgs, msg);
@@ -2937,16 +2947,16 @@
 }
 
 static void
-fb_api_cb_thread(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                 gpointer data)
-{
-	FbApi *api = data;
+fb_api_cb_thread(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	FbApiThread thrd;
 	GError *err = NULL;
 	JsonNode *node;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -2997,17 +3007,17 @@
 }
 
 static void
-fb_api_cb_thread_create(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                        gpointer data)
-{
+fb_api_cb_thread_create(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	const gchar *str;
-	FbApi *api = data;
 	FbId tid;
 	FbJsonValues *values;
 	GError *err = NULL;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 
@@ -3127,10 +3137,10 @@
 }
 
 static void
-fb_api_cb_threads(G_GNUC_UNUSED SoupSession *session, SoupMessage *res,
-                  gpointer data)
-{
-	FbApi *api = data;
+fb_api_cb_threads(GObject *source, GAsyncResult *result, gpointer data) {
+	SoupSession *session = SOUP_SESSION(source);
+	SoupMessage *soupmsg = data;
+	FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
 	FbApiThread *dthrd;
 	FbApiThread thrd;
 	GError *err = NULL;
@@ -3140,7 +3150,7 @@
 	JsonArray *arr;
 	JsonNode *root;
 
-	if (!fb_api_http_chk(api, res, &root)) {
+	if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
 		return;
 	}
 

mercurial