fix: Wrap weasyprint to catch exceptions (#6728)
* 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 <rjsparks@nostrum.com>
This commit is contained in:
parent
288b69d0f3
commit
748bcc328f
|
@ -634,6 +634,9 @@ class DocumentInfo(models.Model):
|
|||
)
|
||||
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
|
||||
|
|
|
@ -31,6 +31,8 @@ from django.utils.text import slugify
|
|||
|
||||
from tastypie.test import ResourceTestCaseMixin
|
||||
|
||||
from weasyprint.urls import URLFetchingError
|
||||
|
||||
import debug # pyflakes:ignore
|
||||
|
||||
from ietf.doc.models import ( Document, DocRelationshipName, RelatedDocument, State,
|
||||
|
@ -2867,6 +2869,12 @@ class PdfizedTests(TestCase):
|
|||
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 = [
|
||||
|
|
|
@ -51,7 +51,6 @@ from django.conf import settings
|
|||
from django import forms
|
||||
from django.contrib.staticfiles import finders
|
||||
|
||||
|
||||
import debug # pyflakes:ignore
|
||||
|
||||
from ietf.doc.models import ( Document, DocHistory, DocEvent, BallotDocEvent, BallotType,
|
||||
|
@ -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:
|
||||
|
|
17
ietf/templates/doc/weasyprint_failed.html
Normal file
17
ietf/templates/doc/weasyprint_failed.html
Normal file
|
@ -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 %}
|
Loading…
Reference in a new issue