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