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).
51 lines
1.8 KiB
Python
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)
|
|
|
|
|