laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/41998?usp=email )
Change subject: http_json_api: Only require Content-Type if response body is non-empty ......................................................................
http_json_api: Only require Content-Type if response body is non-empty
If there is an empty body returned, such as in the case of the response to an es9p notification, then it is of course also legal to not set the content-type header.
This patch fixes an exception when talking to certain SM-DP+ with es9p_client.py:
DEBUG:pySim.esim.http_json_api:HTTP RSP-STS: [204] hdr: {'X-Admin-Protocol': 'gsma/rsp/v2.5.0', 'Date': 'Wed, 28 Jan 2026 18:26:39 GMT', 'Server': 'REDACTED'} DEBUG:pySim.esim.http_json_api:HTTP RSP: b'' {'X-Admin-Protocol': 'gsma/rsp/v2.5.0', 'Date': 'Wed, 28 Jan 2026 18:26:39 GMT', 'Server': 'REDACTED'} <Response [204]> Traceback (most recent call last): File "gprojects/git/pysim/es9p/../contrib/es9p_client.py", line 315, in <module> c.do_notification() ~~~~~~~~~~~~~~~~~^^ File "projects/git/pysim/es9p/../contrib/es9p_client.py", line 159, in do_notification res = self.peer.call_handleNotification(data) File "projects/git/pysim/contrib/pySim/esim/es9p.py", line 174, in call_handleNotification return self.handleNotification.call(data) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^ File "projects/git/pysim/contrib/pySim/esim/http_json_api.py", line 335, in call if not response.headers.get('Content-Type').startswith(req_headers['Content-Type']): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'startswith'
Change-Id: I99e8f167b7bb869c5ff6d908ba673dac87fef71a --- M pySim/esim/http_json_api.py 1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/98/41998/1
diff --git a/pySim/esim/http_json_api.py b/pySim/esim/http_json_api.py index e640b3f..36caac9 100644 --- a/pySim/esim/http_json_api.py +++ b/pySim/esim/http_json_api.py @@ -330,7 +330,7 @@ # SGP.22, section 6.5.1) if response.status_code != self.api_func.expected_http_status: raise HttpStatusError(response) - if not response.headers.get('Content-Type').startswith(req_headers['Content-Type']): + if response.content and not response.headers.get('Content-Type').startswith(req_headers['Content-Type']): raise HttpHeaderError(response) if not response.headers.get('X-Admin-Protocol', 'gsma/rsp/v2.unknown').startswith('gsma/rsp/v2.'): raise HttpHeaderError(response)