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:
Paul Selkirk 2023-12-27 12:56:38 -05:00 committed by GitHub
parent 288b69d0f3
commit 748bcc328f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 2 deletions

View file

@ -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

View file

@ -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 = [

View file

@ -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:

View 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 %}