77from rest_framework .viewsets import ViewSet
88from rest_framework .response import Response
99from rest_framework .exceptions import Throttled
10+ from rest_framework .renderers import BaseRenderer
1011from django .core .exceptions import ObjectDoesNotExist
1112from django .shortcuts import redirect , get_object_or_404
1213
3031log = logging .getLogger (__name__ )
3132
3233BASE_CONTENT_URL = urljoin (settings .CONTENT_ORIGIN , settings .CONTENT_PATH_PREFIX )
33- BASE_API_URL = urljoin (settings .CRATES_IO_API_HOSTNAME , "/pulp/cargo/" )
34- CRATES_IO_API = "/api/v1/crates/"
34+
35+
36+ class PlainTextRenderer (BaseRenderer ):
37+ """Renderer for text/plain responses (Cargo sends Accept: text/plain)."""
38+
39+ media_type = "text/plain"
40+ format = "txt"
41+
42+ def render (self , data , accepted_media_type = None , renderer_context = None ):
43+ return data
3544
3645
3746class ApiMixin :
3847 """Mixin to get index specific info."""
3948
49+ renderer_classes = [PlainTextRenderer ]
4050 _distro = None
4151
4252 @property
@@ -87,14 +97,17 @@ def initial(self, request, *args, **kwargs):
8797 super ().initial (request , * args , ** kwargs )
8898 domain_name = get_domain ().name
8999 repo = self .kwargs ["repo" ]
100+ scheme = request .META .get ("HTTP_X_FORWARDED_PROTO" , request .scheme )
101+ host = request .META .get ("HTTP_X_FORWARDED_HOST" , request .get_host ())
102+ base_api_url = f"{ scheme } ://{ host } /pulp/cargo/"
90103 if settings .DOMAIN_ENABLED :
91104 self .base_content_url = urljoin (BASE_CONTENT_URL , f"pulp/cargo/{ domain_name } /{ repo } /" )
92- self .base_api_url = urljoin ( BASE_API_URL , f"{ domain_name } /{ repo } /" )
93- self .base_download_url = urljoin ( BASE_API_URL , f"{ domain_name } /{ repo } { CRATES_IO_API } " )
105+ self .base_api_url = f"{ base_api_url } { domain_name } /{ repo } /"
106+ self .base_download_url = f"{ base_api_url } { domain_name } /{ repo } /api/v1/crates"
94107 else :
95108 self .base_content_url = urljoin (BASE_CONTENT_URL , f"pulp/cargo/{ repo } /" )
96- self .base_api_url = urljoin ( BASE_API_URL , f"{ repo } /" )
97- self .base_download_url = urljoin ( BASE_API_URL , f"{ repo } { CRATES_IO_API } " )
109+ self .base_api_url = f"{ base_api_url } { repo } /"
110+ self .base_download_url = f"{ base_api_url } { repo } /api/v1/crates"
98111
99112 @classmethod
100113 def urlpattern (cls ):
@@ -221,13 +234,12 @@ class IndexRoot(ApiMixin, ViewSet):
221234 @extend_schema (responses = {200 : IndexRootSerializer }, summary = "Get index info" )
222235 def retrieve (self , request , repo ):
223236 """Gets index route."""
224- return Response (
225- data = {
226- "dl" : self .base_download_url ,
227- "api" : self .base_api_url ,
228- "auth-required" : False ,
229- }
230- )
237+ data = {
238+ "dl" : self .base_download_url ,
239+ "api" : self .base_api_url ,
240+ "auth-required" : False ,
241+ }
242+ return HttpResponse (json .dumps (data ), content_type = "application/json" )
231243
232244
233245class CargoDownloadApiView (APIView ):
@@ -238,6 +250,7 @@ class CargoDownloadApiView(APIView):
238250 # Authentication disabled for now
239251 authentication_classes = []
240252 permission_classes = []
253+ renderer_classes = [PlainTextRenderer ]
241254
242255 def get_full_path (self , base_path , pulp_domain = None ): # TODO: replace with ApiMixin?
243256 if settings .DOMAIN_ENABLED :
0 commit comments