Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not strip entity-headers with HTTP status 304 or 412 #2824

Merged
merged 13 commits into from
Jan 9, 2024
19 changes: 0 additions & 19 deletions sanic/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,25 +122,6 @@ def is_hop_by_hop_header(header):
return header.lower() in _HOP_BY_HOP_HEADERS


def remove_entity_headers(headers, allowed=("content-location", "expires")):
"""
Removes all the entity headers present in the headers given.
According to RFC 2616 Section 10.3.5,
Content-Location and Expires are allowed as for the
"strong cache validator".
https://tools.ietf.org/html/rfc2616#section-10.3.5

returns the headers without the entity headers
"""
allowed = set([h.lower() for h in allowed])
headers = {
header: value
for header, value in headers.items()
if not is_entity_header(header) or header.lower() in allowed
}
return headers


def import_string(module_name, package=None):
"""
import a module or class by string path.
Expand Down
4 changes: 0 additions & 4 deletions sanic/response/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
Default,
_default,
has_message_body,
remove_entity_headers,
Tronic marked this conversation as resolved.
Show resolved Hide resolved
)
from sanic.http import Http

Expand Down Expand Up @@ -106,9 +105,6 @@ def processed_headers(self) -> Iterator[Tuple[bytes, bytes]]:
Returns:
Iterator[Tuple[bytes, bytes]]: A list of header tuples encoded in bytes for sending
""" # noqa: E501
# TODO: Make a blacklist set of header names and then filter with that
if self.status in (304, 412): # Not Modified, Precondition Failed
self.headers = remove_entity_headers(self.headers)
ahopkins marked this conversation as resolved.
Show resolved Hide resolved
if has_message_body(self.status):
self.headers.setdefault("content-type", self.content_type)
# Encode headers into bytes
Expand Down
8 changes: 8 additions & 0 deletions tests/test_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,10 @@ async def no_content_unmodified_handler(request: Request):
async def unmodified_handler(request: Request):
return json(JSON_DATA, status=304)

@app.get("/precondition")
async def precondition_handler(request: Request):
return json(JSON_DATA, status=412)

@app.delete("/")
async def delete_handler(request: Request):
return json(None, status=204)
Expand All @@ -193,6 +197,10 @@ def test_json_response(json_app):
assert response.text == json_dumps(JSON_DATA)
assert response.json == JSON_DATA

request, response = json_app.test_client.get("/precondition")
assert response.status == 412
assert response.json == JSON_DATA


def test_no_content(json_app):
request, response = json_app.test_client.get("/no-content")
Expand Down
Loading