mirror of
https://gitea.osmocom.org/sim-card/pysim.git
synced 2026-03-23 22:08:34 +03:00
pySim.esim.http_json_api: 'header' is not always present in response
For example, the ES9+ handleNotification function is defined with an empty response body, so we cannot unconditionally assume that every HTTP response will contain a JSON "header" value. Change-Id: Ia3c5703b746c1eba91f85f8545f849a3f2d56e0b
This commit is contained in:
@@ -204,16 +204,17 @@ class JsonHttpApiFunction(abc.ABC):
|
|||||||
return output
|
return output
|
||||||
|
|
||||||
def decode(self, data: dict) -> dict:
|
def decode(self, data: dict) -> dict:
|
||||||
"""[further] Decode and validate the JSON-Dict of the respnse body."""
|
"""[further] Decode and validate the JSON-Dict of the response body."""
|
||||||
output = {}
|
output = {}
|
||||||
# let's first do the header, it's special
|
if 'header' in self.output_params:
|
||||||
if not 'header' in data:
|
# let's first do the header, it's special
|
||||||
raise ValueError('Mandatory output parameter "header" missing')
|
if not 'header' in data:
|
||||||
hdr_class = self.output_params.get('header')
|
raise ValueError('Mandatory output parameter "header" missing')
|
||||||
output['header'] = hdr_class.decode(data['header'])
|
hdr_class = self.output_params.get('header')
|
||||||
|
output['header'] = hdr_class.decode(data['header'])
|
||||||
|
|
||||||
if output['header']['functionExecutionStatus']['status'] not in ['Executed-Success','Executed-WithWarning']:
|
if output['header']['functionExecutionStatus']['status'] not in ['Executed-Success','Executed-WithWarning']:
|
||||||
raise ApiError(output['header']['functionExecutionStatus'])
|
raise ApiError(output['header']['functionExecutionStatus'])
|
||||||
# we can only expect mandatory parameters to be present in case of successful execution
|
# we can only expect mandatory parameters to be present in case of successful execution
|
||||||
for p in self.output_mandatory:
|
for p in self.output_mandatory:
|
||||||
if p == 'header':
|
if p == 'header':
|
||||||
@@ -229,7 +230,7 @@ class JsonHttpApiFunction(abc.ABC):
|
|||||||
output[p] = p_class.decode(v)
|
output[p] = p_class.decode(v)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def call(self, data: dict, func_call_id: Optional[str] = None, timeout=10) -> dict:
|
def call(self, data: dict, func_call_id: Optional[str] = None, timeout=10) -> Optional[dict]:
|
||||||
"""Make an API call to the HTTP API endpoint represented by this object.
|
"""Make an API call to the HTTP API endpoint represented by this object.
|
||||||
Input data is passed in `data` as json-serializable dict. Output data
|
Input data is passed in `data` as json-serializable dict. Output data
|
||||||
is returned as json-deserialized dict."""
|
is returned as json-deserialized dict."""
|
||||||
@@ -253,4 +254,6 @@ class JsonHttpApiFunction(abc.ABC):
|
|||||||
if not response.headers.get('X-Admin-Protocol', 'gsma/rsp/v2.unknown').startswith('gsma/rsp/v2.'):
|
if not response.headers.get('X-Admin-Protocol', 'gsma/rsp/v2.unknown').startswith('gsma/rsp/v2.'):
|
||||||
raise HttpHeaderError(response)
|
raise HttpHeaderError(response)
|
||||||
|
|
||||||
return self.decode(response.json())
|
if response.content:
|
||||||
|
return self.decode(response.json())
|
||||||
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user