Files
Hippolyzer/pyogp/lib/base/agentdomain.py
tao.takashi 99466026ce added workaround between Linden Lab's Agent Domain implementation which sends the seed cap in the Location: header of a Redirect instead inside LLSD as agent_seed_capability.
We now check if the result if a string, then it's the header or if it's an addinfourl object which can be read from and should contain LLSD (the normal behaviour of urllib2).
2008-07-14 18:44:04 +00:00

51 lines
1.8 KiB
Python

from agent import Agent
from interfaces import ICredentialSerializer
from caps import SeedCapability
import urllib2
from indra.base import llsd
# URL Opener for the agent domain login
#
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
#ignore the redirect, grabbing the seed cap url from the headers
# TODO: add logging and error handling
return headers['location']
# post to auth.cgi, ignoring the built in redirect
AgentDomainLoginOpener = urllib2.build_opener(RedirectHandler())
class AgentDomain(object):
"""an agent domain endpoint"""
def __init__(self,uri):
"""initialize the agent domain endpoint"""
self.uri = uri
def login(self, credentials):
"""login to the agent domain and return an agent object"""
serializer = ICredentialSerializer(credentials) # convert to string via adapter
payload = serializer.serialize()
headers = serializer.headers
# now create the request. We assume for now that self.uri is the login uri
# TODO: make this pluggable so we can use other transports like eventlet in the future
# TODO: add logging and error handling
#
request = urllib2.Request(self.uri,payload,headers)
res = AgentDomainLoginOpener.open(request)
if type(res)!=type(""):
seed_cap_url_data = res.read() # it might be an addinfourl object
seed_cap_url = llsd.parse(seed_cap_url_data)['agent_seed_capability']
else:
# this only happens in the Linden Lab Agent Domain with their redirect
seed_cap_url = res
self.seed_cap = SeedCapability('seed_cap', seed_cap_url)
return Agent(self)