diff roundup/rest.py @ 8218:32aaf5dc562b

fix(REST): issue2551383; improve errors for bad json, fix PUT docs While adding fuzz testing for email addresses via REST /rest/data/user/1/address, I had an error when setting the address to the same value it currently had. Traced this to a bug in userauditor.py. Fixed the bug. Documented in upgrading.txt. While trying to track down issue, I realized invalid json was being accepted without error. So I fixed the code that parses the json and have it return an error. Also modified some tests that broke (used invalid json, or passed body (e.g. DELETE) but shouldn't have. Add tests for bad json to verify new code. Fixed test that wasn't initializing the body_file in each loop, so the test wasn't actually supplying a body. Also realised PUT documentation was not correct. Output format isn't quite like GET. Fuss tests for email address also added.
author John Rouillard <rouilj@ieee.org>
date Tue, 17 Dec 2024 19:42:46 -0500
parents 14e92a595828
children 818751637b77
line wrap: on
line diff
--- a/roundup/rest.py	Mon Dec 16 21:29:07 2024 -0500
+++ b/roundup/rest.py	Tue Dec 17 19:42:46 2024 -0500
@@ -2729,17 +2729,27 @@
 
     '''
     def __init__(self, json_string):
-        ''' Parse the json string into an internal dict. '''
+        '''Parse the json string into an internal dict.
+
+            Because spec for rest post once exactly (POE) shows
+            posting empty content. An empty string results in an empty
+            dict, not a json parse error.
+        '''
         def raise_error_on_constant(x):
             raise ValueError("Unacceptable number: %s" % x)
+        if json_string == "":
+            self.json_dict = {}
+            self.value = None
+            return
+
         try:
             self.json_dict = json.loads(json_string,
                                     parse_constant=raise_error_on_constant)
             self.value = [self.FsValue(index, self.json_dict[index])
                           for index in self.json_dict]
-        except ValueError:
-            self.json_dict = {}
-            self.value = None
+        except (json.decoder.JSONDecodeError, ValueError) as e:
+            raise ValueError(e.args[0] + ". JSON is: " + json_string)
+
 
     class FsValue:
         '''Class that does nothing but response to a .value property '''

Roundup Issue Tracker: http://roundup-tracker.org/