diff --git a/shelfmark/download/http.py b/shelfmark/download/http.py index 106c60c2..079f16fa 100644 --- a/shelfmark/download/http.py +++ b/shelfmark/download/http.py @@ -1104,5 +1104,7 @@ def get_absolute_url(base_url: str, url: str) -> str: parsed = urlparse(url) base = urlparse(base_url) if not parsed.netloc or not parsed.scheme: - parsed = parsed._replace(netloc=base.netloc, scheme=base.scheme) + parsed = parsed._replace( + netloc=parsed.netloc or base.netloc, scheme=parsed.scheme or base.scheme + ) return parsed.geturl() diff --git a/tests/download/test_http_absolute_url.py b/tests/download/test_http_absolute_url.py new file mode 100644 index 00000000..32f65029 --- /dev/null +++ b/tests/download/test_http_absolute_url.py @@ -0,0 +1,17 @@ +"""Tests for resolving a scraped link against the page it came from.""" + + +def test_get_absolute_url_keeps_a_protocol_relative_host(): + import shelfmark.download.http as http + + result = http.get_absolute_url("https://annas-archive.org/md5/abc", "//cdn.example.org/f.epub") + + assert result == "https://cdn.example.org/f.epub" + + +def test_get_absolute_url_resolves_a_relative_path_against_the_base(): + import shelfmark.download.http as http + + result = http.get_absolute_url("https://annas-archive.org/md5/abc", "/slow_download/abc/0/1") + + assert result == "https://annas-archive.org/slow_download/abc/0/1"