From 0de8b417683527132f7ae6bc9a403a5a83b99488 Mon Sep 17 00:00:00 2001 From: Christopher Dearborn Date: Mon, 2 Jul 2018 15:33:34 -0400 Subject: [PATCH] Filter out non-ASCII characters on invalid UTF8 When an enumerate is done, it is possible that the iDRAC may return invalid UTF8 that contains non-ASCII characters. This causes an XMLSyntaxError to be thrown. This fix detects that situation and filters out all non-ASCII characters to bypass the error. See the following bug for further details: https://bugs.launchpad.net/python-dracclient/+bug/1779412 Closes-Bug: #1779412 Change-Id: I5003785dee922920dcdd95c8d7e2a26e0bf97a7d --- dracclient/tests/test_wsman.py | 9 +++++++++ dracclient/wsman.py | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/dracclient/tests/test_wsman.py b/dracclient/tests/test_wsman.py index 20d836a..ea86f3b 100644 --- a/dracclient/tests/test_wsman.py +++ b/dracclient/tests/test_wsman.py @@ -19,6 +19,7 @@ import lxml.objectify import mock import requests.exceptions import requests_mock +import six from dracclient import exceptions from dracclient.tests import base @@ -55,6 +56,14 @@ class ClientTestCase(base.BaseTest): self.assertRaises(exceptions.WSManInvalidResponse, self.client.enumerate, 'resource') + @requests_mock.Mocker() + def test_enumerate_with_invalid_utf8(self, mock_requests): + mock_requests.post('https://1.2.3.4:443/wsman', + content=six.b('yay!\xC0')) + + resp = self.client.enumerate('resource') + self.assertEqual('yay!', resp.text) + @requests_mock.Mocker() def test_enumerate_with_auto_pull(self, mock_requests): mock_requests.post( diff --git a/dracclient/wsman.py b/dracclient/wsman.py index 6f9b59d..e0f4476 100644 --- a/dracclient/wsman.py +++ b/dracclient/wsman.py @@ -12,6 +12,8 @@ # under the License. import logging +import re +import six import time import uuid @@ -157,7 +159,14 @@ class Client(object): filter_query, filter_dialect) resp = self._do_request(payload) - resp_xml = ElementTree.fromstring(resp.content) + try: + resp_xml = ElementTree.fromstring(resp.content) + except ElementTree.XMLSyntaxError: + LOG.warning('Received invalid content from iDRAC. Filtering out ' + 'non-ASCII characters: ' + repr(resp.content)) + resp_xml = ElementTree.fromstring(re.sub(six.b('[^\x00-\x7f]'), + six.b(''), + resp.content)) if auto_pull: # The first response returns ""