summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-01-13 18:09:44 +0200
committerLV-426 <lv-426@taproot.org.il>2015-01-13 18:09:44 +0200
commit1983d480c3f7d818926a38c3419aecc4b69a00fc (patch)
tree595e475155fb4f54aaa43b1df6fd9af764def5e7 /src/server
parent233d9de48df7e32701500177203b36c5b27c2a1e (diff)
wip: rz_req_handling.py
Diffstat (limited to 'src/server')
-rw-r--r--src/server/rz_api.py30
-rw-r--r--src/server/rz_api_rest.py42
-rw-r--r--src/server/rz_req_handling.py42
3 files changed, 65 insertions, 49 deletions
diff --git a/src/server/rz_api.py b/src/server/rz_api.py
index 2a2500bb..b3ac7ae1 100644
--- a/src/server/rz_api.py
+++ b/src/server/rz_api.py
@@ -22,26 +22,26 @@ import traceback
import crypt_util
import db_controller as dbc
-
+from db_op import DBO_add_node_set
+from db_op import DBO_diff_commit__topo
+from db_op import DBO_load_link_set
+from db_op import DBO_match_node_id_set
+from db_op import DBO_match_node_set_by_id_attribute
+from db_op import DBO_rz_clone
from model.graph import Topo_Diff
from model.model import Link
from rz_api_common import __sanitize_input
from rz_api_common import sanitize_input__topo_diff
-from rz_api_rest import __common_resp_handle
+from rz_api_rest import common_resp_handle
from rz_kernel import RZ_Kernel
-from db_op import DBO_match_node_set_by_id_attribute
-from db_op import DBO_match_node_id_set
-from db_op import DBO_load_link_set
-from db_op import DBO_rz_clone
-from db_op import DBO_diff_commit__topo
-from db_op import DBO_add_node_set
+from rz_req_handling import make_json_response
log = logging.getLogger('rhizi')
db_ctl = None # injected: DB controller
-def __common_exec(op, on_success=__common_resp_handle, on_error=__common_resp_handle):
+def __common_exec(op, on_success=common_resp_handle, on_error=common_resp_handle):
"""
@param on_success: should return a Flask Response object
@param on_error: should return a Flask Response object
@@ -78,10 +78,10 @@ def __load_node_set_by_id_attr_common(id_set):
op = DBO_match_node_set_by_id_attribute(id_set=id_set)
try:
n_set = db_ctl.exec_op(op)
- return __common_resp_handle(data=n_set)
+ return common_resp_handle(data=n_set)
except Exception as e:
log.exception(e)
- return __common_resp_handle(error='unable to load node with ids: {0}'.format(id_set))
+ return common_resp_handle(error='unable to load node with ids: {0}'.format(id_set))
def match_node_set_by_attr_filter_map(attr_filter_map):
"""
@@ -117,7 +117,7 @@ def rz_clone():
def on_success(topo_diff):
# serialize Topo_Diff before including in response
topo_diff_json = topo_diff.to_json_dict()
- return __common_resp_handle(topo_diff_json)
+ return common_resp_handle(topo_diff_json)
op = DBO_rz_clone()
return __common_exec(op, on_success=on_success)
@@ -180,18 +180,18 @@ def login():
u, p = sanitize_input(request)
except:
log.warn('failed to sanitize inputs. request: %s' % request)
- return render_template('login.html', login_failed=True)
+ return make_json_response(status=401) # return empty response
try:
crypt_util.validate_login(flask.current_app.rz_config, u, p)
except Exception as e:
# login failed
log.warn('login: unauthorized: user: %s' % (u))
- return render_template('login.html', login_failed=True)
+ return make_json_response(status=401) # return empty response
# login successful
session['username'] = u
log.debug('login: success: user: %s' % (u))
- return '{}';
+ return make_json_response(status=200) # return empty response
if request.method == 'GET':
return render_template('login.html')
diff --git a/src/server/rz_api_rest.py b/src/server/rz_api_rest.py
index bad0cfa7..03a83f3a 100644
--- a/src/server/rz_api_rest.py
+++ b/src/server/rz_api_rest.py
@@ -23,39 +23,13 @@ from model.graph import Topo_Diff
from rz_api_common import sanitize_input__attr_diff
from rz_api_common import sanitize_input__topo_diff
from rz_api_common import validate_obj__attr_diff
+from rz_req_handling import common_resp_handle
log = logging.getLogger('rhizi')
db_ctl = None # injected: DB controller
-def __response_wrap(data=None, error=None):
- """
- wrap response data/errors as dict - this should always be used when returning
- data to allow easy return of list objects, assist in error case distinction, etc.
- """
- return dict(data=data, error=error)
-
-def __common_resp_handle(data=None, error=None):
- """
- provide common response handling
-
- @data must be json serializable
- @error will be serialized with str()
- """
- if error is None:
- error_str = ""
- else:
- error_str = str(error) # convert any Exception objects to serializable form
- ret_data = __response_wrap(data, error_str)
- resp = jsonify(ret_data) # this will create a Flask Response object
-
- resp.headers['Access-Control-Allow-Origin'] = '*'
-
- # more response processing
-
- return resp
-
def diff_commit__topo():
"""
REST API wrapper around diff_commit__topo():
@@ -72,16 +46,16 @@ def diff_commit__topo():
try:
topo_diff = sanitize_input(request)
except Exception as e:
- return __common_resp_handle(error='malformed input')
+ return common_resp_handle(error='malformed input')
try:
kernel = flask.current_app.kernel
_, commit_ret = kernel.diff_commit__topo(topo_diff)
- return __common_resp_handle(data=commit_ret)
+ return common_resp_handle(data=commit_ret)
except Exception as e:
log.error(e.message)
log.error(traceback.print_exc())
- return __common_resp_handle(error=e)
+ return common_resp_handle(error=e)
def diff_commit__attr():
"""
@@ -96,22 +70,22 @@ def diff_commit__attr():
def on_error(e):
# handle DB ERRORS, eg. name attr change error
- return __common_resp_handle(error='error occurred')
+ return common_resp_handle(error='error occurred')
try:
attr_diff = sanitize_input(request)
validate_obj__attr_diff(attr_diff)
except Exception as e:
- return __common_resp_handle(error='malformed input')
+ return common_resp_handle(error='malformed input')
try:
kernel = flask.current_app.kernel
_, commit_ret = kernel.diff_commit__attr(attr_diff)
- return __common_resp_handle(data=commit_ret)
+ return common_resp_handle(data=commit_ret)
except Exception as e:
log.error(e.message)
log.error(traceback.print_exc())
- return __common_resp_handle(error=e)
+ return common_resp_handle(error=e)
def diff_commit__vis():
pass
diff --git a/src/server/rz_req_handling.py b/src/server/rz_req_handling.py
new file mode 100644
index 00000000..f0999e3e
--- /dev/null
+++ b/src/server/rz_req_handling.py
@@ -0,0 +1,42 @@
+from flask import jsonify
+from flask import make_response
+
+def make_json_response(status=200, data='{}'):
+ """
+ Construct a json response with proper content-type header
+ """
+ resp = make_response(data)
+ resp.headers['Content-Type'] = "application/json"
+ resp.status = status
+ return resp
+
+def common_resp_handle(data=None, error=None):
+ """
+ common response handling:
+ - add common response headers
+ - serialize response
+
+ @data must be json serializable
+ @error will be serialized with str()
+ """
+
+ def __response_wrap(data=None, error=None):
+ """
+ wrap response data/errors as dict - this should always be used when returning
+ data to allow easy return of list objects, assist in error case distinction, etc.
+ """
+ return dict(data=data, error=error)
+
+ if error is None:
+ error_str = ""
+ else:
+ error_str = str(error) # convert any Exception objects to serializable form
+
+ ret_data = __response_wrap(data, error_str)
+ resp = jsonify(ret_data) # this will create a Flask Response object
+
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+
+ # more response processing
+
+ return resp