Resolve headers on different renderers - Issue 2749 (#2774)

* Resolve headers on different renderers - Issue 2749

* Make pretty
This commit is contained in:
Adam Hopkins 2023-07-09 09:57:22 +03:00 committed by GitHub
parent c17230ef94
commit c21999a248
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 10 deletions

View File

@ -92,8 +92,10 @@ class BaseRenderer:
self.full self.full
if self.debug and not getattr(self.exception, "quiet", False) if self.debug and not getattr(self.exception, "quiet", False)
else self.minimal else self.minimal
) )()
return output() output.status = self.status
output.headers.update(self.headers)
return output
def minimal(self) -> HTTPResponse: # noqa def minimal(self) -> HTTPResponse: # noqa
""" """
@ -125,7 +127,7 @@ class HTMLRenderer(BaseRenderer):
request=self.request, request=self.request,
exc=self.exception, exc=self.exception,
) )
return html(page.render(), status=self.status, headers=self.headers) return html(page.render())
def minimal(self) -> HTTPResponse: def minimal(self) -> HTTPResponse:
return self.full() return self.full()
@ -146,8 +148,7 @@ class TextRenderer(BaseRenderer):
text=self.text, text=self.text,
bar=("=" * len(self.title)), bar=("=" * len(self.title)),
body=self._generate_body(full=True), body=self._generate_body(full=True),
), )
status=self.status,
) )
def minimal(self) -> HTTPResponse: def minimal(self) -> HTTPResponse:
@ -157,9 +158,7 @@ class TextRenderer(BaseRenderer):
text=self.text, text=self.text,
bar=("=" * len(self.title)), bar=("=" * len(self.title)),
body=self._generate_body(full=False), body=self._generate_body(full=False),
), )
status=self.status,
headers=self.headers,
) )
@property @property
@ -218,11 +217,11 @@ class JSONRenderer(BaseRenderer):
def full(self) -> HTTPResponse: def full(self) -> HTTPResponse:
output = self._generate_output(full=True) output = self._generate_output(full=True)
return json(output, status=self.status, dumps=self.dumps) return json(output, dumps=self.dumps)
def minimal(self) -> HTTPResponse: def minimal(self) -> HTTPResponse:
output = self._generate_output(full=False) output = self._generate_output(full=False)
return json(output, status=self.status, dumps=self.dumps) return json(output, dumps=self.dumps)
def _generate_output(self, *, full): def _generate_output(self, *, full):
output = { output = {

View File

@ -527,3 +527,26 @@ def test_guess_mime_logging(
] ]
assert logmsg == expected assert logmsg == expected
@pytest.mark.parametrize(
"format,expected",
(
("html", "text/html; charset=utf-8"),
("text", "text/plain; charset=utf-8"),
("json", "application/json"),
),
)
def test_exception_header_on_renderers(app: Sanic, format, expected):
app.config.FALLBACK_ERROR_FORMAT = format
@app.get("/test")
def test(request):
raise SanicException(
"test", status_code=400, headers={"exception": "test"}
)
_, response = app.test_client.get("/test")
assert response.status == 400
assert response.headers.get("exception") == "test"
assert response.content_type == expected