Sophie

Sophie

distrib > Mageia > 1 > i586 > media > core-updates-src > by-pkgid > e8ad3dbb000bfa8cc3b22620f23891aa > files > 1

python-papyon-0.5.5-2.2.mga1.src.rpm

Index: papyon/service/description/Sharing/__init__.py
===================================================================
--- a/papyon/service/description/Sharing/__init__.py
+++ b/papyon/service/description/Sharing/__init__.py	2011-11-19 09:53:35.280602661 -0300
@@ -20,7 +20,7 @@
 name = "Sharing"
 description = "Membership address book service"
 
-url = "http://contacts.msn.com/abservice/SharingService.asmx"
+url = "https://omega.contacts.msn.com/abservice/SharingService.asmx"
 
 import FindMembership
 import AddMember
Index: papyon/service/description/AB/__init__.py
===================================================================
--- a/papyon/service/description/AB/__init__.py
+++ b/papyon/service/description/AB/__init__.py	2011-11-19 09:53:06.523602657 -0300
@@ -20,7 +20,7 @@
 name = "AB"
 description = "Hotmail address book service"
 
-url = "http://contacts.msn.com/abservice/abservice.asmx"
+url = "https://omega.contacts.msn.com/abservice/abservice.asmx"
 
 from constants import *
 
Index: papyon/gnet/protocol/HTTP.py
===================================================================
--- a/papyon/gnet/protocol/HTTP.py
+++ b/papyon/gnet/protocol/HTTP.py	2011-11-19 09:52:13.895602636 -0300
@@ -25,6 +25,8 @@
 from papyon.gnet.parser import HTTPParser
 from papyon.gnet.proxy.factory import ProxyFactory
 
+from urlparse import urlsplit
+
 import gobject
 import base64
 import logging
@@ -71,7 +73,10 @@
         self._transport = None
         self._http_parser = None
         self._outgoing_queue = []
+        self._redirected = False
         self._waiting_response = False
+        self._parser_handles = []
+        self._transport_handles = []
 
         if self._proxies and self._proxies.get('http', None):
             if self._proxies['http'].type == 'http':
@@ -100,23 +105,38 @@
 
     def _setup_parser(self):
         self._http_parser = HTTPParser(self._transport)
-        self._http_parser.connect("received", self._on_response_received)
-        self._transport.connect("notify::status", self._on_status_change)
-        self._transport.connect("error", self._on_error)
-        self._transport.connect("sent", self._on_request_sent)
+        self._parser_handles.append(self._http_parser.connect("received",
+            self._on_response_received))
+
+        self._transport_handles.append(self._transport.connect("notify::status",
+            self._on_status_change))
+        self._transport_handles.append(self._transport.connect("error",
+            self._on_error))
+        self._transport_handles.append(self._transport.connect("sent",
+            self._on_request_sent))
+
+    def _clean_transport(self):
+        if self._http_parser:
+            self._http_parser.disable()
+            for handle in self._parser_handles:
+                self._http_parser.disconnect(handle)
+            self._http_parser = None
+        if self._transport:
+            for handle in self._transport_handles:
+                self._transport.disconnect(handle)
 
     def _on_status_change(self, transport, param):
         if transport.get_property("status") == IoStatus.OPEN:
             self._process_queue()
         elif transport.get_property("status") == IoStatus.CLOSED and\
                 (self._waiting_response or len(self._outgoing_queue) > 0) and\
-                not self._errored:
+                not (self._errored or self._redirected):
             self._waiting_response = False
             self._setup_transport()
 
     def _on_request_sent(self, transport, request, length):
-        assert(str(self._outgoing_queue[0]) == request)
         self._waiting_response = True
+        assert(str(self._outgoing_queue[0]) == request)
         self.emit("request-sent", self._outgoing_queue[0])
 
     def _on_response_received(self, parser, response):
@@ -124,23 +144,30 @@
             return
         if not self._waiting_response:
             logger.warning("Received response but wasn't waiting for one")
+            logger.warning("<<< " + str(response))
             return
-        #if response.status in (301, 302): # UNTESTED: please test
-        #    location = response.headers['Location']
 
-        #    location = location.rsplit("://", 1)
-        #    if len(location) == 2:
-        #        scheme = location[0]
-        #        location = location[1]
-        #    if scheme == "http":
-        #        location = location.rsplit(":", 1)
-        #        self._host = location[0]
-        #        if len(location) == 2:
-        #            self._port = int(location[1])
-        #        self._outgoing_queue[0].headers['Host'] = response.headers['Location']
-        #        self._setup_transport()
-        #        return
         self._waiting_response = False
+
+        if response.status in (301, 302):
+            self.close()
+            location = response.headers['Location']
+            logger.info("Server moved to %s" % location)
+            logger.info("<<< " + str(response))
+
+            protocol, host, path, query, fragment = urlsplit(location)
+            self._redirected = True
+            self._outgoing_queue[0].headers['Host'] = host
+            try:
+                host, port = host.rsplit(":", 1)
+                port = int(port)
+            except:
+                port = None
+            self._host = host
+            self._redirected = False
+            self._setup_transport()
+            return
+
         if len(self._outgoing_queue) > 0:
             self._outgoing_queue.pop(0) # pop the request from the queue
         if response.status >= 400:
@@ -186,5 +213,7 @@
         self._process_queue()
 
     def close(self):
+        self._clean_transport()
         if self._transport:
             self._transport.close()
+        self._transport = None