HTTP: migrate purple_util_fetch_url_request to new API for yahoo prpl (completed)

Thu, 04 Jul 2013 21:57:33 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Thu, 04 Jul 2013 21:57:33 +0200
changeset 34235
35b02d591bd9
parent 34234
bb56b6121733
child 34236
65f7a964bab1

HTTP: migrate purple_util_fetch_url_request to new API for yahoo prpl (completed)

libpurple/protocols/yahoo/libymsg.c file | annotate | diff | comparison | revisions
libpurple/protocols/yahoo/libymsg.h file | annotate | diff | comparison | revisions
libpurple/protocols/yahoo/yahoo_aliases.c file | annotate | diff | comparison | revisions
libpurple/protocols/yahoo/yahoo_picture.c file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/yahoo/libymsg.c	Thu Jul 04 16:22:02 2013 +0200
+++ b/libpurple/protocols/yahoo/libymsg.c	Thu Jul 04 21:57:33 2013 +0200
@@ -22,7 +22,6 @@
  */
 
 #include "internal.h"
-#include "obsolete.h"
 
 #include "account.h"
 #include "accountopt.h"
@@ -3682,10 +3681,6 @@
 		yd->inpa = 0;
 	}
 
-	while (yd->url_datas) {
-		purple_util_fetch_url_cancel(yd->url_datas->data);
-		yd->url_datas = g_slist_delete_link(yd->url_datas, yd->url_datas);
-	}
 	while (yd->http_reqs) {
 		purple_http_conn_cancel(yd->http_reqs->data);
 		yd->http_reqs = g_slist_delete_link(yd->http_reqs, yd->http_reqs);
@@ -4078,6 +4073,8 @@
 	yahoo_doodle_initiate(gc, purple_buddy_get_name(b));
 }
 
+#if 0
+/* XXX: it doesn't seems to work */
 static void
 yahoo_userinfo_blist_node(PurpleBlistNode *node, gpointer data)
 {
@@ -4087,6 +4084,7 @@
 
 	yahoo_set_userinfo_for_buddy(gc, b);
 }
+#endif
 
 static GList *yahoo_buddy_menu(PurpleBuddy *buddy)
 {
@@ -4157,10 +4155,13 @@
 			m = g_list_append(m, act);
 		}
 
+#if 0
+		/* XXX: it doesn't seems to work */
 		act = purple_menu_action_new(_("Set User Info..."),
 		                           PURPLE_CALLBACK(yahoo_userinfo_blist_node),
 		                           NULL, NULL);
 		m = g_list_append(m, act);
+#endif
 	}
 
 	return m;
@@ -4188,33 +4189,34 @@
 }
 
 static void
-yahoo_get_inbox_token_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
-		const gchar *token, size_t len, const gchar *error_message)
+yahoo_get_inbox_token_cb(PurpleHttpConnection *http_conn,
+	PurpleHttpResponse *response, gpointer _unused)
 {
-	PurpleConnection *gc = user_data;
-	gboolean set_cookie = FALSE;
+	PurpleConnection *gc =
+		purple_http_conn_get_purple_connection(http_conn);
 	gchar *url;
 	YahooData *yd = purple_connection_get_protocol_data(gc);
 
 	g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc));
 
-	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
-
-	if (error_message != NULL)
-		purple_debug_error("yahoo", "Requesting mail login token failed: %s\n", error_message);
-	else if (len > 0 && token && *token) {
-	 	/* Should we not be hardcoding the rd url? */
+	yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn);
+
+	if (!purple_http_response_is_successfull(response)) {
+		purple_debug_error("yahoo",
+			"Requesting mail login token failed: %s\n",
+			purple_http_response_get_error(response));
+		url = g_strdup(yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL);
+	} else {
+		/* Should we not be hardcoding the rd url? */
+		gchar *token;
+		token = g_strdup(purple_http_response_get_data(response, NULL));
+		g_strstrip(token);
 		url = g_strdup_printf(
 			"http://login.yahoo.com/config/reset_cookies_token?"
 			".token=%s"
-			"&.done=http://us.rd.yahoo.com/messenger/client/%%3fhttp://mail.yahoo.com/",
-			token);
-		set_cookie = TRUE;
-	}
-
-	if (!set_cookie) {
-		purple_debug_error("yahoo", "No mail login token; forwarding to login screen.\n");
-		url = g_strdup(yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL);
+			"&.done=http://us.rd.yahoo.com/messenger/client/%%3f"
+			"http://mail.yahoo.com/", token);
+		purple_str_wipe(token);
 	}
 
 	/* Open the mailbox with the parsed url data */
