| Index: third_party/boto/roboto/awsqueryservice.py
 | 
| diff --git a/third_party/boto/roboto/awsqueryservice.py b/third_party/boto/roboto/awsqueryservice.py
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..0ca78c2d7f9268733d59b7feaf237b14c3d21ed7
 | 
| --- /dev/null
 | 
| +++ b/third_party/boto/roboto/awsqueryservice.py
 | 
| @@ -0,0 +1,121 @@
 | 
| +import os
 | 
| +import urlparse
 | 
| +import boto
 | 
| +import boto.connection
 | 
| +import boto.jsonresponse
 | 
| +import boto.exception
 | 
| +import awsqueryrequest
 | 
| +
 | 
| +class NoCredentialsError(boto.exception.BotoClientError):
 | 
| +
 | 
| +    def __init__(self):
 | 
| +        s = 'Unable to find credentials'
 | 
| +        boto.exception.BotoClientError.__init__(self, s)
 | 
| +
 | 
| +class AWSQueryService(boto.connection.AWSQueryConnection):
 | 
| +
 | 
| +    Name = ''
 | 
| +    Description = ''
 | 
| +    APIVersion = ''
 | 
| +    Authentication = 'sign-v2'
 | 
| +    Path = '/'
 | 
| +    Port = 443
 | 
| +    Provider = 'aws'
 | 
| +    EnvURL = 'AWS_URL'
 | 
| +
 | 
| +    Regions = []
 | 
| +
 | 
| +    def __init__(self, **args):
 | 
| +        self.args = args
 | 
| +        self.check_for_credential_file()
 | 
| +        self.check_for_env_url()
 | 
| +        if 'host' not in self.args:
 | 
| +            if self.Regions:
 | 
| +                region_name = self.args.get('region_name',
 | 
| +                                            self.Regions[0]['name'])
 | 
| +                for region in self.Regions:
 | 
| +                    if region['name'] == region_name:
 | 
| +                        self.args['host'] = region['endpoint']
 | 
| +        if 'path' not in self.args:
 | 
| +            self.args['path'] = self.Path
 | 
| +        if 'port' not in self.args:
 | 
| +            self.args['port'] = self.Port
 | 
| +        try:
 | 
| +            boto.connection.AWSQueryConnection.__init__(self, **self.args)
 | 
| +            self.aws_response = None
 | 
| +        except boto.exception.NoAuthHandlerFound:
 | 
| +            raise NoCredentialsError()
 | 
| +
 | 
| +    def check_for_credential_file(self):
 | 
| +        """
 | 
| +        Checks for the existance of an AWS credential file.
 | 
| +        If the environment variable AWS_CREDENTIAL_FILE is
 | 
| +        set and points to a file, that file will be read and
 | 
| +        will be searched credentials.
 | 
| +        Note that if credentials have been explicitelypassed
 | 
| +        into the class constructor, those values always take
 | 
| +        precedence.
 | 
| +        """
 | 
| +        if 'AWS_CREDENTIAL_FILE' in os.environ:
 | 
| +            path = os.environ['AWS_CREDENTIAL_FILE']
 | 
| +            path = os.path.expanduser(path)
 | 
| +            path = os.path.expandvars(path)
 | 
| +            if os.path.isfile(path):
 | 
| +                fp = open(path)
 | 
| +                lines = fp.readlines()
 | 
| +                fp.close()
 | 
| +                for line in lines:
 | 
| +                    if line[0] != '#':
 | 
| +                        if '=' in line:
 | 
| +                            name, value = line.split('=', 1)
 | 
| +                            if name.strip() == 'AWSAccessKeyId':
 | 
| +                                if 'aws_access_key_id' not in self.args:
 | 
| +                                    value = value.strip()
 | 
| +                                    self.args['aws_access_key_id'] = value
 | 
| +                            elif name.strip() == 'AWSSecretKey':
 | 
| +                                if 'aws_secret_access_key' not in self.args:
 | 
| +                                    value = value.strip()
 | 
| +                                    self.args['aws_secret_access_key'] = value
 | 
| +            else:
 | 
| +                print 'Warning: unable to read AWS_CREDENTIAL_FILE'
 | 
| +
 | 
| +    def check_for_env_url(self):
 | 
| +        """
 | 
| +        First checks to see if a url argument was explicitly passed
 | 
| +        in.  If so, that will be used.  If not, it checks for the
 | 
| +        existence of the environment variable specified in ENV_URL.
 | 
| +        If this is set, it should contain a fully qualified URL to the
 | 
| +        service you want to use.
 | 
| +        Note that any values passed explicitly to the class constructor
 | 
| +        will take precedence.
 | 
| +        """
 | 
| +        url = self.args.get('url', None)
 | 
| +        if url:
 | 
| +            del self.args['url']
 | 
| +        if not url and self.EnvURL in os.environ:
 | 
| +            url = os.environ[self.EnvURL]
 | 
| +        if url:
 | 
| +            rslt = urlparse.urlparse(url)
 | 
| +            if 'is_secure' not in self.args:
 | 
| +                if rslt.scheme == 'https':
 | 
| +                    self.args['is_secure'] = True
 | 
| +                else:
 | 
| +                    self.args['is_secure'] = False
 | 
| +
 | 
| +            host = rslt.netloc
 | 
| +            port = None
 | 
| +            l = host.split(':')
 | 
| +            if len(l) > 1:
 | 
| +                host = l[0]
 | 
| +                port = int(l[1])
 | 
| +            if 'host' not in self.args:
 | 
| +                self.args['host'] = host
 | 
| +            if port and 'port' not in self.args:
 | 
| +                self.args['port'] = port
 | 
| +
 | 
| +            if rslt.path and 'path' not in self.args:
 | 
| +                self.args['path'] = rslt.path
 | 
| +            
 | 
| +    def _required_auth_capability(self):
 | 
| +        return [self.Authentication]
 | 
| +        
 | 
| 
 |