summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk>2011-11-08 11:56:02 -0500
committerLouis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk>2011-11-08 15:08:54 -0500
commitd2cd1fd379978ff095150dafb2e99bef7327acf2 (patch)
treefbba9b8a324602a22a71ab835154e9481367d327
parentef525ba9fd85109e019e48847146e558742db5b5 (diff)
bugfix: use the right server for AB and Sharing services and allow HTTP redirection (fdo #42689)
-rw-r--r--papyon/gnet/parser.py1
-rw-r--r--papyon/gnet/protocol/HTTP.py72
-rw-r--r--papyon/service/description/AB/__init__.py2
-rw-r--r--papyon/service/description/Sharing/__init__.py2
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