diff --git a/datasette/utils/asgi.py b/datasette/utils/asgi.py index 7caa3469..911038ab 100644 --- a/datasette/utils/asgi.py +++ b/datasette/utils/asgi.py @@ -251,7 +251,7 @@ async def asgi_send_file( ): headers = {} if filename: - headers["Content-Disposition"] = 'attachment; filename="{}"'.format(filename) + headers["content-disposition"] = 'attachment; filename="{}"'.format(filename) first = True headers["content-length"] = str((await aiofiles.os.stat(str(filepath))).st_size) async with aiofiles.open(str(filepath), mode="rb") as fp: @@ -402,4 +402,6 @@ class AsgiFileDownload: self.content_type = content_type async def asgi_send(self, send): - return await asgi_send_file(send, self.filepath, content_type=self.content_type) + return await asgi_send_file( + send, self.filepath, filename=self.filename, content_type=self.content_type + ) diff --git a/datasette/views/base.py b/datasette/views/base.py index 399b1a1f..afed31a2 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -337,7 +337,7 @@ class DataView(BaseView): disposition = 'attachment; filename="{}.csv"'.format( kwargs.get("table", database) ) - headers["Content-Disposition"] = disposition + headers["content-disposition"] = disposition return AsgiStream(stream_fn, headers=headers, content_type=content_type) diff --git a/tests/test_csv.py b/tests/test_csv.py index 42022726..86e402b5 100644 --- a/tests/test_csv.py +++ b/tests/test_csv.py @@ -92,7 +92,7 @@ def test_table_csv_download(app_client): assert response.status == 200 assert "text/csv; charset=utf-8" == response.headers["content-type"] expected_disposition = 'attachment; filename="simple_primary_key.csv"' - assert expected_disposition == response.headers["Content-Disposition"] + assert expected_disposition == response.headers["content-disposition"] def test_csv_with_non_ascii_characters(app_client): diff --git a/tests/test_html.py b/tests/test_html.py index e3d3c2fc..346f9ee3 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -913,6 +913,11 @@ def test_database_download_for_immutable(): content_length = download_response.headers["content-length"] assert content_length.isdigit() assert int(content_length) > 100 + assert "content-disposition" in download_response.headers + assert ( + download_response.headers["content-disposition"] + == 'attachment; filename="fixtures.db"' + ) def test_database_download_disallowed_for_mutable(app_client):