diff --git a/infrastructure/abri/abri_client.py b/infrastructure/abri/abri_client.py index 712ab49de..bd63f056a 100644 --- a/infrastructure/abri/abri_client.py +++ b/infrastructure/abri/abri_client.py @@ -2,7 +2,12 @@ import xml.etree.ElementTree as ET import requests -from domain.abri.models import JobLogged, LogJobRequest, LogJobResult +from domain.abri.models import ( + AbriRequestRejected, + JobLogged, + LogJobRequest, + LogJobResult, +) from infrastructure.abri.config import AbriConfig from infrastructure.abri.envelope import serialise_relay_request @@ -36,6 +41,8 @@ class AbriClient: ) response = self._session.post(self._config.endpoint_url, data=body) root = ET.fromstring(response.content) + if root.tag == "response": + return self._parse_rejection(root) job_logged = root.find("Jobs/Job_logged") if job_logged is None: raise ValueError("Job_logged element missing from relay response") @@ -43,3 +50,12 @@ class AbriClient: job_no=job_logged.attrib["job_no"], logged_info=job_logged.attrib["logged_info"], ) + + @staticmethod + def _parse_rejection(root: ET.Element) -> AbriRequestRejected: + success = root.findtext("success") + code = root.findtext("code") + message = root.findtext("message") + if success != "false" or code is None or message is None: + raise ValueError("malformed relay failure response") + return AbriRequestRejected(code=code, message=message)