fix soap xml parsing for tp-link devices #20

Merged
jackrobison merged 3 commits from fix-tplink-xml-parsing into master 2019-11-14 20:22:14 +01:00
3 changed files with 9 additions and 1 deletions

View file

@ -7,7 +7,7 @@ from aioupnp.constants import XML_VERSION, ENVELOPE, BODY, FAULT, CONTROL
from aioupnp.serialization.xml import xml_to_dict from aioupnp.serialization.xml import xml_to_dict
CONTENT_NO_XML_VERSION_PATTERN = re.compile( CONTENT_NO_XML_VERSION_PATTERN = re.compile(
"(\<s\:Envelope xmlns\:s=\"http\:\/\/schemas\.xmlsoap\.org\/soap\/envelope\/\"(\s*.)*\>)".encode() b"(\<([^:>]*)\:Envelope xmlns\:[^:>]*=\"http\:\/\/schemas\.xmlsoap\.org\/soap\/envelope\/\"(\s*.)*\>)"
) )

View file

View file

@ -114,3 +114,11 @@ class TestSOAPSerialization(unittest.TestCase):
raised = True raised = True
self.assertEqual(str(err), expected) self.assertEqual(str(err), expected)
self.assertTrue(raised) self.assertTrue(raised)
def test_soap_env_namespace_response(self):
# tp link devices use `SOAP-ENV` namespace rather than the normal `s`
response = b'HTTP/1.1 200 OK\r\nCONNECTION: close\r\nSERVER: ipos/7.0 UPnP/1.0 TL-WR940N/TL-WR941ND/3.0\r\nCONTENT-LENGTH: 404\r\nCONTENT-TYPE: text/xml; charset="utf-8"\r\n\r\n<?xml version="1.0"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\n<SOAP-ENV:Body>\n<u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewExternalIPAddress>100.100.100.100</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n'
self.assertDictEqual(
deserialize_soap_post_response(response, 'GetExternalIPAddress', self.st.decode()),
{'NewExternalIPAddress': '100.100.100.100'}
)