laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37496?usp=email )
Change subject: pySim.esim.http_json_api: 'header' is not always present in response ......................................................................
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 --- M pySim/esim/http_json_api.py 1 file changed, 26 insertions(+), 10 deletions(-)
Approvals: dexter: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve
diff --git a/pySim/esim/http_json_api.py b/pySim/esim/http_json_api.py index 377faea..6a803f2 100644 --- a/pySim/esim/http_json_api.py +++ b/pySim/esim/http_json_api.py @@ -204,16 +204,17 @@ return output
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 = {} - # let's first do the header, it's special - if not 'header' in data: - raise ValueError('Mandatory output parameter "header" missing') - hdr_class = self.output_params.get('header') - output['header'] = hdr_class.decode(data['header']) + if 'header' in self.output_params: + # let's first do the header, it's special + if not 'header' in data: + raise ValueError('Mandatory output parameter "header" missing') + 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']: - raise ApiError(output['header']['functionExecutionStatus']) + if output['header']['functionExecutionStatus']['status'] not in ['Executed-Success','Executed-WithWarning']: + raise ApiError(output['header']['functionExecutionStatus']) # we can only expect mandatory parameters to be present in case of successful execution for p in self.output_mandatory: if p == 'header': @@ -229,7 +230,7 @@ output[p] = p_class.decode(v) 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. Input data is passed in `data` as json-serializable dict. Output data is returned as json-deserialized dict.""" @@ -253,4 +254,6 @@ if not response.headers.get('X-Admin-Protocol', 'gsma/rsp/v2.unknown').startswith('gsma/rsp/v2.'): raise HttpHeaderError(response)
- return self.decode(response.json()) + if response.content: + return self.decode(response.json()) + return None