|
28 | 28 | from packageurl.contrib.route import NoRouteAvailable
|
29 | 29 | from packageurl.contrib.route import Router
|
30 | 30 |
|
| 31 | +DEFAULT_MAVEN_REPOSITORY = "https://repo.maven.apache.org/maven2" |
| 32 | + |
31 | 33 |
|
32 | 34 | def get_repo_download_url_by_package_type(
|
33 | 35 | type, namespace, name, version, archive_extension="tar.gz"
|
@@ -314,6 +316,24 @@ def build_cocoapods_repo_url(purl):
|
314 | 316 | return name and f"https://cocoapods.org/pods/{name}"
|
315 | 317 |
|
316 | 318 |
|
| 319 | +@repo_router.route("pkg:maven/.*") |
| 320 | +def build_maven_repo_url(purl): |
| 321 | + """ |
| 322 | + Return a Maven repo URL from the `purl` string. |
| 323 | + """ |
| 324 | + purl_data = PackageURL.from_string(purl) |
| 325 | + namespace = purl_data.namespace |
| 326 | + name = purl_data.name |
| 327 | + version = purl_data.version |
| 328 | + qualifiers = purl_data.qualifiers |
| 329 | + |
| 330 | + base_url = qualifiers.get("repository_url", DEFAULT_MAVEN_REPOSITORY) |
| 331 | + |
| 332 | + if namespace and name and version: |
| 333 | + namespace = namespace.replace(".", "/") |
| 334 | + return f"{base_url}/{namespace}/{name}/{version}" |
| 335 | + |
| 336 | + |
317 | 337 | # Download URLs:
|
318 | 338 |
|
319 | 339 |
|
@@ -365,6 +385,28 @@ def build_npm_download_url(purl):
|
365 | 385 | return f"{base_url}/{name}/-/{name}-{version}.tgz"
|
366 | 386 |
|
367 | 387 |
|
| 388 | +@download_router.route("pkg:maven/.*") |
| 389 | +def build_maven_download_url(purl): |
| 390 | + """ |
| 391 | + Return a maven download URL from the `purl` string. |
| 392 | + """ |
| 393 | + purl_data = PackageURL.from_string(purl) |
| 394 | + |
| 395 | + namespace = purl_data.namespace |
| 396 | + name = purl_data.name |
| 397 | + version = purl_data.version |
| 398 | + qualifiers = purl_data.qualifiers |
| 399 | + |
| 400 | + base_url = qualifiers.get("repository_url", DEFAULT_MAVEN_REPOSITORY) |
| 401 | + maven_type = qualifiers.get("type", "jar") # default to "jar" |
| 402 | + classifier = qualifiers.get("classifier") |
| 403 | + |
| 404 | + if namespace and name and version: |
| 405 | + namespace = namespace.replace(".", "/") |
| 406 | + classifier = f"-{classifier}" if classifier else "" |
| 407 | + return f"{base_url}/{namespace}/{name}/{version}/{name}-{version}{classifier}.{maven_type}" |
| 408 | + |
| 409 | + |
368 | 410 | @download_router.route("pkg:hackage/.*")
|
369 | 411 | def build_hackage_download_url(purl):
|
370 | 412 | """
|
|
0 commit comments