| """Test that the FileResponse Content-Length patch is applied correctly.""" |
|
|
| import os |
| import tempfile |
|
|
|
|
| def test_fileresponse_no_content_length_with_stat_result(): |
| """FileResponse should not set Content-Length even when stat_result is provided.""" |
| from starlette.responses import FileResponse |
|
|
| with tempfile.NamedTemporaryFile(delete=False, suffix=".zip") as f: |
| f.write(b"x" * 1024) |
| tmp = f.name |
|
|
| try: |
| stat_result = os.stat(tmp) |
| fr = FileResponse(tmp, filename="test.zip", stat_result=stat_result) |
| headers_lower = {k.lower(): v for k, v in fr.headers.items()} |
| assert "content-length" not in headers_lower, ( |
| f"FileResponse should not set Content-Length. Headers: {fr.headers}" |
| ) |
| |
| assert "last-modified" in headers_lower |
| assert "etag" in headers_lower |
| finally: |
| os.unlink(tmp) |
|
|
|
|
| def test_fileresponse_no_content_length_without_stat_result(): |
| """FileResponse should not set Content-Length when stat_result is None.""" |
| from starlette.responses import FileResponse |
|
|
| with tempfile.NamedTemporaryFile(delete=False, suffix=".zip") as f: |
| f.write(b"x" * 512) |
| tmp = f.name |
|
|
| try: |
| fr = FileResponse(tmp, filename="test2.zip", stat_result=None) |
| headers_lower = {k.lower(): v for k, v in fr.headers.items()} |
| assert "content-length" not in headers_lower, ( |
| f"FileResponse should not set Content-Length. Headers: {fr.headers}" |
| ) |
| finally: |
| os.unlink(tmp) |
|
|
|
|
| def test_gradio_modules_use_patched_fileresponse(): |
| """Gradio's route_utils and routes modules should reference the patched FileResponse.""" |
| import gradio.route_utils as ru |
| import gradio.routes as rt |
|
|
| from starlette.responses import FileResponse |
|
|
| if hasattr(ru, "FileResponse"): |
| assert ru.FileResponse is FileResponse, ( |
| f"route_utils.FileResponse is not the patched class: {ru.FileResponse}" |
| ) |
| if hasattr(rt, "FileResponse"): |
| assert rt.FileResponse is FileResponse, ( |
| f"routes.FileResponse is not the patched class: {rt.FileResponse}" |
| ) |
|
|