/cpw/tomkiewicz/http: ca36fb806037: Break the API with purple_ur...
Tomasz Wasilczyk
tomkiewicz at cpw.pidgin.im
Fri Oct 12 19:52:32 EDT 2012
Changeset: ca36fb80603785926fc2c1c2c0001ff53a462c18
Author: Tomasz Wasilczyk <tomkiewicz at cpw.pidgin.im>
Date: 2012-10-13 01:52 +0200
Branch: default
URL: http://hg.pidgin.im/cpw/tomkiewicz/http/rev/ca36fb806037
Description:
Break the API with purple_url_parse returning protocol
diffstat:
libpurple/obsolete.c | 4 +-
libpurple/protocols/jabber/bosh.c | 2 +-
libpurple/protocols/jabber/oob.c | 2 +-
libpurple/protocols/msn/soap.c | 2 +-
libpurple/protocols/mxit/protocol.c | 2 +-
libpurple/protocols/yahoo/yahoo_aliases.c | 6 +-
libpurple/protocols/yahoo/yahoo_filexfer.c | 8 ++--
libpurple/protocols/yahoo/yahoochat.c | 4 +-
libpurple/proxy.c | 2 +-
libpurple/upnp.c | 6 +-
libpurple/util.c | 48 +++++++++++++----------------
libpurple/util.h | 18 ++++++-----
12 files changed, 50 insertions(+), 54 deletions(-)
diffs (truncated from 316 to 300 lines):
diff --git a/libpurple/obsolete.c b/libpurple/obsolete.c
--- a/libpurple/obsolete.c
+++ b/libpurple/obsolete.c
@@ -170,7 +170,7 @@ parse_redirect(const char *data, size_t
g_free(gfud->website.passwd);
g_free(gfud->website.address);
g_free(gfud->website.page);
- purple_url_parse(new_url, &gfud->website.address, &gfud->website.port,
+ purple_url_parse(new_url, NULL, &gfud->website.address, &gfud->website.port,
&gfud->website.page, &gfud->website.user, &gfud->website.passwd);
if (purple_strcasestr(new_url, "https://") != NULL) {
@@ -647,7 +647,7 @@ purple_util_fetch_url_request(PurpleAcco
gfud->max_len = max_len;
gfud->account = account;
- purple_url_parse(url, &gfud->website.address, &gfud->website.port,
+ purple_url_parse(url, NULL, &gfud->website.address, &gfud->website.port,
&gfud->website.page, &gfud->website.user, &gfud->website.passwd);
if (purple_strcasestr(url, "https://") != NULL) {
diff --git a/libpurple/protocols/jabber/bosh.c b/libpurple/protocols/jabber/bosh.c
--- a/libpurple/protocols/jabber/bosh.c
+++ b/libpurple/protocols/jabber/bosh.c
@@ -202,7 +202,7 @@ jabber_bosh_connection_init(JabberStream
char *host, *path, *user, *passwd;
int port;
- if (!purple_url_parse(url, &host, &port, &path, &user, &passwd)) {
+ if (!purple_url_parse(url, NULL, &host, &port, &path, &user, &passwd)) {
purple_debug_info("jabber", "Unable to parse given URL.\n");
return NULL;
}
diff --git a/libpurple/protocols/jabber/oob.c b/libpurple/protocols/jabber/oob.c
--- a/libpurple/protocols/jabber/oob.c
+++ b/libpurple/protocols/jabber/oob.c
@@ -209,7 +209,7 @@ void jabber_oob_parse(JabberStream *js,
url = xmlnode_get_data(urlnode);
jox = g_new0(JabberOOBXfer, 1);
- if (!purple_url_parse(url, &jox->address, &jox->port, &jox->page, NULL, NULL)) {
+ if (!purple_url_parse(url, NULL, &jox->address, &jox->port, &jox->page, NULL, NULL)) {
g_free(url);
return;
}
diff --git a/libpurple/protocols/msn/soap.c b/libpurple/protocols/msn/soap.c
--- a/libpurple/protocols/msn/soap.c
+++ b/libpurple/protocols/msn/soap.c
@@ -274,7 +274,7 @@ msn_soap_handle_redirect(MsnSoapConnecti
char *host;
char *path;
- if (purple_url_parse(url, &host, NULL, &path, NULL, NULL)) {
+ if (purple_url_parse(url, NULL, &host, NULL, &path, NULL, NULL)) {
MsnSoapRequest *req = conn->current_request;
conn->current_request = NULL;
diff --git a/libpurple/protocols/mxit/protocol.c b/libpurple/protocols/mxit/protocol.c
--- a/libpurple/protocols/mxit/protocol.c
+++ b/libpurple/protocols/mxit/protocol.c
@@ -337,7 +337,7 @@ static void mxit_write_http_post( struct
gboolean ok;
/* extract the HTTP host name and host port number to connect to */
- ok = purple_url_parse( session->http_server, &host_name, &host_port, NULL, NULL, NULL );
+ ok = purple_url_parse( session->http_server, NULL, &host_name, &host_port, NULL, NULL, NULL );
if ( !ok ) {
purple_debug_error( MXIT_PLUGIN_ID, "HTTP POST error: (host name '%s' not valid)\n", session->http_server );
}
diff --git a/libpurple/protocols/yahoo/yahoo_aliases.c b/libpurple/protocols/yahoo/yahoo_aliases.c
--- a/libpurple/protocols/yahoo/yahoo_aliases.c
+++ b/libpurple/protocols/yahoo/yahoo_aliases.c
@@ -197,7 +197,7 @@ yahoo_fetch_aliases(PurpleConnection *gc
/* Build all the info to make the web request */
url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL;
- purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL);
+ purple_url_parse(url, NULL, &webaddress, NULL, &webpage, NULL, NULL);
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"
@@ -321,7 +321,7 @@ yahoo_update_alias(PurpleConnection *gc,
/* Build all the info to make the web request */
url = yd->jp ? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL;
- purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL);
+ purple_url_parse(url, NULL, &webaddress, NULL, &webpage, NULL, NULL);
if (cb->id == NULL) {
/* No id for this buddy, so create an address book entry */
@@ -479,7 +479,7 @@ yahoo_set_userinfo_cb(PurpleConnection *
content = xmlnode_to_formatted_str(node, &len);
xmlnode_free(node);
- purple_url_parse(yd->jp ? YAHOOJP_USERINFO_URL : YAHOO_USERINFO_URL, &webaddress, NULL, &webpage, NULL, NULL);
+ purple_url_parse(yd->jp ? YAHOOJP_USERINFO_URL : YAHOO_USERINFO_URL, NULL, &webaddress, NULL, &webpage, NULL, NULL);
request = g_strdup_printf("POST %s HTTP/1.1\r\n"
"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
diff --git a/libpurple/protocols/yahoo/yahoo_filexfer.c b/libpurple/protocols/yahoo/yahoo_filexfer.c
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c
+++ b/libpurple/protocols/yahoo/yahoo_filexfer.c
@@ -871,7 +871,7 @@ void yahoo_process_filetransfer(PurpleCo
/* Setup the Yahoo-specific file transfer data */
xfer_data = g_new0(struct yahoo_xfer_data, 1);
xfer_data->gc = gc;
- if (!purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
+ if (!purple_url_parse(url, NULL, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
g_free(xfer_data);
return;
}
@@ -1045,7 +1045,7 @@ static void yahoo_xfer_dns_connected_15(
hosts = g_slist_remove(hosts, hosts->data);
}
- if (!purple_url_parse(url, &(xd->host), &(xd->port), &(xd->path), NULL, NULL)) {
+ if (!purple_url_parse(url, NULL, &(xd->host), &(xd->port), &(xd->path), NULL, NULL)) {
purple_xfer_cancel_remote(xfer);
g_free(url);
return;
@@ -1840,7 +1840,7 @@ void yahoo_process_filetrans_info_15(Pur
xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay);
if(val_249 == 1 || val_249 == 3) {
PurpleAccount *account;
- if (!purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
+ if (!purple_url_parse(url, NULL, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
purple_xfer_cancel_remote(xfer);
return;
}
@@ -1933,7 +1933,7 @@ void yahoo_process_filetrans_acc_15(Purp
xfer_data = purple_xfer_get_protocol_data(xfer);
if(url)
- purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL);
+ purple_url_parse(url, NULL, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL);
xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay);
xfer_data->status_15 = ACCEPTED;
diff --git a/libpurple/protocols/yahoo/yahoochat.c b/libpurple/protocols/yahoo/yahoochat.c
--- a/libpurple/protocols/yahoo/yahoochat.c
+++ b/libpurple/protocols/yahoo/yahoochat.c
@@ -1530,7 +1530,7 @@ PurpleRoomlist *yahoo_roomlist_get_list(
rl = purple_roomlist_new(account);
yrl->list = rl;
- purple_url_parse(url, &(yrl->host), NULL, &(yrl->path), NULL, NULL);
+ purple_url_parse(url, NULL, &(yrl->host), NULL, &(yrl->path), NULL, NULL);
g_free(url);
f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", "room", TRUE);
@@ -1624,7 +1624,7 @@ void yahoo_roomlist_expand_category(Purp
proto_data = g_list_append(proto_data, yrl);
purple_roomlist_set_proto_data(list, proto_data);
- purple_url_parse(url, &(yrl->host), NULL, &(yrl->path), NULL, NULL);
+ purple_url_parse(url, NULL, &(yrl->host), NULL, &(yrl->path), NULL, NULL);
g_free(url);
yrl->ucat = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_CATEGORY, _("User Rooms"), yrl->cat);
diff --git a/libpurple/proxy.c b/libpurple/proxy.c
--- a/libpurple/proxy.c
+++ b/libpurple/proxy.c
@@ -2278,7 +2278,7 @@ purple_proxy_get_setup(PurpleAccount *ac
/* http_proxy-format:
* export http_proxy="http://user:passwd@your.proxy.server:port/"
*/
- if(purple_url_parse(tmp, &proxyhost, &proxyport, NULL, &proxyuser, &proxypasswd)) {
+ if(purple_url_parse(tmp, NULL, &proxyhost, &proxyport, NULL, &proxyuser, &proxypasswd)) {
purple_proxy_info_set_host(gpi, proxyhost);
g_free(proxyhost);
diff --git a/libpurple/upnp.c b/libpurple/upnp.c
--- a/libpurple/upnp.c
+++ b/libpurple/upnp.c
@@ -438,7 +438,7 @@ purple_upnp_parse_description(const gcha
example description URL: http://192.168.1.1:5678/rootDesc.xml */
/* parse the url into address, port, path variables */
- if(!purple_url_parse(descriptionURL, &descriptionAddress,
+ if(!purple_url_parse(descriptionURL, NULL, &descriptionAddress,
&port, &descriptionXMLAddress, NULL, NULL)) {
return;
}
@@ -706,7 +706,7 @@ purple_upnp_generate_action_message_and_
int port = 0;
/* parse the url into address, port, path variables */
- if(!purple_url_parse(control_info.control_url, &addressOfControl,
+ if(!purple_url_parse(control_info.control_url, NULL, &addressOfControl,
&port, &pathOfControl, NULL, NULL)) {
purple_debug_error("upnp",
"generate_action_message_and_send(): Failed In Parse URL\n");
@@ -837,7 +837,7 @@ lookup_internal_ip()
gchar* addressOfControl;
int port = 0;
- if(!purple_url_parse(control_info.control_url, &addressOfControl, &port,
+ if(!purple_url_parse(control_info.control_url, NULL, &addressOfControl, &port,
NULL, NULL, NULL)) {
purple_debug_error("upnp",
"lookup_internal_ip(): Failed In Parse URL\n");
diff --git a/libpurple/util.c b/libpurple/util.c
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -3859,31 +3859,20 @@ void purple_got_protocol_handler_uri(con
g_hash_table_destroy(params);
}
-/*
- * TODO: Should probably add a "gboolean *ret_ishttps" parameter that
- * is set to TRUE if this URL is https, otherwise it is set to
- * FALSE. But that change will break the API.
- *
- * This is important for Yahoo! web messenger login. They now
- * force https login, and if you access the web messenger login
- * page via http then it redirects you to the https version, but
- * purple_util_fetch_url() ignores the "https" and attempts to
- * fetch the URL via http again, which gets redirected again.
- */
gboolean
-purple_url_parse(const char *url, char **ret_host, int *ret_port,
- char **ret_path, char **ret_user, char **ret_passwd)
+purple_url_parse(const char *url, char **ret_proto, char **ret_host,
+ int *ret_port, char **ret_path, char **ret_user, char **ret_passwd)
{
gboolean is_https = FALSE;
const char * scan_info;
char port_str[6];
int f;
- const char *at, *slash;
- const char *turl;
- char host[256], path[256], user[256], passwd[256];
+ const char *at, *slash, *colon;
+ char proto[256], host[256], path[256], user[256], passwd[256];
int port = 0;
/* hyphen at end includes it in control set */
+#define PROTO_CTRL "A-Za-z"
#define ADDR_CTRL "A-Za-z0-9.-"
#define PORT_CTRL "0-9"
#define PAGE_CTRL "A-Za-z0-9.,~_/:*!@&%%?=+^-"
@@ -3891,18 +3880,22 @@ purple_url_parse(const char *url, char *
#define PASSWD_CTRL "A-Za-z0-9.,~_/*!&%%?=+^-"
g_return_val_if_fail(url != NULL, FALSE);
-
- if ((turl = purple_strcasestr(url, "http://")) != NULL)
- {
- turl += 7;
- url = turl;
+ g_return_val_if_fail(strlen(url) >= 256, FALSE);
+
+ colon = strchr(url, ':');
+ if (colon) {
+ scan_info = "%255[" PROTO_CTRL "]:";
+ f = sscanf(url, scan_info, proto);
+
+ if (f == 1) {
+ url = colon + 1;
+ if (url[0] == '/') url++;
+ if (url[0] == '/') url++;
+ } else
+ proto[0] = '\0';
}
- else if ((turl = purple_strcasestr(url, "https://")) != NULL)
- {
- is_https = TRUE;
- turl += 8;
- url = turl;
- }
+
+ is_https = (g_ascii_strcasecmp(proto, "https") == 0);
/* parse out authentication information if supplied */
/* Only care about @ char BEFORE the first / */
@@ -3950,6 +3943,7 @@ purple_url_parse(const char *url, char *
sscanf(port_str, "%d", &port);
+ if (ret_proto != NULL) *ret_proto = g_strdup(proto);
if (ret_host != NULL) *ret_host = g_strdup(host);
if (ret_port != NULL) *ret_port = port;
if (ret_path != NULL) *ret_path = g_strdup(path);
diff --git a/libpurple/util.h b/libpurple/util.h
--- a/libpurple/util.h
+++ b/libpurple/util.h
@@ -1144,19 +1144,21 @@ char *purple_str_binary_to_ascii(const u
void purple_got_protocol_handler_uri(const char *uri);
/**
- * Parses a URL, returning its host, port, file path, username and password.
+ * Parses a URL, returning its protocol, host, port, file path, username and
+ * password.
*
* The returned data must be freed.
*
- * @param url The URL to parse.
- * @param ret_host The returned host.
- * @param ret_port The returned port.
- * @param ret_path The returned path.
More information about the Commits
mailing list