@@ -4231,42 +4233,32 @@
 
 	PurpleConnection *gc = action->context;
 	YahooData *yd = purple_connection_get_protocol_data(gc);
-
-	PurpleUtilFetchUrlData *url_data;
-	const char* base_url = "http://login.yahoo.com";
-	/* use whole URL if using HTTP Proxy */
-	gboolean use_whole_url = yahoo_account_use_http_proxy(gc);
-	gchar *request = g_strdup_printf(
-		"POST %s/config/cookie_token HTTP/1.0\r\n"
-		"Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s;\r\n"
-		"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
-		"Host: login.yahoo.com\r\n"
-		"Content-Length: 0\r\n\r\n",
-		use_whole_url ? base_url : "",
-		yd->cookie_t, yd->cookie_y);
-
-	url_data = purple_util_fetch_url_request(
-			purple_connection_get_account(gc), base_url, use_whole_url,
-			YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1,
-			yahoo_get_inbox_token_cb, gc);
-
-	g_free(request);
-
-	if (url_data != NULL)
-		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
-	else {
-		const char *yahoo_mail_url = (yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL);
-		purple_debug_error("yahoo",
-				   "Unable to request mail login token; forwarding to login screen.");
-		purple_notify_uri(gc, yahoo_mail_url);
-	}
+	PurpleHttpRequest *req;
+	PurpleHttpCookieJar *cookiejar;
+	PurpleHttpConnection *hc;
+
+	req = purple_http_request_new(
+		"https://login.yahoo.com/config/cookie_token");
+	purple_http_request_set_method(req, "POST");
+	purple_http_request_header_set(req, "User-Agent",
+		YAHOO_CLIENT_USERAGENT);
+	cookiejar = purple_http_request_get_cookie_jar(req);
+	purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t);
+	purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y);
+	hc = purple_http_request(gc, req, yahoo_get_inbox_token_cb, NULL);
+	purple_http_request_unref(req);
+
+	yd->http_reqs = g_slist_prepend(yd->http_reqs, hc);
 }
 
+#if 0
+/* XXX: it doesn't seems to work */
 static void
 yahoo_set_userinfo_fn(PurplePluginAction *action)
 {
 	yahoo_set_userinfo(action->context);
 }
+#endif
 
 static void yahoo_show_act_id(PurplePluginAction *action)
 {
@@ -4313,9 +4305,12 @@
 	GList *m = NULL;
 	PurplePluginAction *act;
 
+#if 0
+	/* XXX: it doesn't seems to work */
 	act = purple_plugin_action_new(_("Set User Info..."),
 			yahoo_set_userinfo_fn);
 	m = g_list_append(m, act);
+#endif
 
 	act = purple_plugin_action_new(_("Activate ID..."),
 			yahoo_show_act_id);
@@ -4339,10 +4334,10 @@
 	char *what;
 };
 
-static void yahoo_get_sms_carrier_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
-		const gchar *webdata, size_t len, const gchar *error_message)
+static void yahoo_get_sms_carrier_cb(PurpleHttpConnection *http_conn,
+	PurpleHttpResponse *response, gpointer _sms_cb_data)
 {
-	struct yahoo_sms_carrier_cb_data *sms_cb_data = user_data;
+	struct yahoo_sms_carrier_cb_data *sms_cb_data = _sms_cb_data;
 	PurpleConnection *gc = sms_cb_data->gc;
 	YahooData *yd = purple_connection_get_protocol_data(gc);
 	char *status = NULL;
@@ -4350,18 +4345,18 @@
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account);
 
-	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
-
-	if (error_message != NULL) {
+	yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn);
+
+	if (!purple_http_response_is_successfull(response)) {
 		purple_conversation_write(conv, NULL, _("Can't send SMS. Unable to obtain mobile carrier."), PURPLE_MESSAGE_SYSTEM, time(NULL));
 
 		g_free(sms_cb_data->who);
 		g_free(sms_cb_data->what);
 		g_free(sms_cb_data);
 		return ;
-	}
-	else if (len > 0 && webdata && *webdata) {
-		xmlnode *validate_data_root = xmlnode_from_str(webdata, -1);
+	} else {
+		const gchar *got_data = purple_http_response_get_data(response, NULL);
+		xmlnode *validate_data_root = xmlnode_from_str(got_data, -1);
 		xmlnode *validate_data_child = xmlnode_get_child(validate_data_root, "mobile_no");
 		const char *mobile_no = xmlnode_get_attrib(validate_data_child, "msisdn");
 
@@ -4372,7 +4367,7 @@
 		validate_data_child = xmlnode_get_child(validate_data_root, "carrier");
 		carrier = xmlnode_get_data(validate_data_child);
 
-		purple_debug_info("yahoo", "SMS validate data: %s\n", webdata);
+		purple_debug_info("yahoo", "SMS validate data: %s\n", got_data);
 
 		if (status && g_str_equal(status, "Valid")) {
 			g_hash_table_insert(yd->sms_carrier,
@@ -4400,11 +4395,11 @@
 static void yahoo_get_sms_carrier(PurpleConnection *gc, gpointer data)
 {
 	YahooData *yd = purple_connection_get_protocol_data(gc);
-	PurpleUtilFetchUrlData *url_data;
+	PurpleHttpRequest *req;
+	PurpleHttpCookieJar *cookiejar;
+	PurpleHttpConnection *hc;
 	struct yahoo_sms_carrier_cb_data *sms_cb_data;
 	char *validate_request_str = NULL;
-	char *request = NULL;
-	gboolean use_whole_url = FALSE;
 	xmlnode *validate_request_root = NULL;
 	xmlnode *validate_request_child = NULL;
 
@@ -4424,37 +4419,22 @@
 	xmlnode_free(validate_request_child);
 	xmlnode_free(validate_request_root);
 
-	request = g_strdup_printf(
-		"POST /mobileno?intl=us&version=%s HTTP/1.1\r\n"
-		"Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s; path=/; domain=.yahoo.com;\r\n"
-		"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
-		"Host: validate.msg.yahoo.com\r\n"
-		"Content-Length: %" G_GSIZE_FORMAT "\r\n"
-		"Cache-Control: no-cache\r\n\r\n%s",
-		YAHOO_CLIENT_VERSION, yd->cookie_t, yd->cookie_y, strlen(validate_request_str), validate_request_str);
-
-	/* use whole URL if using HTTP Proxy */
-	if ((purple_account_get_proxy_info(purple_connection_get_account(gc))) && (purple_proxy_info_get_type(purple_account_get_proxy_info(purple_connection_get_account(gc))) == PURPLE_PROXY_HTTP))
-	    use_whole_url = TRUE;
-
-	url_data = purple_util_fetch_url_request(
-			purple_connection_get_account(gc), YAHOO_SMS_CARRIER_URL, use_whole_url,
-			YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1,
-			yahoo_get_sms_carrier_cb, data);
-
-	g_free(request);
+	req = purple_http_request_new(NULL);
+	purple_http_request_set_url_printf(req, "http://validate.msg.yahoo.com"
+		"/mobileno?intl=us&version=%s", YAHOO_CLIENT_VERSION);
+	purple_http_request_set_method(req, "POST");
+	purple_http_request_header_set(req, "User-Agent",
+		YAHOO_CLIENT_USERAGENT);
+	cookiejar = purple_http_request_get_cookie_jar(req);
+	purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t);
+	purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y);
+	purple_http_request_set_contents(req, validate_request_str, -1);
+	hc = purple_http_request(gc, req, yahoo_get_sms_carrier_cb, data);
+	purple_http_request_unref(req);
+
+	yd->http_reqs = g_slist_prepend(yd->http_reqs, hc);
+
 	g_free(validate_request_str);
-
-	if (url_data)
-		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
-	else {
-		PurpleAccount *account = purple_connection_get_account(gc);
-		PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account);
-		purple_conversation_write(conv, NULL, _("Can't send SMS. Unable to obtain mobile carrier."), PURPLE_MESSAGE_SYSTEM, time(NULL));
-		g_free(sms_cb_data->who);
-		g_free(sms_cb_data->what);
-		g_free(sms_cb_data);
-	}
 }
 
 int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, PurpleMessageFlags flags)
--- a/libpurple/protocols/yahoo/libymsg.h	Thu Jul 04 16:22:02 2013 +0200
+++ b/libpurple/protocols/yahoo/libymsg.h	Thu Jul 04 21:57:33 2013 +0200
@@ -245,9 +245,6 @@
 	 */
 	GSList *http_reqs;
 
-	/* TODO: remove it */
-	GSList *url_datas;
-
 	GHashTable *xfer_peer_idstring_map;/* Hey, i dont know, but putting this HashTable next to friends gives a run time fault... */
 	GSList *cookies;/* contains all cookies, including _y and _t */
 	PurpleNetworkListenData *listen_data;
--- a/libpurple/protocols/yahoo/yahoo_aliases.c	Thu Jul 04 16:22:02 2013 +0200
+++ b/libpurple/protocols/yahoo/yahoo_aliases.c	Thu Jul 04 21:57:33 2013 +0200
@@ -23,7 +23,6 @@
 
 
 #include "internal.h"
-#include "obsolete.h"
 
 #include "account.h"
 #include "accountopt.h"
@@ -73,28 +72,38 @@
  **************************************************************************/
 
 static void
-yahoo_fetch_aliases_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, size_t len, const gchar *error_message)
+yahoo_fetch_aliases_cb(PurpleHttpConnection *http_conn,
+	PurpleHttpResponse *response, gpointer _unused)
 {
-	PurpleConnection *gc = user_data;
+	PurpleConnection *gc =
+		purple_http_conn_get_purple_connection(http_conn);
 	YahooData *yd = purple_connection_get_protocol_data(gc);
 
-	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
+	yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn);
 
-	if (len == 0) {
-		purple_debug_info("yahoo", "No Aliases to process.%s%s\n",
-						  error_message ? " Error:" : "", error_message ? error_message : "");
+	if (!purple_http_response_is_successfull(response)) {
+		purple_debug_info("yahoo", "yahoo_fetch_aliases_cb error: %s\n",
+			purple_http_response_get_error(response));
 	} else {
 		gchar *full_name, *nick_name;
+		const gchar *xml_raw;
 		const char *yid, *id, *fn, *ln, *nn, *alias, *mn;
 		const char *hp, *wp, *mo;
 		YahooFriend *f;
 		PurpleBuddy *b;
 		xmlnode *item, *contacts;
 		PurpleAccount *account;
+		size_t len;
 
 		account = purple_connection_get_account(gc);
 		/* Put our web response into a xmlnode for easy management */
-		contacts = xmlnode_from_str(url_text, -1);
+		xml_raw = purple_http_response_get_data(response, &len);
+		contacts = xmlnode_from_str(xml_raw, -1);
+
+		if (purple_debug_is_verbose()) {
+			purple_debug_misc("yahoo",
+				"yahoo_fetch_aliases_cb xml:[%s]\n", xml_raw);
+		}
 
 		if (contacts == NULL) {
 			purple_debug_error("yahoo", "Badly formed Alias XML\n");
@@ -189,37 +198,22 @@
 yahoo_fetch_aliases(PurpleConnection *gc)
 {
 	YahooData *yd = purple_connection_get_protocol_data(gc);
-	const char *url;
-	gchar *request;
-	PurpleUtilFetchUrlData *url_data;
-	PurpleHttpURL *url_p;
-
-	/* use whole URL if using HTTP Proxy */
-	gboolean use_whole_url = yahoo_account_use_http_proxy(gc);
-
-	/*  Build all the info to make the web request */
-	url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL;
-	url_p = purple_http_url_parse(url);
-	g_assert(url_p != NULL);
+	PurpleHttpRequest *req;
+	PurpleHttpConnection *hc;
+	PurpleHttpCookieJar *cookiejar;
 
-	request = g_strdup_printf("GET %s%s%s HTTP/1.1\r\n"
-				 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
-				 "Cookie: T=%s; Y=%s\r\n"
-				 "Host: %s\r\n"
-				 "Cache-Control: no-cache\r\n\r\n",
-				  use_whole_url ? "http://" : "", use_whole_url ? purple_http_url_get_host(url_p) : "", purple_http_url_get_path(url_p),
-				  yd->cookie_t, yd->cookie_y,
-				  purple_http_url_get_host(url_p));
+	req = purple_http_request_new(yd->jp ? YAHOOJP_ALIAS_FETCH_URL :
+		YAHOO_ALIAS_FETCH_URL);
+	/* XXX: see the other note about user-agent */
+	purple_http_request_header_set(req, "User-Agent",
+		"Mozilla/4.0 (compatible; MSIE 5.5)");
+	cookiejar = purple_http_request_get_cookie_jar(req);
+	purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t);
+	purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y);
+	hc = purple_http_request(gc, req, yahoo_fetch_aliases_cb, NULL);
+	purple_http_request_unref(req);
 
-	/* We have a URL and some header information, let's connect and get some aliases  */
-	url_data = purple_util_fetch_url_request(purple_connection_get_account(gc),
-				url, use_whole_url, NULL, TRUE, request, FALSE, -1,
-				yahoo_fetch_aliases_cb, gc);
-	if (url_data != NULL)
-		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
-
-	purple_http_url_free(url_p);
-	g_free(request);
+	yd->http_reqs = g_slist_prepend(yd->http_reqs, hc);
 }
 
 /**************************************************************************
@@ -227,27 +221,28 @@
  **************************************************************************/
 
 static void
-yahoo_update_alias_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, size_t len, const gchar *error_message)
+yahoo_update_alias_cb(PurpleHttpConnection *http_conn,
+	PurpleHttpResponse *response, gpointer _cb)
 {
 	xmlnode *node, *result;
-	struct callback_data *cb = user_data;
+	struct callback_data *cb = _cb;
 	PurpleConnection *gc = cb->gc;
 	YahooData *yd;
 
 	yd = purple_connection_get_protocol_data(gc);
-	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
+	yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn);
 
-	if (len == 0 || error_message != NULL) {
+	if (!purple_http_response_is_successfull(response)) {
 		purple_debug_info("yahoo", "Error updating alias for %s: %s\n",
-				  cb->who,
-				  error_message ? error_message : "");
+			cb->who, purple_http_response_get_error(response));
 		g_free(cb->who);
 		g_free(cb->id);
 		g_free(cb);
 		return;
 	}
 
