mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Fixed bug with download of BLOB null, refs #1050
This commit is contained in:
parent
cefd058c1c
commit
89519f9a37
4 changed files with 28 additions and 10 deletions
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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 = """
|
||||||
|
|
|
||||||
|
|
@ -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}'
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -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"><Binary:\xa07\xa0bytes></a></td>',
|
'<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/-/blob/2/data.blob"><Binary:\xa07\xa0bytes></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"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue