diff --git a/pyfritzhome/fritzhome.py b/pyfritzhome/fritzhome.py index 527e5ec..6b7a7ae 100644 --- a/pyfritzhome/fritzhome.py +++ b/pyfritzhome/fritzhome.py @@ -31,15 +31,18 @@ class Fritzhome(object): _templates: Optional[Dict[str, FritzhomeTemplate]] = None _triggers: Optional[Dict[str, FritzhomeTrigger]] = None - def __init__(self, host, user, password, ssl_verify=True): + def __init__(self, host, user, password, port=None, ssl_verify=True): """Create a fritzhome object.""" - self._host = host self._user = user self._password = password self._session = Session() self._ssl_verify = ssl_verify self._has_getdeviceinfos = True self._has_txbusy = True + if host.startswith("https://") or host.startswith("http://"): + self.base_url = f"{host}:{port}" if port else host + else: + self.base_url = f"http://{host}:{port}" if port else f"http://{host}" def _request(self, url, params=None, timeout=10): """Send a request with parameters.""" @@ -51,7 +54,7 @@ def _request(self, url, params=None, timeout=10): def _login_request(self, username=None, secret=None): """Send a login request with paramerters.""" - url = self.get_prefixed_host() + "/login_sid.lua?version=2" + url = f"{self.base_url}/login_sid.lua?version=2" params = {} if username: params["username"] = username @@ -69,7 +72,7 @@ def _login_request(self, username=None, secret=None): def _logout_request(self): """Send a logout request.""" _LOGGER.debug("logout") - url = self.get_prefixed_host() + "/login_sid.lua" + url = f"{self.base_url}/login_sid.lua" params = {"security:command/logout": "1", "sid": self._sid} self._request(url, params) @@ -105,7 +108,7 @@ def _create_login_secret_md5(challenge, password): def _aha_request(self, cmd, ain=None, param=None, rf=str): """Send an AHA request.""" - url = self.get_prefixed_host() + "/webservices/homeautoswitch.lua" + url = f"{self.base_url}/webservices/homeautoswitch.lua" _LOGGER.debug("self._sid:%s", self._sid) @@ -152,20 +155,6 @@ def logout(self): self._logout_request() self._sid = None - def get_prefixed_host(self): - """Choose the correct protocol prefix for the host. - - Supports three input formats: - - https://(requests use strict certificate validation by default) - - http:// (unecrypted) - - (unencrypted) - """ - host = self._host - if host.startswith("https://") or host.startswith("http://"): - return host - else: - return "http://" + host - def update_devices(self, ignore_removed=True): """Update the device.""" _LOGGER.info("Updating Devices ...") diff --git a/tests/test_fritzhome.py b/tests/test_fritzhome.py index 9a11167..ca7ee5e 100644 --- a/tests/test_fritzhome.py +++ b/tests/test_fritzhome.py @@ -77,6 +77,21 @@ def test_not_logged_in_error(self): self.fritz.update_devices() assert str(ex.value) == "not logged in, login before doing any requests." + @pytest.mark.parametrize( + ("host", "port", "expected_base_url"), + [ + ("10.0.0.1", None, "http://10.0.0.1"), + ("http://10.0.0.1", None, "http://10.0.0.1"), + ("https://10.0.0.1", None, "https://10.0.0.1"), + ("10.0.0.1", 1234, "http://10.0.0.1:1234"), + ("http://10.0.0.1", 1234, "http://10.0.0.1:1234"), + ("https://10.0.0.1", 1234, "https://10.0.0.1:1234"), + ], + ) + def test_base_url(self, host: str, port: int, expected_base_url: str): + fritz = Fritzhome(host, "user", "admin123", port) + assert fritz.base_url == expected_base_url + def test_aha_request(self): self.fritz._aha_request(cmd="testcmd") self.fritz._request.assert_called_with(