-	result = xmlnode_from_str(url_text, -1);
+	result = xmlnode_from_str(
+		purple_http_response_get_data(response, NULL), -1);
 
 	if (result == NULL) {
 		purple_debug_error("yahoo", "Alias update for %s failed: Badly formed response\n",
@@ -293,15 +288,13 @@
 void
 yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias)
 {
+	PurpleHttpRequest *req;
+	PurpleHttpConnection *hc;
+	PurpleHttpCookieJar *cookiejar;
 	YahooData *yd;
-	const char *url;
-	gchar *content, *request;
+	gchar *content;
 	struct callback_data *cb;
-	PurpleUtilFetchUrlData *url_data;
-	PurpleHttpURL *url_p;
 	YahooFriend *f;
-	/* use whole URL if using HTTP Proxy */
-	gboolean use_whole_url = yahoo_account_use_http_proxy(gc);
 
 	g_return_if_fail(who != NULL);
 	g_return_if_fail(gc != NULL);
@@ -323,12 +316,6 @@
 	cb->id = g_strdup(yahoo_friend_get_alias_id(f));
 	cb->gc = gc;
 
-	/*  Build all the info to make the web request */
-	url = yd->jp ? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL;
-
-	url_p = purple_http_url_parse(url);
-	g_assert(url_p != NULL);
-
 	if (cb->id == NULL) {
 		/* No id for this buddy, so create an address book entry */
 		purple_debug_info("yahoo", "Creating '%s' as new alias for user '%s'\n", alias, who);
@@ -372,29 +359,24 @@
 		}
 	}
 
-	request = g_strdup_printf("POST %s%s%s HTTP/1.1\r\n"
-				  "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
-				  "Cookie: T=%s; Y=%s\r\n"
-				  "Host: %s\r\n"
-				  "Content-Length: %" G_GSIZE_FORMAT "\r\n"
-				  "Cache-Control: no-cache\r\n\r\n"
-				  "%s",
-				  use_whole_url ? "http://" : "", use_whole_url ? purple_http_url_get_host(url_p) : "", purple_http_url_get_path(url_p),
-				  yd->cookie_t, yd->cookie_y,
-				  purple_http_url_get_host(url_p),
-				  strlen(content),
-				  content);
+	req = purple_http_request_new(yd->jp ? YAHOOJP_ALIAS_UPDATE_URL:
+		YAHOO_ALIAS_UPDATE_URL);
+	purple_http_request_set_method(req, "POST");
+	/* XXX: We get rs="ERROR:-100:No Login", when we set
+	 * YAHOO_CLIENT_USERAGENT (Mozilla/5.0) here.
+	 */
+	purple_http_request_header_set(req, "User-Agent",
+		"Mozilla/4.0 (compatible; MSIE 5.5)");
+	cookiejar = purple_http_request_get_cookie_jar(req);
+	purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t);
+	purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y);
+	purple_http_request_set_contents(req, content, -1);
+	hc = purple_http_request(gc, req, yahoo_update_alias_cb, cb);
+	purple_http_request_unref(req);
 
-	/* We have a URL and some header information, let's connect and update the alias  */
-	url_data = purple_util_fetch_url_request(
-			purple_connection_get_account(gc), url, use_whole_url, NULL, TRUE,
-			request, FALSE, -1, yahoo_update_alias_cb, cb);
-	if (url_data != NULL)
-		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
+	yd->http_reqs = g_slist_prepend(yd->http_reqs, hc);
 
-	purple_http_url_free(url_p);
 	g_free(content);
-	g_free(request);
 }
 
 
