Skip to content

Commit

Permalink
fix: Wrap weasyprint to catch exceptions (#6728)
Browse files Browse the repository at this point in the history
* fix: Wrap weasyprint to catch exceptions (#6324)

* test: Restore socket function after test

* test: Use mock instead of monkeying with sockets

* refactor: Log the error

* fix: Don't catch non-Exception interruptions

---------

Co-authored-by: Robert Sparks <[email protected]>
  • Loading branch information
pselkirk and rjsparks authored Dec 27, 2023
1 parent 288b69d commit 748bcc3
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 2 deletions.
3 changes: 3 additions & 0 deletions ietf/doc/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,9 @@ def pdfized(self):
)
except AssertionError:
pdf = None
except Exception as e:
log.log('weasyprint failed:'+str(e))
raise
if pdf:
cache.set(cache_key, pdf, settings.PDFIZER_CACHE_TIME)
return pdf
Expand Down
8 changes: 8 additions & 0 deletions ietf/doc/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@

from tastypie.test import ResourceTestCaseMixin

from weasyprint.urls import URLFetchingError

import debug # pyflakes:ignore

from ietf.doc.models import ( Document, DocRelationshipName, RelatedDocument, State,
Expand Down Expand Up @@ -2867,6 +2869,12 @@ def test_pdfized(self):
self.should_succeed(dict(name=draft.name,rev=f'{r:02d}',ext=ext))
self.should_404(dict(name=draft.name,rev='02'))

with mock.patch('ietf.doc.models.DocumentInfo.pdfized', side_effect=URLFetchingError):
url = urlreverse(self.view, kwargs=dict(name=rfc.name))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertContains(r, "Error while rendering PDF")

class NotifyValidationTests(TestCase):
def test_notify_validation(self):
valid_values = [
Expand Down
6 changes: 4 additions & 2 deletions ietf/doc/views_doc.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
from django import forms
from django.contrib.staticfiles import finders


import debug # pyflakes:ignore

from ietf.doc.models import ( Document, DocHistory, DocEvent, BallotDocEvent, BallotType,
Expand Down Expand Up @@ -1064,7 +1063,10 @@ def document_pdfized(request, name, rev=None, ext=None):
if not os.path.exists(doc.get_file_name()):
raise Http404("File not found: %s" % doc.get_file_name())

pdf = doc.pdfized()
try:
pdf = doc.pdfized()
except Exception:
return render(request, "doc/weasyprint_failed.html")
if pdf:
return HttpResponse(pdf,content_type='application/pdf')
else:
Expand Down
17 changes: 17 additions & 0 deletions ietf/templates/doc/weasyprint_failed.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{# Copyright The IETF Trust 2023, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}Error while rendering PDF{% endblock %}
{% block content %}
{% origin %}
<h1>Error while rendering PDF</h1>
<p>
An error was encountered while trying to render your document as PDF.
In case this was a temporary error, you may want to try again in a
little while.
</p>
<p>
A failure report with details about what happened has been sent to the
server administrators.
</p>
{% endblock %}

0 comments on commit 748bcc3

Please sign in to comment.