Implement handling of ill-formatted datetime values in URL.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Wed, 1 Aug 2018 21:07:03 +0000 (23:07 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Wed, 1 Aug 2018 21:07:03 +0000 (23:07 +0200)
web/seepark_web.py

index 4814d0fb22493f6381dfdbd79918aa31aaf3f66d..03d5760f5e3eb9eebb8d9af62d780864e78d6540 100644 (file)
@@ -5,7 +5,7 @@ import configparser
 import os
 import sys
 from collections import defaultdict
-from flask import Flask, render_template, jsonify, request
+from flask import Flask, render_template, jsonify, request, abort, Response
 import flask.json
 from flask_sqlalchemy import SQLAlchemy, inspect
 
@@ -140,9 +140,23 @@ def convert_to_c3(result):
     return c3result
 
 
+def request_arg(key, type, default=None):
+    """Returns the key from the request if available, otherwise the default value.
+    In case type is provided and the key is present, the value is converted by calling type.
+    In other words: Reimplement request.args.get but don't return default value if
+    type raises a ValueError."""
+    if key in request.args:
+        try:
+            return type(request.args[key])
+        except ValueError as e:
+            abort(Response(str(e), 400))
+    else:
+        return default
+
+
 def sensordata(sensor_id=None, sensor_type=None):
-    begin = request.args.get('begin', None, parse_datetime)
-    end = request.args.get('end', None, parse_datetime)
+    begin = request_arg('begin', parse_datetime)
+    end = request_arg('end', parse_datetime)
     mode = request.args.get('mode', 'full')
     format = request.args.get('format', 'default')
 
@@ -154,8 +168,8 @@ def sensordata(sensor_id=None, sensor_type=None):
 
 
 def openweathermapdata(cityid):
-    begin = request.args.get('begin', None, parse_datetime)
-    end = request.args.get('end', None, parse_datetime)
+    begin = request_arg('begin', parse_datetime)
+    end = request_arg('end', parse_datetime)
     mode = request.args.get('mode', 'full')
     format = request.args.get('format', 'default')