changeset 20416:4c5d68e93ef8

Handles SOAP redirects, thanks Sebasti«”n E. Peyrott
author Ka-Hing Cheung <khc@hxbc.us>
date Sat, 19 May 2007 22:48:25 +0000
parents 76e736b59aa4
children dc042f70bd8c
files COPYRIGHT libpurple/protocols/msn/soap.c
diffstat 2 files changed, 38 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Mon May 14 00:40:29 2007 +0000
+++ b/COPYRIGHT	Sat May 19 22:48:25 2007 +0000
@@ -260,6 +260,7 @@
 Ted Percival
 Eduardo PĆ©rez
 Matt Perry
+SebastiƔn E. Peyrott
 Celso Pinto
 Joao LuĆ­s Marques Pinto
 Aleksander Piotrowski
--- a/libpurple/protocols/msn/soap.c	Mon May 14 00:40:29 2007 +0000
+++ b/libpurple/protocols/msn/soap.c	Sat May 19 22:48:25 2007 +0000
@@ -302,6 +302,43 @@
 			PURPLE_SSL_DEFAULT_PORT, msn_soap_connect_cb,
 			msn_soap_error_cb, soapconn);
 	}
+	/* Another case of redirection, active on May, 2007
+	   See http://msnpiki.msnfanatic.com/index.php/MSNP13:SOAPTweener#Redirect
+	 */
+	else if (strstr(soapconn->read_buf,
+                    "<faultcode>psf:Redirect</faultcode>") != NULL)
+	{
+		char *location, *c;
+
+		location = strstr(soapconn->read_buf, "<psf:redirectUrl>");
+		/* Omit the tag preceding the URL */
+		location += strlen("<psf:redirectUrl>");
+		location = strstr(location, ":/");
+		if (location == NULL)
+		{
+			msn_soap_free_read_buf(soapconn);
+			return;
+		}
+
+		location += strlen("://"); /* Skip http:// or https:// */
+
+		if ( (c = strstr(location, "</psf:redirectUrl>")) != NULL )
+			*c = '\0';
+
+		if ( (c = strstr(location, "/")) != NULL )
+		{
+			g_free(soapconn->login_path);
+			soapconn->login_path = g_strdup(c);
+			*c = '\0';
+		}
+
+		g_free(soapconn->login_host);
+		soapconn->login_host = g_strdup(location);
+
+		purple_ssl_connect(session->account, soapconn->login_host,
+			PURPLE_SSL_DEFAULT_PORT, msn_soap_connect_cb,
+			msn_soap_error_cb, soapconn);
+	}
 	else if (strstr(soapconn->read_buf, "HTTP/1.1 401 Unauthorized") != NULL)
 	{
 		const char *error;