From f979f718cc254a1924a3e72ec610861b35485847 Mon Sep 17 00:00:00 2001 From: Yuval Levy Date: Sat, 10 May 2025 17:08:16 +0300 Subject: [PATCH 1/2] freeze all dependencies and handle cases with non json input --- app.py | 19 +++++++++++++++++-- requirements.txt | 25 +++++++++++++++++++++---- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index d857efe..9e01b4b 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,7 @@ import threading import time import subprocess +import json try: # Python 2.x from urlparse import urlparse @@ -111,7 +112,14 @@ def _execute(command: str): @app.route('/execute', methods=['POST']) def execute(): - req = request.get_json() + if request.is_json: + req = request.get_json() + else: + data = request.data + if isinstance(data, bytes): + data = data.decode('utf-8') + req = json.loads(data) + response, success = _execute(req['command']) return jsonify({ @@ -124,7 +132,14 @@ def execute(): def batch_execute(): all_succeeded = True responses = [] - req = request.get_json() + if request.is_json: + req = request.get_json() + else: + data = request.data + if isinstance(data, bytes): + data = data.decode('utf-8') + req = json.loads(data) + commands = req['commands'] for command in commands: response, success = _execute(command) diff --git a/requirements.txt b/requirements.txt index 071f255..3765fca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,21 @@ -flask -flask_redis -flask_redis_sentinel -flask_bootstrap +flask==3.0.3 +flask_redis==0.4.0 +flask_redis_sentinel==2.0.1 +flask_bootstrap==3.3.7.1 +async-timeout==4.0.3 +blinker==1.8.1 +click==8.1.7 +dominate==2.9.1 +importlib_metadata==7.1.0 +itsdangerous==2.2.0 +Jinja2==3.1.4 +MarkupSafe==2.1.5 +pip==23.0.1 +redis==5.0.4 +Redis-Sentinel-Url==1.0.1 +setuptools==57.5.0 +six==1.16.0 +visitor==0.1.3 +Werkzeug==3.0.3 +wheel==0.43.0 +zipp==3.18.1 From c28a883dd9098d297867edc707c6d5e7309ebe45 Mon Sep 17 00:00:00 2001 From: Yuval Levy Date: Sun, 11 May 2025 09:58:17 +0300 Subject: [PATCH 2/2] CR --- app.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/app.py b/app.py index 9e01b4b..0a943b7 100644 --- a/app.py +++ b/app.py @@ -89,6 +89,15 @@ def return_code(self): return self._return_code +def _get_request_json(): + if request.is_json: + return request.get_json() + data = request.data + if isinstance(data, bytes): + data = data.decode('utf-8') + return json.loads(data) + + def _execute(command: str): success = False try: @@ -112,13 +121,14 @@ def _execute(command: str): @app.route('/execute', methods=['POST']) def execute(): - if request.is_json: - req = request.get_json() - else: - data = request.data - if isinstance(data, bytes): - data = data.decode('utf-8') - req = json.loads(data) + try: + req = _get_request_json() + except Exception as err: + app.logger.exception("_get_request_json err") + return jsonify({ + 'response': 'Exception: %s' % str(err), + 'success': False + }) response, success = _execute(req['command']) @@ -132,13 +142,14 @@ def execute(): def batch_execute(): all_succeeded = True responses = [] - if request.is_json: - req = request.get_json() - else: - data = request.data - if isinstance(data, bytes): - data = data.decode('utf-8') - req = json.loads(data) + try: + req = _get_request_json() + except Exception as err: + app.logger.exception("_get_request_json err") + return jsonify({ + 'response': 'Exception: %s' % str(err), + 'success': False + }) commands = req['commands'] for command in commands: