Prevent parsing floats as Infinity and -Infinity (#332)
* Prevent parsing floats as Infinity and -Infinity
* Improve error logging
diff --git a/provider/consumer.py b/provider/consumer.py
index d4863ce..f5088aa 100644
--- a/provider/consumer.py
+++ b/provider/consumer.py
@@ -485,12 +485,12 @@
if self.encodeValueAsJSON:
try:
- parsed = json.loads(value, parse_constant=self.__errorOnJSONConstant)
+ parsed = json.loads(value, parse_constant=self.__errorOnJSONConstant, parse_float=self.__parseFloat)
logging.debug('[{}] Successfully encoded a message as JSON.'.format(self.trigger))
return parsed
- except ValueError:
+ except ValueError as e:
# no big deal, just return the original value
- logging.warn('[{}] I was asked to encode a message as JSON, but I failed.'.format(self.trigger))
+ logging.warn('[{}] I was asked to encode a message as JSON, but I failed with "{}".'.format(self.trigger, e))
value = "\"{}\"".format(value)
pass
elif self.encodeValueAsBase64:
@@ -525,4 +525,15 @@
logging.info('[{}] Partition assignment has been revoked. Disconnected from broker(s)'.format(self.trigger))
def __errorOnJSONConstant(self, data):
- raise(ValueError('Invalid JSON detected.'))
+ raise(ValueError('Constant "{}" detected in JSON.'.format(data)))
+
+ def __parseFloat(self, data):
+ res = float(data)
+
+ if res == float('inf'):
+ raise(ValueError('Parsing float value "{}" would result in "Infinity".'.format(data)))
+
+ if res == float('-inf'):
+ raise(ValueError('Parsing float value "{}" would result in "-Infinity".'.format(data)))
+
+ return res