make handle_request return callable

This simplifies code a bit.

Change-Id: I553174661f3a70e3d89fb2336832b25111052a0b
This commit is contained in:
MORITA Kazutaka 2014-04-07 09:17:19 +09:00
parent bb16da6aa2
commit a4a6d397dc

View File

@ -383,7 +383,7 @@ class ServiceController(WSGIContext):
env['HTTP_X_AUTH_TOKEN'] = token env['HTTP_X_AUTH_TOKEN'] = token
env['PATH_INFO'] = '/v1/%s' % account_name env['PATH_INFO'] = '/v1/%s' % account_name
def GET(self, env, start_response): def GET(self, env):
""" """
Handle GET Service request Handle GET Service request
""" """
@ -425,7 +425,7 @@ class BucketController(WSGIContext):
env['HTTP_X_AUTH_TOKEN'] = token env['HTTP_X_AUTH_TOKEN'] = token
env['PATH_INFO'] = '/v1/%s/%s' % (account_name, container_name) 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 Handle HEAD Bucket (Get Metadata) request
""" """
@ -445,7 +445,7 @@ class BucketController(WSGIContext):
return Response(status=status, headers=headers, app_iter=body_iter) 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 Handle GET Bucket (List Objects) request
""" """
@ -546,7 +546,7 @@ class BucketController(WSGIContext):
for i in objects[:max_keys] if 'subdir' in i]))) for i in objects[:max_keys] if 'subdir' in i])))
return Response(body=body, content_type='application/xml') return Response(body=body, content_type='application/xml')
def PUT(self, env, start_response): def PUT(self, env):
""" """
Handle PUT Bucket request Handle PUT Bucket request
""" """
@ -607,7 +607,7 @@ class BucketController(WSGIContext):
resp.status = HTTP_OK resp.status = HTTP_OK
return resp return resp
def DELETE(self, env, start_response): def DELETE(self, env):
""" """
Handle DELETE Bucket request Handle DELETE Bucket request
""" """
@ -682,7 +682,7 @@ class BucketController(WSGIContext):
body += '</DeleteResult>\r\n' body += '</DeleteResult>\r\n'
return Response(status=HTTP_OK, body=body) 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 Handle POST Bucket (Delete/Upload Multiple Objects) request
""" """
@ -718,7 +718,7 @@ class ObjectController(WSGIContext):
env['PATH_INFO'] = '/v1/%s/%s/%s' % (account_name, container_name, env['PATH_INFO'] = '/v1/%s/%s/%s' % (account_name, container_name,
object_name) object_name)
def GETorHEAD(self, env, start_response): def GETorHEAD(self, env):
if 'QUERY_STRING' in env: if 'QUERY_STRING' in env:
args = dict(urlparse.parse_qsl(env['QUERY_STRING'], 1)) args = dict(urlparse.parse_qsl(env['QUERY_STRING'], 1))
else: else:
@ -764,19 +764,19 @@ class ObjectController(WSGIContext):
else: else:
return get_err_response('InvalidURI') return get_err_response('InvalidURI')
def HEAD(self, env, start_response): def HEAD(self, env):
""" """
Handle HEAD Object request 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 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 Handle PUT Object and PUT Object (Copy) request
""" """
@ -819,10 +819,10 @@ class ObjectController(WSGIContext):
return Response(status=200, etag=self._response_header_value('etag')) 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') return get_err_response('AccessDenied')
def DELETE(self, env, start_response): def DELETE(self, env):
""" """
Handle DELETE Object request Handle DELETE Object request
""" """
@ -875,12 +875,13 @@ class Swift3Middleware(object):
def __call__(self, env, start_response): def __call__(self, env, start_response):
try: try:
return self.handle_request(env, start_response) resp = self.handle_request(env)
except Exception, e: except Exception, e:
self.logger.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) req = Request(env)
self.logger.debug('Calling Swift3 Middleware') self.logger.debug('Calling Swift3 Middleware')
self.logger.debug(req.__dict__) self.logger.debug(req.__dict__)
@ -891,28 +892,28 @@ class Swift3Middleware(object):
req.headers['Authorization'] = \ req.headers['Authorization'] = \
'AWS %(AWSAccessKeyId)s:%(Signature)s' % req.params 'AWS %(AWSAccessKeyId)s:%(Signature)s' % req.params
except KeyError: except KeyError:
return get_err_response('InvalidArgument')(env, start_response) return get_err_response('InvalidArgument')
if 'Authorization' not in req.headers: if 'Authorization' not in req.headers:
return self.app(env, start_response) return self.app
try: try:
keyword, info = req.headers['Authorization'].split(' ') keyword, info = req.headers['Authorization'].split(' ')
except Exception: except Exception:
return get_err_response('AccessDenied')(env, start_response) return get_err_response('AccessDenied')
if keyword != 'AWS': if keyword != 'AWS':
return get_err_response('AccessDenied')(env, start_response) return get_err_response('AccessDenied')
try: try:
account, signature = info.rsplit(':', 1) account, signature = info.rsplit(':', 1)
except Exception: except Exception:
return get_err_response('InvalidArgument')(env, start_response) return get_err_response('InvalidArgument')
try: try:
controller, path_parts = self.get_controller(env, req.path) controller, path_parts = self.get_controller(env, req.path)
except ValueError: except ValueError:
return get_err_response('InvalidURI')(env, start_response) return get_err_response('InvalidURI')
if 'Date' in req.headers: if 'Date' in req.headers:
date = email.utils.parsedate(req.headers['Date']) date = email.utils.parsedate(req.headers['Date'])
@ -923,7 +924,7 @@ class Swift3Middleware(object):
date = datetime.datetime.utcnow().timetuple() date = datetime.datetime.utcnow().timetuple()
elif date is None: 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) epoch = datetime.datetime(1970, 1, 1, 0, 0, 0, 0)
delta = datetime.timedelta(seconds=60 * 5) delta = datetime.timedelta(seconds=60 * 5)
@ -931,19 +932,17 @@ class Swift3Middleware(object):
d1 = datetime.datetime(*date[0:6]) d1 = datetime.datetime(*date[0:6])
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()
if d1 < epoch: 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 the standard date is too far ahead or behind, it is an error
if abs(d1 - now) > delta: if abs(d1 - now) > delta:
return get_err_response('RequestTimeTooSkewed')(env, return get_err_response('RequestTimeTooSkewed')
start_response)
# If there was an expiration date in the parameters, check it also # If there was an expiration date in the parameters, check it also
if expdate: if expdate:
ex = datetime.datetime(*expdate[0:6]) ex = datetime.datetime(*expdate[0:6])
if (now > ex and (now - ex) > delta): if (now > ex and (now - ex) > delta):
return get_err_response('RequestTimeTooSkewed')( return get_err_response('RequestTimeTooSkewed')
env, start_response)
token = base64.urlsafe_b64encode(canonical_string(req)) token = base64.urlsafe_b64encode(canonical_string(req))
@ -951,11 +950,11 @@ class Swift3Middleware(object):
**path_parts) **path_parts)
if hasattr(controller, req.method): if hasattr(controller, req.method):
res = getattr(controller, req.method)(env, start_response) res = getattr(controller, req.method)(env)
else: 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): def filter_factory(global_conf, **local_conf):