diff options
author | Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> | 2011-11-08 11:56:02 -0500 |
---|---|---|
committer | Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> | 2011-11-08 15:08:54 -0500 |
commit | d2cd1fd379978ff095150dafb2e99bef7327acf2 (patch) | |
tree | fbba9b8a324602a22a71ab835154e9481367d327 | |
parent | ef525ba9fd85109e019e48847146e558742db5b5 (diff) |
bugfix: use the right server for AB and Sharing services and allow HTTP redirection (fdo #42689)
-rw-r--r-- | papyon/gnet/parser.py | 1 | ||||
-rw-r--r-- | papyon/gnet/protocol/HTTP.py | 72 | ||||
-rw-r--r-- | papyon/service/description/AB/__init__.py | 2 | ||||
-rw-r--r-- | papyon/service/description/Sharing/__init__.py | 2 |
4 files changed, 53 insertions, 24 deletions
diff --git a/papyon/gnet/parser.py b/papyon/gnet/parser.py index 1f6c199..82c1daa 100644 --- a/papyon/gnet/parser.py +++ b/papyon/gnet/parser.py @@ -212,4 +212,3 @@ class HTTPParser(AbstractParser): response.parse(self._receive_buffer) self.emit("received", response) self._reset_state() - diff --git a/papyon/gnet/protocol/HTTP.py b/papyon/gnet/protocol/HTTP.py index 0628d34..3efe909 100644 --- a/papyon/gnet/protocol/HTTP.py +++ b/papyon/gnet/protocol/HTTP.py @@ -25,6 +25,8 @@ from papyon.gnet.io import TCPClient 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 @@ class HTTP(gobject.GObject): 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,17 +105,32 @@ class HTTP(gobject.GObject): 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() @@ -123,24 +143,32 @@ class HTTP(gobject.GObject): if response.status >= 100 and response.status < 200: return if not self._waiting_response: - logger.warning("Received response but wasn't waiting for one") + logger.warning("Received response but wasn't waiting for one %s" % (parser)) + logger.warning(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.warning(response) + + protocol, host, path, query, fragment = urlsplit(location) + if protocol == "http": + 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 +214,7 @@ class HTTP(gobject.GObject): self._process_queue() def close(self): + self._clean_transport() if self._transport: self._transport.close() + self._transport = None diff --git a/papyon/service/description/AB/__init__.py b/papyon/service/description/AB/__init__.py index 48af7e2..9015064 100644 --- a/papyon/service/description/AB/__init__.py +++ b/papyon/service/description/AB/__init__.py @@ -20,7 +20,7 @@ name = "AB" description = "Hotmail address book service" -url = "http://contacts.msn.com/abservice/abservice.asmx" +url = "http://byrdr.omega.contacts.msn.com/abservice/abservice.asmx" from constants import * diff --git a/papyon/service/description/Sharing/__init__.py b/papyon/service/description/Sharing/__init__.py index 20423c9..10dde65 100644 --- a/papyon/service/description/Sharing/__init__.py +++ b/papyon/service/description/Sharing/__init__.py @@ -20,7 +20,7 @@ name = "Sharing" description = "Membership address book service" -url = "http://contacts.msn.com/abservice/SharingService.asmx" +url = "http://byrdr.omega.contacts.msn.com/abservice/SharingService.asmx" import FindMembership import AddMember |