From 1a32eba4746121def6f44c042b665d48f85888b8 Mon Sep 17 00:00:00 2001 From: Alex Shnitman Date: Thu, 16 Apr 2026 22:06:34 +0300 Subject: [PATCH] fix PUBLIC_HOST_URL without a trailing slash (closes #959) --- app/main.py | 5 +++++ app/tests/test_config.py | 41 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/app/main.py b/app/main.py index 62084c8..283de01 100644 --- a/app/main.py +++ b/app/main.py @@ -92,6 +92,11 @@ class Config: if not self.URL_PREFIX.endswith('/'): self.URL_PREFIX += '/' + for attr in ('PUBLIC_HOST_URL', 'PUBLIC_HOST_AUDIO_URL'): + val = getattr(self, attr) + if val and not val.endswith('/'): + setattr(self, attr, val + '/') + # Convert relative addresses to absolute addresses to prevent the failure of file address comparison if self.YTDL_OPTIONS_FILE and self.YTDL_OPTIONS_FILE.startswith('.'): self.YTDL_OPTIONS_FILE = str(Path(self.YTDL_OPTIONS_FILE).resolve()) diff --git a/app/tests/test_config.py b/app/tests/test_config.py index d97c1a9..6b096bf 100644 --- a/app/tests/test_config.py +++ b/app/tests/test_config.py @@ -23,6 +23,47 @@ class ConfigTests(unittest.TestCase): c = Config() self.assertEqual(c.URL_PREFIX, "foo/") + def test_public_host_url_gets_trailing_slash(self): + with patch.dict( + os.environ, + _base_env(PUBLIC_HOST_URL="https://ytdl.example.com"), + clear=False, + ): + c = Config() + self.assertEqual(c.PUBLIC_HOST_URL, "https://ytdl.example.com/") + + def test_public_host_audio_url_gets_trailing_slash(self): + with patch.dict( + os.environ, + _base_env(PUBLIC_HOST_AUDIO_URL="https://audio.example.com"), + clear=False, + ): + c = Config() + self.assertEqual(c.PUBLIC_HOST_AUDIO_URL, "https://audio.example.com/") + + def test_public_host_url_empty_stays_empty(self): + with patch.dict( + os.environ, + _base_env(PUBLIC_HOST_URL="", PUBLIC_HOST_AUDIO_URL=""), + clear=False, + ): + c = Config() + self.assertEqual(c.PUBLIC_HOST_URL, "") + self.assertEqual(c.PUBLIC_HOST_AUDIO_URL, "") + + def test_public_host_url_already_slashed_unchanged(self): + with patch.dict( + os.environ, + _base_env( + PUBLIC_HOST_URL="https://ytdl.example.com/", + PUBLIC_HOST_AUDIO_URL="https://audio.example.com/", + ), + clear=False, + ): + c = Config() + self.assertEqual(c.PUBLIC_HOST_URL, "https://ytdl.example.com/") + self.assertEqual(c.PUBLIC_HOST_AUDIO_URL, "https://audio.example.com/") + def test_ytdl_options_json_loaded(self): opts = {"quiet": True, "no_warnings": True} with patch.dict(