diff --git a/vulnerabilities/api.py b/vulnerabilities/api.py index f51998b87..998f65523 100644 --- a/vulnerabilities/api.py +++ b/vulnerabilities/api.py @@ -8,6 +8,7 @@ # from urllib.parse import unquote +from urllib.parse import quote from django.db.models import Prefetch from django_filters import rest_framework as filters @@ -67,6 +68,8 @@ def get_resource_url(self, instance): resource_url = serializers.SerializerMethodField() """ resource_url = instance.get_absolute_url() + if isinstance(instance, Package): + resource_url = instance.get_absolute_url(quote_purl=True) if request := self.context.get("request", None): return request.build_absolute_uri(location=resource_url) diff --git a/vulnerabilities/models.py b/vulnerabilities/models.py index a0fd63a44..705dfe254 100644 --- a/vulnerabilities/models.py +++ b/vulnerabilities/models.py @@ -10,6 +10,7 @@ import hashlib import json import logging +from urllib.parse import quote from contextlib import suppress from typing import Any @@ -639,11 +640,14 @@ def is_vulnerable(self) -> bool: def history(self): return self.changelog.all() - def get_absolute_url(self): + def get_absolute_url(self, quote_purl=False): """ Return this Package details URL. """ - return reverse("package_details", args=[self.purl]) + purl = self.purl + if quote_purl: + purl = quote(purl) + return reverse("package_details", args=[purl]) def get_details_url(self, request): """