summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--awsauth.py26
-rw-r--r--example.py46
2 files changed, 57 insertions, 15 deletions
diff --git a/awsauth.py b/awsauth.py
index f0b33a2..99d7077 100644
--- a/awsauth.py
+++ b/awsauth.py
@@ -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
-
diff --git a/example.py b/example.py
index b9f6a22..d37c53a 100644
--- a/example.py
+++ b/example.py
@@ -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()