json middleware
This commit is contained in:
parent
22d2412627
commit
6d5ae74495
2 changed files with 84 additions and 15 deletions
|
@ -53,6 +53,7 @@ def setencpasswd(clientemail, newpass):
|
||||||
query = clientsdb[c_id]['email']
|
query = clientsdb[c_id]['email']
|
||||||
#ioconfig.logger.info('client[{}]> path={}'.format(c_id, str(path)))
|
#ioconfig.logger.info('client[{}]> path={}'.format(c_id, str(path)))
|
||||||
except:
|
except:
|
||||||
|
ioconfig.logger.critical('clients> client {} not found'.format(clientemail))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if query != clientemail:
|
if query != clientemail:
|
||||||
|
@ -122,7 +123,7 @@ def vmowner(vmid, vmname, verbose):
|
||||||
clientid = '0' #unknown owner
|
clientid = '0' #unknown owner
|
||||||
clientname = 'unknown'
|
clientname = 'unknown'
|
||||||
if verbose:
|
if verbose:
|
||||||
ioconfig.logger.info('client[{}]> {} is the owner of {} ({})'.fotmat(str(clientid), clientname, str(vmid), vmname))
|
ioconfig.logger.info('client[{}]> {} is the owner of {} ({})'.format(str(clientid), clientname, str(vmid), vmname))
|
||||||
return clientid
|
return clientid
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,5 +148,5 @@ def writeclientsdb(clientsdb):
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
#setencpasswd('abc@xyz.com', 'todos')
|
setencpasswd('abc@xyz.com', 'todos')
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,65 @@ def welcome():
|
||||||
logger.info('###################################')
|
logger.info('###################################')
|
||||||
|
|
||||||
|
|
||||||
|
class RequireJSON(object):
|
||||||
|
def process_request(self, req, resp):
|
||||||
|
if not req.client_accepts_json:
|
||||||
|
raise falcon.HTTPNotAcceptable(
|
||||||
|
'This API only supports responses encoded as JSON.',
|
||||||
|
href='http://docs.examples.com/api/json')
|
||||||
|
|
||||||
|
if req.method in ('POST', 'PUT'):
|
||||||
|
if 'application/json' not in req.content_type:
|
||||||
|
raise falcon.HTTPUnsupportedMediaType(
|
||||||
|
'This API only supports requests encoded as JSON.',
|
||||||
|
href='http://docs.examples.com/api/json')
|
||||||
|
|
||||||
|
|
||||||
|
class JSONTranslator(object):
|
||||||
|
def process_request(self, req, resp):
|
||||||
|
# req.stream corresponds to the WSGI wsgi.input environ variable,
|
||||||
|
# and allows you to read bytes from the request body.
|
||||||
|
#
|
||||||
|
# See also: PEP 3333
|
||||||
|
if req.content_length in (None, 0):
|
||||||
|
# Nothing to do
|
||||||
|
return
|
||||||
|
|
||||||
|
body = req.stream.read()
|
||||||
|
if not body:
|
||||||
|
raise falcon.HTTPBadRequest('Empty request body',
|
||||||
|
'A valid JSON document is required.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
req.context['doc'] = json.loads(body.decode('utf-8'))
|
||||||
|
|
||||||
|
except (ValueError, UnicodeDecodeError):
|
||||||
|
raise falcon.HTTPError(falcon.HTTP_753,
|
||||||
|
'Malformed JSON',
|
||||||
|
'Could not decode the request body. The '
|
||||||
|
'JSON was incorrect or not encoded as '
|
||||||
|
'UTF-8.')
|
||||||
|
|
||||||
|
def process_response(self, req, resp, resource):
|
||||||
|
if 'result' not in req.context:
|
||||||
|
return
|
||||||
|
|
||||||
|
resp.body = json.dumps(req.context['result'])
|
||||||
|
|
||||||
|
|
||||||
|
def max_body(limit):
|
||||||
|
def hook(req, resp, resource, params):
|
||||||
|
length = req.content_length
|
||||||
|
if length is not None and length > limit:
|
||||||
|
msg = ('The size of the request is too large. The body must not '
|
||||||
|
'exceed ' + str(limit) + ' bytes in length.')
|
||||||
|
|
||||||
|
raise falcon.HTTPRequestEntityTooLarge(
|
||||||
|
'Request body is too large', msg)
|
||||||
|
|
||||||
|
return hook
|
||||||
|
|
||||||
|
|
||||||
def apicheck(params):
|
def apicheck(params):
|
||||||
""" compares request params for api key with the config file"""
|
""" compares request params for api key with the config file"""
|
||||||
try:
|
try:
|
||||||
|
@ -47,21 +106,27 @@ def apicheck(params):
|
||||||
|
|
||||||
|
|
||||||
#API methods
|
#API methods
|
||||||
class Validate(object):
|
class ValidateResource(object):
|
||||||
|
|
||||||
|
@falcon.before(max_body(64 * 1024))
|
||||||
def on_post(self, req, resp):
|
def on_post(self, req, resp):
|
||||||
""" get clientemail and password and compare it with the client db and returns a list of managed object IDs """
|
""" get clientemail and password and compare it with the client db and returns a list of managed object IDs """
|
||||||
clientemail = req.params['clientemail']
|
resp.status = falcon.HTTP_200
|
||||||
passwd = req.params['password']
|
clientemail = req.context['doc']['clientemail']
|
||||||
|
passwd = req.context['doc']['password']
|
||||||
logger.info('grid> access requested for {} with {}'.format(clientemail, passwd))
|
logger.info('grid> access requested for {} with {}'.format(clientemail, passwd))
|
||||||
#apicheck_stat, apicheck_resp = apicheck(req.params)
|
#apicheck_stat, apicheck_resp = apicheck(req.params)
|
||||||
response = clientsdb.validate(clientemail, passwd)
|
response = clientsdb.validate(clientemail, passwd)
|
||||||
if response is not None:
|
print(response)
|
||||||
resp.status = falcon.HTTP_200
|
req.context['result'] = response
|
||||||
resp.body = response
|
#if response is not None:
|
||||||
else:
|
# resp.status = falcon.HTTP_200
|
||||||
resp.status = falcon.HTTP_403
|
# resp.body = response
|
||||||
resp.body = 'ERR'
|
#else:
|
||||||
|
# resp.status = falcon.HTTP_403
|
||||||
|
# resp.body = 'ERR'
|
||||||
|
#return response
|
||||||
|
|
||||||
|
|
||||||
class ClusterResource(object):
|
class ClusterResource(object):
|
||||||
def on_get(self, req, resp):
|
def on_get(self, req, resp):
|
||||||
|
@ -257,7 +322,10 @@ if __name__ == '__main__':
|
||||||
sys.exit("invoke proxmaster via uwsgi. thanks. bye. o/")
|
sys.exit("invoke proxmaster via uwsgi. thanks. bye. o/")
|
||||||
|
|
||||||
#setup routes
|
#setup routes
|
||||||
wsgi_app = api = application = falcon.API()
|
wsgi_app = api = application = falcon.API(middleware=[
|
||||||
|
RequireJSON(),
|
||||||
|
JSONTranslator(),
|
||||||
|
])
|
||||||
|
|
||||||
#display motd
|
#display motd
|
||||||
welcome()
|
welcome()
|
||||||
|
@ -265,8 +333,8 @@ welcome()
|
||||||
#grid.sync()
|
#grid.sync()
|
||||||
|
|
||||||
# setup routes
|
# setup routes
|
||||||
res_validate = Validate()
|
res_validate = ValidateResource()
|
||||||
api.add_route('/instance/auth', res_validate)
|
api.add_route('/validate', res_validate)
|
||||||
|
|
||||||
res_cluster = ClusterResource()
|
res_cluster = ClusterResource()
|
||||||
api.add_route('/instance', res_cluster)
|
api.add_route('/instance', res_cluster)
|
||||||
|
|
Loading…
Reference in a new issue