Skip to content

Commit

Permalink
Add support for xmltodict
Browse files Browse the repository at this point in the history
  • Loading branch information
jbirddog committed Feb 20, 2024
1 parent b79938f commit ac885dc
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 1 deletion.
13 changes: 12 additions & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"



Expand Down
6 changes: 6 additions & 0 deletions src/connector_http/http_request_base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json
import time
import xmltodict
from collections.abc import Callable

import requests # type: ignore
Expand Down Expand Up @@ -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:
Expand Down
18 changes: 18 additions & 0 deletions tests/connector_http/unit/test_get_request_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "<hey>we_return</hey>"
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"}
Expand Down

0 comments on commit ac885dc

Please sign in to comment.