@@ -89,6 +89,23 @@ def get(self,
89
89
``subproject_slash`` is used to determine if the subproject URL has a slash,
90
90
so that we can decide if we need to serve docs or add a /.
91
91
"""
92
+ unresolved_domain = request .unresolved_domain
93
+ # Handle requests that need canonicalizing (eg. HTTP -> HTTPS, redirect to canonical domain)
94
+ redirect_type = self ._get_canonical_redirect_type (request )
95
+ if redirect_type :
96
+ # Attach the current project to the request.
97
+ request .path_project_slug = unresolved_domain .project .slug
98
+ try :
99
+ return self .canonical_redirect (
100
+ request = request ,
101
+ final_project = unresolved_domain .project ,
102
+ external_version_slug = unresolved_domain .external_version_slug ,
103
+ redirect_type = redirect_type ,
104
+ )
105
+ except InfiniteRedirectException :
106
+ # Don't redirect in this case, since it would break things
107
+ pass
108
+
92
109
version_slug = self .get_version_from_host (request , version_slug )
93
110
final_project , lang_slug , version_slug , filename = _get_project_data_from_request ( # noqa
94
111
request ,
@@ -100,7 +117,7 @@ def get(self,
100
117
)
101
118
version = final_project .versions .filter (slug = version_slug ).first ()
102
119
103
- is_external = request . unresolved_domain .is_from_external_domain
120
+ is_external = unresolved_domain .is_from_external_domain
104
121
105
122
log .bind (
106
123
project_slug = final_project .slug ,
@@ -137,26 +154,6 @@ def get(self,
137
154
if spam_response :
138
155
return spam_response
139
156
140
- # Handle requests that need canonicalizing (eg. HTTP -> HTTPS, redirect to canonical domain)
141
- redirect_type = self ._get_canonical_redirect_type (request )
142
- if redirect_type :
143
- # A canonical redirect can be cached, if we don't have information
144
- # about the version, since the final URL will check for authz.
145
- if not version and self ._is_cache_enabled (final_project ):
146
- self .cache_request = True
147
- try :
148
- return self .canonical_redirect (
149
- request = request ,
150
- final_project = final_project ,
151
- version_slug = version_slug ,
152
- filename = filename ,
153
- redirect_type = redirect_type ,
154
- is_external_version = is_external ,
155
- )
156
- except InfiniteRedirectException :
157
- # Don't redirect in this case, since it would break things
158
- pass
159
-
160
157
# Handle a / redirect when we aren't a single version
161
158
if all ([
162
159
lang_slug is None ,
@@ -252,6 +249,16 @@ def _get_canonical_redirect_type(self, request):
252
249
log .debug ("Proxito CNAME HTTPS Redirect." , domain = domain .domain )
253
250
return RedirectType .http_to_https
254
251
252
+ # Check for subprojects before checking for canonical domains,
253
+ # so we can redirect to the main domain first.
254
+ # Custom domains on subprojects are not supported.
255
+ if project .is_subproject :
256
+ log .debug (
257
+ "Proxito Public Domain -> Subproject Main Domain Redirect." ,
258
+ project_slug = project .slug ,
259
+ )
260
+ return RedirectType .subproject_to_main_domain
261
+
255
262
if unresolved_domain .is_from_public_domain :
256
263
canonical_domain = (
257
264
Domain .objects .filter (project = project )
@@ -265,13 +272,6 @@ def _get_canonical_redirect_type(self, request):
265
272
)
266
273
return RedirectType .to_canonical_domain
267
274
268
- if project .is_subproject :
269
- log .debug (
270
- "Proxito Public Domain -> Subproject Main Domain Redirect." ,
271
- project_slug = project .slug ,
272
- )
273
- return RedirectType .subproject_to_main_domain
274
-
275
275
return None
276
276
277
277
0 commit comments