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:
Harald Welte
2024-07-15 16:58:17 +02:00
committed by laforge
parent 23dd13542e
commit 96e2a521e9

View File

@@ -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