Skip to content

Commit

Permalink
make handle_request return callable
Browse files Browse the repository at this point in the history
This simplifies code a bit.

Change-Id: I553174661f3a70e3d89fb2336832b25111052a0b
  • Loading branch information
kazum committed Apr 7, 2014
1 parent bb16da6 commit a4a6d39
Showing 1 changed file with 31 additions and 32 deletions.
63 changes: 31 additions & 32 deletions swift3/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ def __init__(self, env, app, account_name, token, **kwargs):
env['HTTP_X_AUTH_TOKEN'] = token
env['PATH_INFO'] = '/v1/%s' % account_name

def GET(self, env, start_response):
def GET(self, env):
"""
Handle GET Service request
"""
Expand Down Expand Up @@ -425,7 +425,7 @@ def __init__(self, env, app, account_name, token, container_name,
env['HTTP_X_AUTH_TOKEN'] = token
env['PATH_INFO'] = '/v1/%s/%s' % (account_name, container_name)

def HEAD(self, env, start_response):
def HEAD(self, env):
"""
Handle HEAD Bucket (Get Metadata) request
"""
Expand All @@ -445,7 +445,7 @@ def HEAD(self, env, start_response):

return Response(status=status, headers=headers, app_iter=body_iter)

def GET(self, env, start_response):
def GET(self, env):
"""
Handle GET Bucket (List Objects) request
"""
Expand Down Expand Up @@ -546,7 +546,7 @@ def GET(self, env, start_response):
for i in objects[:max_keys] if 'subdir' in i])))
return Response(body=body, content_type='application/xml')

def PUT(self, env, start_response):
def PUT(self, env):
"""
Handle PUT Bucket request
"""
Expand Down Expand Up @@ -607,7 +607,7 @@ def PUT(self, env, start_response):
resp.status = HTTP_OK
return resp

def DELETE(self, env, start_response):
def DELETE(self, env):
"""
Handle DELETE Bucket request
"""
Expand Down Expand Up @@ -682,7 +682,7 @@ def _get_err_elem(key, err_code, message):
body += '</DeleteResult>\r\n'
return Response(status=HTTP_OK, body=body)

def POST(self, env, start_response):
def POST(self, env):
"""
Handle POST Bucket (Delete/Upload Multiple Objects) request
"""
Expand Down Expand Up @@ -718,7 +718,7 @@ def __init__(self, env, app, account_name, token, container_name,
env['PATH_INFO'] = '/v1/%s/%s/%s' % (account_name, container_name,
object_name)

def GETorHEAD(self, env, start_response):
def GETorHEAD(self, env):
if 'QUERY_STRING' in env:
args = dict(urlparse.parse_qsl(env['QUERY_STRING'], 1))
else:
Expand Down Expand Up @@ -764,19 +764,19 @@ def GETorHEAD(self, env, start_response):
else:
return get_err_response('InvalidURI')

def HEAD(self, env, start_response):
def HEAD(self, env):
"""
Handle HEAD Object request
"""
return self.GETorHEAD(env, start_response)
return self.GETorHEAD(env)

def GET(self, env, start_response):
def GET(self, env):
"""
Handle GET Object request
"""
return self.GETorHEAD(env, start_response)
return self.GETorHEAD(env)

def PUT(self, env, start_response):
def PUT(self, env):
"""
Handle PUT Object and PUT Object (Copy) request
"""
Expand Down Expand Up @@ -819,10 +819,10 @@ def PUT(self, env, start_response):

return Response(status=200, etag=self._response_header_value('etag'))

def POST(self, env, start_response):
def POST(self, env):
return get_err_response('AccessDenied')

def DELETE(self, env, start_response):
def DELETE(self, env):
"""
Handle DELETE Object request
"""
Expand Down Expand Up @@ -875,12 +875,13 @@ def get_controller(self, env, path):

def __call__(self, env, start_response):
try:
return self.handle_request(env, start_response)
resp = self.handle_request(env)
except Exception, e:
self.logger.exception(e)
return get_err_response('ServiceUnavailable')(env, start_response)
resp = get_err_response('ServiceUnavailable')
return resp(env, start_response)

def handle_request(self, env, start_response):
def handle_request(self, env):
req = Request(env)
self.logger.debug('Calling Swift3 Middleware')
self.logger.debug(req.__dict__)
Expand All @@ -891,28 +892,28 @@ def handle_request(self, env, start_response):
req.headers['Authorization'] = \
'AWS %(AWSAccessKeyId)s:%(Signature)s' % req.params
except KeyError:
return get_err_response('InvalidArgument')(env, start_response)
return get_err_response('InvalidArgument')

if 'Authorization' not in req.headers:
return self.app(env, start_response)
return self.app

try:
keyword, info = req.headers['Authorization'].split(' ')
except Exception:
return get_err_response('AccessDenied')(env, start_response)
return get_err_response('AccessDenied')

if keyword != 'AWS':
return get_err_response('AccessDenied')(env, start_response)
return get_err_response('AccessDenied')

try:
account, signature = info.rsplit(':', 1)
except Exception:
return get_err_response('InvalidArgument')(env, start_response)
return get_err_response('InvalidArgument')

try:
controller, path_parts = self.get_controller(env, req.path)
except ValueError:
return get_err_response('InvalidURI')(env, start_response)
return get_err_response('InvalidURI')

if 'Date' in req.headers:
date = email.utils.parsedate(req.headers['Date'])
Expand All @@ -923,39 +924,37 @@ def handle_request(self, env, start_response):

date = datetime.datetime.utcnow().timetuple()
elif date is None:
return get_err_response('AccessDenied')(env, start_response)
return get_err_response('AccessDenied')

epoch = datetime.datetime(1970, 1, 1, 0, 0, 0, 0)
delta = datetime.timedelta(seconds=60 * 5)

d1 = datetime.datetime(*date[0:6])
now = datetime.datetime.utcnow()
if d1 < epoch:
return get_err_response('AccessDenied')(env, start_response)
return get_err_response('AccessDenied')

# If the standard date is too far ahead or behind, it is an error
if abs(d1 - now) > delta:
return get_err_response('RequestTimeTooSkewed')(env,
start_response)
return get_err_response('RequestTimeTooSkewed')

# If there was an expiration date in the parameters, check it also
if expdate:
ex = datetime.datetime(*expdate[0:6])
if (now > ex and (now - ex) > delta):
return get_err_response('RequestTimeTooSkewed')(
env, start_response)
return get_err_response('RequestTimeTooSkewed')

token = base64.urlsafe_b64encode(canonical_string(req))

controller = controller(env, self.app, account, token, conf=self.conf,
**path_parts)

if hasattr(controller, req.method):
res = getattr(controller, req.method)(env, start_response)
res = getattr(controller, req.method)(env)
else:
return get_err_response('MethodNotAllowed')(env, start_response)
return get_err_response('MethodNotAllowed')

return res(env, start_response)
return res


def filter_factory(global_conf, **local_conf):
Expand Down

0 comments on commit a4a6d39

Please sign in to comment.