diff --git a/aioupnp/commands.py b/aioupnp/commands.py index a254216..66cd576 100644 --- a/aioupnp/commands.py +++ b/aioupnp/commands.py @@ -253,6 +253,8 @@ class SOAPCommands: raise NotImplementedError() assert name in self._wrappers_no_args result: str = await self._wrappers_no_args[name]() + if not result: + raise UPnPError("Got null external ip address") return result # async def GetNATRSIPStatus(self) -> Tuple[bool, bool]: diff --git a/tests/test_upnp.py b/tests/test_upnp.py index 267d9fe..f19c6f2 100644 --- a/tests/test_upnp.py +++ b/tests/test_upnp.py @@ -39,10 +39,11 @@ class UPnPCommandTestCase(AsyncioTestCase): class TestGetExternalIPAddress(UPnPCommandTestCase): client_address = '11.2.3.222' - def setUp(self) -> None: - self.replies.update({b'POST /soap.cgi?service=WANIPConn1 HTTP/1.1\r\nHost: 11.2.3.4\r\nUser-Agent: python3/aioupnp, UPnP/1.0, MiniUPnPc/1.9\r\nContent-Length: 285\r\nContent-Type: text/xml\r\nSOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"\r\nConnection: Close\r\nCache-Control: no-cache\r\nPragma: no-cache\r\n\r\n\r\n\r\n': b"HTTP/1.1 200 OK\r\nServer: WebServer\r\nDate: Wed, 22 May 2019 03:25:57 GMT\r\nConnection: close\r\nCONTENT-TYPE: text/xml; charset=\"utf-8\"\r\nCONTENT-LENGTH: 365 \r\nEXT:\r\n\r\n\n\n\t\n\t\t\n11.222.3.44\n\n\t\n\n"}) async def test_get_external_ip(self): + request = b'POST /soap.cgi?service=WANIPConn1 HTTP/1.1\r\nHost: 11.2.3.4\r\nUser-Agent: python3/aioupnp, UPnP/1.0, MiniUPnPc/1.9\r\nContent-Length: 285\r\nContent-Type: text/xml\r\nSOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"\r\nConnection: Close\r\nCache-Control: no-cache\r\nPragma: no-cache\r\n\r\n\r\n\r\n' + self.replies.update({request: b"HTTP/1.1 200 OK\r\nServer: WebServer\r\nDate: Wed, 22 May 2019 03:25:57 GMT\r\nConnection: close\r\nCONTENT-TYPE: text/xml; charset=\"utf-8\"\r\nCONTENT-LENGTH: 365 \r\nEXT:\r\n\r\n\n\n\t\n\t\t\n11.222.3.44\n\n\t\n\n"}) + self.addCleanup(self.replies.pop, request) with mock_tcp_and_udp(self.loop, tcp_replies=self.replies): gateway = Gateway(self.reply, self.m_search_args, self.client_address, self.gateway_address, loop=self.loop) await gateway.discover_commands() @@ -50,6 +51,18 @@ class TestGetExternalIPAddress(UPnPCommandTestCase): external_ip = await upnp.get_external_ip() self.assertEqual("11.222.3.44", external_ip) + async def test_null_external_ip(self): + request = b'POST /soap.cgi?service=WANIPConn1 HTTP/1.1\r\nHost: 11.2.3.4\r\nUser-Agent: python3/aioupnp, UPnP/1.0, MiniUPnPc/1.9\r\nContent-Length: 285\r\nContent-Type: text/xml\r\nSOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"\r\nConnection: Close\r\nCache-Control: no-cache\r\nPragma: no-cache\r\n\r\n\r\n\r\n' + self.replies.update({ + request: b"HTTP/1.1 200 OK\r\nServer: WebServer\r\nDate: Wed, 22 May 2019 03:25:57 GMT\r\nConnection: close\r\nCONTENT-TYPE: text/xml; charset=\"utf-8\"\r\nCONTENT-LENGTH: 354 \r\nEXT:\r\n\r\n\n\n\t\n\t\t\n\n\n\t\n\n"}) + self.addCleanup(self.replies.pop, request) + with mock_tcp_and_udp(self.loop, tcp_replies=self.replies): + gateway = Gateway(self.reply, self.m_search_args, self.client_address, self.gateway_address, loop=self.loop) + await gateway.discover_commands() + upnp = UPnP(self.client_address, self.gateway_address, gateway) + with self.assertRaises(UPnPError): + await upnp.get_external_ip() + class TestMalformedGetExternalIPAddressResponse(UPnPCommandTestCase): client_address = '11.2.3.222'