populate_content_length = b"content-length" not in keys
populate_content_type = b"content-type" not in keys
- body = getattr(self, "body", b"")
- if body and populate_content_length:
+ body = getattr(self, "body", None)
+ if body is not None and populate_content_length:
content_length = str(len(body))
raw_headers.append((b"content-length", content_length.encode("latin-1")))
Response,
StreamingResponse,
)
+from starlette.testclient import TestClient
def test_text_response(test_client_factory):
assert response.url == "http://testserver/I%20%E2%99%A5%20Starlette/"
+def test_redirect_response_content_length_header(test_client_factory):
+ async def app(scope, receive, send):
+ if scope["path"] == "/":
+ response = Response("hello", media_type="text/plain") # pragma: nocover
+ else:
+ response = RedirectResponse("/")
+ await response(scope, receive, send)
+
+ client: TestClient = test_client_factory(app)
+ response = client.request("GET", "/redirect", allow_redirects=False)
+ assert response.url == "http://testserver/redirect"
+ assert response.headers["content-length"] == "0"
+
+
def test_streaming_response(test_client_factory):
filled_by_bg_task = ""
client = test_client_factory(app)
response = client.head("/")
assert response.text == ""
+
+
+def test_empty_response(test_client_factory):
+ app = Response()
+ client: TestClient = test_client_factory(app)
+ response = client.get("/")
+ assert response.headers["content-length"] == "0"
+
+
+def test_non_empty_response(test_client_factory):
+ app = Response(content="hi")
+ client: TestClient = test_client_factory(app)
+ response = client.get("/")
+ assert response.headers["content-length"] == "2"
+
+
+def test_file_response_known_size(tmpdir, test_client_factory):
+ path = os.path.join(tmpdir, "xyz")
+ content = b"<file content>" * 1000
+ with open(path, "wb") as file:
+ file.write(content)
+
+ app = FileResponse(path=path, filename="example.png")
+ client: TestClient = test_client_factory(app)
+ response = client.get("/")
+ assert response.headers["content-length"] == str(len(content))
+
+
+def test_streaming_response_unknown_size(test_client_factory):
+ app = StreamingResponse(content=iter(["hello", "world"]))
+ client: TestClient = test_client_factory(app)
+ response = client.get("/")
+ assert "content-length" not in response.headers
+
+
+def test_streaming_response_known_size(test_client_factory):
+ app = StreamingResponse(
+ content=iter(["hello", "world"]), headers={"content-length": "10"}
+ )
+ client: TestClient = test_client_factory(app)
+ response = client.get("/")
+ assert response.headers["content-length"] == "10"