@@ -456,19 +438,18 @@
 static void
 yahoo_set_userinfo_cb(PurpleConnection *gc, PurpleRequestFields *fields)
 {
+	PurpleHttpRequest *req;
+	PurpleHttpConnection *hc;
+	PurpleHttpCookieJar *cookiejar;
+
 	xmlnode *node = xmlnode_new("ab");
 	xmlnode *ct = xmlnode_new_child(node, "ct");
 	YahooData *yd = purple_connection_get_protocol_data(gc);
-	PurpleAccount *account;
-	PurpleUtilFetchUrlData *url_data;
-	PurpleHttpURL *url_p;
-	char *request, *content;
+	char *content;
 	int len;
 	int i;
 	char * yfields[] = { "fn", "ln", "nn", "mn", "hp", "wp", "mo", NULL };
 
-	account = purple_connection_get_account(gc);
-
 	xmlnode_set_attrib(node, "k", purple_connection_get_display_name(gc));
 	xmlnode_set_attrib(node, "cc", "1");		/* XXX: ? */
 
@@ -485,22 +466,6 @@
 	content = xmlnode_to_formatted_str(node, &len);
 	xmlnode_free(node);
 
-	url_p = purple_http_url_parse(yd->jp ? YAHOOJP_USERINFO_URL : YAHOO_USERINFO_URL);
-	g_assert(url_p != NULL);
-
-	request = g_strdup_printf("POST %s HTTP/1.1\r\n"
-				  "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
-				  "Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s;\r\n"
-				  "Host: %s\r\n"
-				  "Content-Length: %d\r\n"
-				  "Cache-Control: no-cache\r\n\r\n"
-				  "%s\r\n\r\n",
-				  purple_http_url_get_path(url_p),
-				  yd->cookie_t, yd->cookie_y,
-				  purple_http_url_get_host(url_p),
-				  len + 4,
-				  content);
-
 #if 0
 	{
 		/* This is if we wanted to send our contact details to everyone
@@ -525,15 +490,22 @@
 	}
 #endif
 
-	url_data = purple_util_fetch_url_request(account, purple_http_url_get_host(url_p), FALSE,
-			YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1,
-			yahoo_fetch_aliases_cb, gc);
-	if (url_data != NULL)
-		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
+	req = purple_http_request_new(yd->jp ? YAHOOJP_USERINFO_URL :
+		YAHOO_USERINFO_URL);
+	purple_http_request_set_method(req, "POST");
+	/* XXX: see the previous comment for user-agent */
+	purple_http_request_header_set(req, "User-Agent",
+		"Mozilla/4.0 (compatible; MSIE 5.5)");
+	cookiejar = purple_http_request_get_cookie_jar(req);
+	purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t);
+	purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y);
+	purple_http_request_set_contents(req, content, -1);
+	hc = purple_http_request(gc, req, yahoo_fetch_aliases_cb, NULL);
+	purple_http_request_unref(req);
 
-	purple_http_url_free(url_p);
+	yd->http_reqs = g_slist_prepend(yd->http_reqs, hc);
+
 	g_free(content);
-	g_free(request);
 }
 
 static PurpleRequestFields *
@@ -558,6 +530,13 @@
 		{NULL, NULL, NULL}
 	};
 
+	if (ypd->id == NULL) {
+		purple_debug_error("yahoo",
+			"request_fields_from_personal_details:"
+			"ypd->id == NULL (it doesn't seems to work)\n");
+		return NULL;
+	}
+
 	fields = purple_request_fields_new();
 	group = purple_request_field_group_new(NULL);
 	purple_request_fields_add_group(fields, group);
@@ -591,6 +570,8 @@
 		return;
 
 	fields = request_fields_from_personal_details(&f->ypd, name);
+	if (fields == NULL)
+		return;
 	purple_request_fields(gc, NULL, _("Set User Info"), NULL, fields,
 			_("OK"), G_CALLBACK(yahoo_set_userinfo_cb),
 			_("Cancel"), NULL,
@@ -602,6 +583,8 @@
 	YahooData *yd = purple_connection_get_protocol_data(gc);
 	PurpleRequestFields *fields = request_fields_from_personal_details(&yd->ypd,
 					purple_connection_get_display_name(gc));
+	if (fields == NULL)
+		return;
 	purple_request_fields(gc, NULL, _("Set User Info"), NULL, fields,
 			_("OK"), G_CALLBACK(yahoo_set_userinfo_cb),
 			_("Cancel"), NULL,
--- a/libpurple/protocols/yahoo/yahoo_picture.c	Thu Jul 04 16:22:02 2013 +0200
+++ b/libpurple/protocols/yahoo/yahoo_picture.c	Thu Jul 04 21:57:33 2013 +0200
@@ -22,7 +22,6 @@
  */
 
 #include "internal.h"
-#include "obsolete.h"
 
 #include "account.h"
 #include "accountopt.h"

mercurial