Fixed bug with download of BLOB null, refs #1050

This commit is contained in:
Simon Willison 2020-10-28 21:05:40 -07:00
commit 89519f9a37
4 changed files with 28 additions and 10 deletions

View file

@ -1083,7 +1083,7 @@ class BlobView(BaseView):
"Content-Disposition": 'attachment; filename="{}"'.format(filename), "Content-Disposition": 'attachment; filename="{}"'.format(filename),
} }
return Response( return Response(
body=rows[0][column], body=rows[0][column] or b"",
status=200, status=200,
headers=headers, headers=headers,
content_type="application/binary", content_type="application/binary",

View file

@ -667,6 +667,7 @@ CREATE VIEW searchable_view_configured_by_metadata AS
TABLE_PARAMETERIZED_SQL = [ TABLE_PARAMETERIZED_SQL = [
("insert into binary_data (data) values (?);", [b"\x15\x1c\x02\xc7\xad\x05\xfe"]), ("insert into binary_data (data) values (?);", [b"\x15\x1c\x02\xc7\xad\x05\xfe"]),
("insert into binary_data (data) values (?);", [b"\x15\x1c\x03\xc7\xad\x05\xfe"]), ("insert into binary_data (data) values (?);", [b"\x15\x1c\x03\xc7\xad\x05\xfe"]),
("insert into binary_data (data) values (null);", []),
] ]
EXTRA_DATABASE_SQL = """ EXTRA_DATABASE_SQL = """

View file

@ -106,7 +106,7 @@ def test_database_page(app_client):
"name": "binary_data", "name": "binary_data",
"columns": ["data"], "columns": ["data"],
"primary_keys": [], "primary_keys": [],
"count": 2, "count": 3,
"hidden": False, "hidden": False,
"fts_table": None, "fts_table": None,
"foreign_keys": {"incoming": [], "outgoing": []}, "foreign_keys": {"incoming": [], "outgoing": []},
@ -1812,6 +1812,7 @@ def test_inspect_file_used_for_count(app_client_immutable_and_inspect_file):
[ [
{"rowid": 1, "data": {"$base64": True, "encoded": "FRwCx60F/g=="}}, {"rowid": 1, "data": {"$base64": True, "encoded": "FRwCx60F/g=="}},
{"rowid": 2, "data": {"$base64": True, "encoded": "FRwDx60F/g=="}}, {"rowid": 2, "data": {"$base64": True, "encoded": "FRwDx60F/g=="}},
{"rowid": 3, "data": None},
], ],
None, None,
), ),
@ -1820,7 +1821,8 @@ def test_inspect_file_used_for_count(app_client_immutable_and_inspect_file):
None, None,
( (
'{"rowid": 1, "data": {"$base64": true, "encoded": "FRwCx60F/g=="}}\n' '{"rowid": 1, "data": {"$base64": true, "encoded": "FRwCx60F/g=="}}\n'
'{"rowid": 2, "data": {"$base64": true, "encoded": "FRwDx60F/g=="}}' '{"rowid": 2, "data": {"$base64": true, "encoded": "FRwDx60F/g=="}}\n'
'{"rowid": 3, "data": null}'
), ),
), ),
], ],

View file

@ -1238,21 +1238,36 @@ def test_binary_data_display(app_client):
'<td class="col-rowid type-int">2</td>', '<td class="col-rowid type-int">2</td>',
'<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/-/blob/2/data.blob">&lt;Binary:\xa07\xa0bytes&gt;</a></td>', '<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/-/blob/2/data.blob">&lt;Binary:\xa07\xa0bytes&gt;</a></td>',
], ],
[
'<td class="col-Link type-pk"><a href="/fixtures/binary_data/3">3</a></td>',
'<td class="col-rowid type-int">3</td>',
'<td class="col-data type-none">\xa0</td>',
],
] ]
assert expected_tds == [ assert expected_tds == [
[str(td) for td in tr.select("td")] for tr in table.select("tbody tr") [str(td) for td in tr.select("td")] for tr in table.select("tbody tr")
] ]
def test_blob_download(app_client): @pytest.mark.parametrize(
response = app_client.get("/fixtures/binary_data/-/blob/1/data.blob") "path,expected_body,expected_filename",
[
(
"/fixtures/binary_data/-/blob/1/data.blob",
b"\x15\x1c\x02\xc7\xad\x05\xfe",
"binary_data-1-data.blob",
),
("/fixtures/binary_data/-/blob/3/data.blob", b"", "binary_data-3-data.blob"),
],
)
def test_blob_download(app_client, path, expected_body, expected_filename):
response = app_client.get(path)
assert response.status == 200 assert response.status == 200
assert response.body == b"\x15\x1c\x02\xc7\xad\x05\xfe" assert response.body == expected_body
assert response.headers["x-content-type-options"] == "nosniff" assert response.headers["x-content-type-options"] == "nosniff"
assert ( assert response.headers[
response.headers["content-disposition"] "content-disposition"
== 'attachment; filename="binary_data-1-data.blob"' ] == 'attachment; filename="{}"'.format(expected_filename)
)
assert response.headers["content-type"] == "application/binary" assert response.headers["content-type"] == "application/binary"