diff --git a/poetry.lock b/poetry.lock index 97275b8..ff0ced1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -367,7 +367,18 @@ secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17. socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "8c6425b085e3770b1f16ab27d7a59d79d841040dc3125f2be8eece93d6ffd25a" +content-hash = "848238ed8d774980d2599d6865197ba62b5e05f66073815fe00671bdde3a43be" diff --git a/pyproject.toml b/pyproject.toml index b33df39..05a76c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ python = "^3.9" requests = "^2.28.2" spiffworkflow-connector-command = {git = "https://github.com/sartography/spiffworkflow-connector-command.git", rev = "main"} # spiffworkflow-connector-command = {develop = true, path = "../spiffworkflow-connector-command"} +xmltodict = "^0.13.0" diff --git a/src/connector_http/http_request_base.py b/src/connector_http/http_request_base.py index 750b7f7..c3f334b 100644 --- a/src/connector_http/http_request_base.py +++ b/src/connector_http/http_request_base.py @@ -1,5 +1,6 @@ import json import time +import xmltodict from collections.abc import Callable import requests # type: ignore @@ -109,6 +110,11 @@ def log(msg: str) -> None: command_response = json.loads(http_response.text) except Exception as e: error = self._create_error_from_exception(exception=e, http_response=http_response) + elif "application/xml" in http_response.headers.get("Content-Type", ""): + try: + command_response = xmltodict.parse(http_response.text) + except Exception as e: + error = self._create_error_from_exception(exception=e, http_response=http_response) log("Did parse http_response") if status >= 400 and error is None: diff --git a/tests/connector_http/unit/test_get_request_v2.py b/tests/connector_http/unit/test_get_request_v2.py index cf96500..acc0a67 100644 --- a/tests/connector_http/unit/test_get_request_v2.py +++ b/tests/connector_http/unit/test_get_request_v2.py @@ -41,6 +41,24 @@ def test_get_json_from_url(self) -> None: assert response["spiff__logs"] is not None assert len(response["spiff__logs"]) > 0 + def test_get_xml_from_url(self) -> None: + request = GetRequestV2(url="http://example.com") + return_xml = "we_return" + with patch("requests.get") as mock_request: + mock_request.return_value.status_code = 200 + mock_request.return_value.ok = True + mock_request.return_value.headers = {"Content-Type": "application/xml"} + mock_request.return_value.text = return_xml + response = request.execute(None, {}) + + assert response is not None + assert response["command_response"]["body"] == json.dumps({"hey": "we_return"}) + assert response["command_response"]["http_status"] == 200 + assert response["command_response"]["mimetype"] == "application/json" + assert response["error"] is None + assert response["spiff__logs"] is not None + assert len(response["spiff__logs"]) > 0 + def test_get_can_handle_500(self, sleepless: Any) -> None: request = GetRequestV2(url="http://example.com", attempts=3) return_json = {"error": "we_did_error"}