mirror of
https://github.com/koush/scrypted.git
synced 2026-03-20 16:40:24 +00:00
server: do not serialize python nan in rpc protocol.
This causes protocol failure and plugin to be killed. Javascript behavior is to convert NaN to null. Mimicing this behavior ensures stability though all JSON dicts are recursively inspected.
This commit is contained in:
@@ -12,7 +12,23 @@ import multiprocessing.connection
|
||||
import rpc
|
||||
import concurrent.futures
|
||||
import json
|
||||
import math
|
||||
|
||||
def convert_nan_inf_to_none(obj):
|
||||
if isinstance(obj, dict):
|
||||
return {key: convert_nan_inf_to_none(value) for key, value in obj.items()}
|
||||
elif isinstance(obj, list):
|
||||
return [convert_nan_inf_to_none(item) for item in obj]
|
||||
elif isinstance(obj, float):
|
||||
if math.isnan(obj):
|
||||
return None
|
||||
if math.isinf(obj):
|
||||
return None
|
||||
return obj
|
||||
|
||||
def json_dumps_clean(obj, **kwargs):
|
||||
cleaned_obj = convert_nan_inf_to_none(obj)
|
||||
return json.dumps(cleaned_obj, **kwargs)
|
||||
|
||||
class BufferSerializer(rpc.RpcSerializer):
|
||||
def serialize(self, value, serializationContext):
|
||||
@@ -94,7 +110,7 @@ class RpcFileTransport(RpcTransport):
|
||||
reject(e)
|
||||
|
||||
def writeJSON(self, j, reject):
|
||||
return self.writeMessage(0, bytes(json.dumps(j), 'utf8'), reject)
|
||||
return self.writeMessage(0, bytes(json_dumps_clean(j), 'utf8'), reject)
|
||||
|
||||
def writeBuffer(self, buffer, reject):
|
||||
return self.writeMessage(1, buffer, reject)
|
||||
@@ -128,7 +144,7 @@ class RpcStreamTransport(RpcTransport):
|
||||
reject(e)
|
||||
|
||||
def writeJSON(self, j, reject):
|
||||
return self.writeMessage(0, bytes(json.dumps(j), 'utf8'), reject)
|
||||
return self.writeMessage(0, bytes(json_dumps_clean(j), 'utf8'), reject)
|
||||
|
||||
def writeBuffer(self, buffer, reject):
|
||||
return self.writeMessage(1, buffer, reject)
|
||||
|
||||
Reference in New Issue
Block a user