Skip to content

Commit

Permalink
Merge pull request #5243 from rtfd/fix-404-500
Browse files Browse the repository at this point in the history
Be more defensive in our 404 handler
ericholscher authored Feb 6, 2019

Verified

This commit was signed with the committer’s verified signature.
snyk-bot Snyk bot
2 parents 2966d09 + 803f4b8 commit a472cb9
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions readthedocs/core/views/__init__.py
Original file line number Diff line number Diff line change
@@ -176,7 +176,9 @@ def resolve_404_path(project, version_slug=None, language=None):

version = None
if version_slug:
version = project.versions.get(slug=version_slug)
version_qs = project.versions.filter(slug=version_slug)
if version_qs.exists():
version = version_qs.first()

private = any([
version and version.privacy_level == PRIVATE,
@@ -192,25 +194,26 @@ def resolve_404_path(project, version_slug=None, language=None):

project, full_path = project_and_path_from_request(request, request.get_full_path())

language = None
version_slug = None
schema, netloc, path, params, query, fragments = urlparse(full_path)
if not project.single_version:
language, version_slug, path = language_and_version_from_path(path)

# Firstly, attempt to serve the 404 of the current version (version_slug)
# Secondly, try to serve the 404 page for the default version (project.get_default_version())
for slug in (version_slug, project.get_default_version()):
basepath, filename, fullpath = resolve_404_path(project, slug, language)
if os.path.exists(fullpath):
log.debug(
'serving 404.html page current version: [project: %s] [version: %s]',
project.slug,
slug,
)
r = _serve_file(request, filename, basepath)
r.status_code = 404
return r
if project:
language = None
version_slug = None
schema, netloc, path, params, query, fragments = urlparse(full_path)
if not project.single_version:
language, version_slug, path = language_and_version_from_path(path)

# Firstly, attempt to serve the 404 of the current version (version_slug)
# Secondly, try to serve the 404 page for the default version (project.get_default_version())
for slug in (version_slug, project.get_default_version()):
basepath, filename, fullpath = resolve_404_path(project, slug, language)
if os.path.exists(fullpath):
log.debug(
'serving 404.html page current version: [project: %s] [version: %s]',
project.slug,
slug,
)
r = _serve_file(request, filename, basepath)
r.status_code = 404
return r

# Finally, return the default 404 page generated by Read the Docs
r = render(request, template_name)

0 comments on commit a472cb9

Please sign in to comment.