diff options
-rw-r--r-- | awsauth.py | 26 | ||||
-rw-r--r-- | example.py | 46 |
2 files changed, 57 insertions, 15 deletions
@@ -5,7 +5,9 @@ import hmac import urllib from hashlib import sha1 as sha -from urlparse import urlparse + +from urlparse import urlparse, urlunparse + from email.utils import formatdate from requests.auth import AuthBase @@ -23,11 +25,11 @@ class S3Auth(AuthBase): 'response-expires', 'response-cache-control', 'delete', 'lifecycle', 'response-content-disposition', 'response-content-encoding' ] - + def __init__(self, access_key, secret_key, service_url=None): if service_url: - self.service_base_url = service_url + self.service_base_url = service_url self.access_key = str(access_key) self.secret_key = str(secret_key) @@ -44,6 +46,13 @@ class S3Auth(AuthBase): return base64.encodestring(h.digest()).strip() def get_canonical_string(self, r): + # r.url needs to be encoded as well + r_url = urlparse(r.url) + # what is a man to do? + parsedurl = list(r_url) + parsedurl[2] = urllib.quote_plus(parsedurl[2][1:]) # path includes the leading slash, which should not be part of the %-encoded string + r.url = urlunparse(parsedurl) + parsedurl = urlparse(r.url) objectkey = parsedurl.path[1:] query_args = parsedurl.query.split('&') @@ -51,10 +60,18 @@ class S3Auth(AuthBase): #Sort alphabetical query_args.sort() + ''' bucket = parsedurl.netloc[:-len(self.service_base_url)] if len(bucket) > 1: # remove last dot bucket = bucket[:-1] + ''' + # stolen from https://github.com/kennethreitz/python-requests-aws/blob/master/awsauth.py + bucket = '' + netloc_split = parsedurl.netloc.split('.') + if ((len(netloc_split) == 4) or + (len(netloc_split) == 3 and netloc_split[0].lower() != 's3')): + bucket = netloc_split[0] interesting_headers = {} ok_keys = ['content-md5', 'content-type', 'date'] @@ -93,7 +110,7 @@ class S3Auth(AuthBase): buf += '/%s' % bucket # add the objectkey. even if it doesn't exist, add the slash - buf += '/%s' % urllib.quote(objectkey) + buf += '/%s' % objectkey params_found = False @@ -110,4 +127,3 @@ class S3Auth(AuthBase): params_found = True return buf - @@ -1,16 +1,42 @@ +#!/usr/bin/env python + import requests + from awsauth import S3Auth -ACCESS_KEY = 'ACCESSKEYXXXXXXXXXXXX'
-SECRET_KEY = 'AWSSECRETKEYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' +import StringIO + +import gzip + +import urllib + +ACCESS_KEY = "ACCESSKEYXXXXXXXXXXXX" +SECRET_KEY = "AWSSECRETKEYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + +acceptableAccessCodes = (200, 204) # # https://forums.aws.amazon.com/thread.jspa?threadID=28799: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectDELETE.html + +if __name__ == '__main__': + + confirmIt = u'Sam is sweet' # Data needs to be in unicode, or it will fail + + bucketName = 'mybucket' + objectName = ['myfile.txt', 'my+file.txt'] + + for o in objectName: + # Creating a file + r = requests.put(('http://%s.s3.amazonaws.com/%s' % (bucketName, o)), data=confirmIt, auth=S3Auth(ACCESS_KEY, SECRET_KEY)) + if r.status_code not in acceptableAccessCodes: + r.raise_for_status() -# Creating a file -r = requests.put('http://mybucket.s3.amazonaws.com/myfile.txt', data='Sam is sweet', auth=S3Auth(ACCESS_KEY, SECRET_KEY)) + # Downloading a file + r = requests.get(('http://%s.s3.amazonaws.com/%s' % (bucketName, o)), auth=S3Auth(ACCESS_KEY, SECRET_KEY)) + if r.status_code not in acceptableAccessCodes: + r.raise_for_status() -# Downloading a file -r = requests.get('http://mybucket.s3.amazonaws.com/myfile.txt', auth=S3Auth(ACCESS_KEY, SECRET_KEY)) -if r.content == 'Sam is sweet': - print 'Hala Madrid!' + if r.content == confirmIt: + print 'Hala Madrid!' -# Removing a file -r = requests.delete('http://mybucket.s3.amazonaws.com/myfile.txt', auth=S3Auth(ACCESS_KEY, SECRET_KEY))
\ No newline at end of file + # Removing a file + r = requests.delete(('http://%s.s3.amazonaws.com/%s' % (bucketName, o)), auth=S3Auth(ACCESS_KEY, SECRET_KEY)) + if r.status_code not in acceptableAccessCodes: + r.raise_for_status() |