Skip to content
Snippets Groups Projects
Commit 0c599bdc authored by Antoine Lambert's avatar Antoine Lambert
Browse files

golang: Ensure to case-encode URLs for retrieving package info

When a go package name contains uppercase characters in it, associated
goproxy URLs need to be case-encoded by replacing every uppercase letter
with an exclamation mark followed by the corresponding lower-case letter.

This fixes the loading of such packages.

See https://go.dev/ref/mod#goproxy-protocol.

Related to T4124
parent 13408734
No related branches found
No related tags found
1 merge request!317golang: Ensure to case-encode URLs for retrieving package info
......@@ -5,6 +5,7 @@
import json
import logging
import re
from typing import Iterator, Optional, Sequence, Tuple
import attr
......@@ -17,6 +18,10 @@ from swh.storage.interface import StorageInterface
logger = logging.getLogger(__name__)
def _uppercase_encode(url: str) -> str:
return re.sub("([A-Z]{1})", r"!\1", url).lower()
@attr.s
class GolangPackageInfo(BasePackageInfo):
name = attr.ib(type=str)
......@@ -46,6 +51,7 @@ class GolangLoader(PackageLoader[GolangPackageInfo]):
), "Go package URL (%s) not from %s" % (url, self.GOLANG_PKG_DEV_URL)
self.name = url[len(self.GOLANG_PKG_DEV_URL) + 1 :]
self.url = url.replace(self.GOLANG_PKG_DEV_URL, self.GOLANG_PROXY_URL)
self.url = _uppercase_encode(self.url)
def get_versions(self) -> Sequence[str]:
return api_info(f"{self.url}/@v/list").decode().splitlines()
......@@ -55,7 +61,7 @@ class GolangLoader(PackageLoader[GolangPackageInfo]):
return json.loads(latest)["Version"]
def _raw_info(self, version: str) -> dict:
url = f"{self.url}/@v/{version}.info"
url = f"{self.url}/@v/{_uppercase_encode(version)}.info"
return json.loads(api_info(url))
def get_package_info(self, version: str) -> Iterator[Tuple[str, GolangPackageInfo]]:
......
{"Version":"v1.0.1","Time":"2022-03-23T18:02:43Z"}
\ No newline at end of file
{"Version":"v1.0.1","Time":"2022-03-23T18:02:43Z"}
\ No newline at end of file
......@@ -11,3 +11,12 @@ def test_golang_loader_first_visit(swh_storage, requests_mock_datadir):
loader = GolangLoader(swh_storage, url)
assert loader.load()["status"] == "eventful"
def test_golang_loader_package_name_with_uppercase_characters(
swh_storage, requests_mock_datadir
):
url = "https://pkg.go.dev/github.com/adam-hanna/arrayOperations"
loader = GolangLoader(swh_storage, url)
assert loader.load()["status"] == "eventful"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment