* `headers` - Any custom headers to include, as a dictionary.
* `media_type` - A string giving the media type. If unset, the filename or path will be used to infer a media type.
* `filename` - If set, this will be included in the response `Content-Disposition`.
+* `content_disposition_type` - will be included in the response `Content-Disposition`. Can be set to "attachment" (default) or "inline".
File responses will include appropriate `Content-Length`, `Last-Modified` and `ETag` headers.
filename: str = None,
stat_result: os.stat_result = None,
method: str = None,
+ content_disposition_type: str = "attachment",
) -> None:
self.path = path
self.status_code = status_code
if self.filename is not None:
content_disposition_filename = quote(self.filename)
if content_disposition_filename != self.filename:
- content_disposition = "attachment; filename*=utf-8''{}".format(
- content_disposition_filename
+ content_disposition = "{}; filename*=utf-8''{}".format(
+ content_disposition_type, content_disposition_filename
)
else:
- content_disposition = f'attachment; filename="{self.filename}"'
+ content_disposition = '{}; filename="{}"'.format(
+ content_disposition_type, self.filename
+ )
self.headers.setdefault("content-disposition", content_disposition)
self.stat_result = stat_result
if stat_result is not None:
assert response.headers["content-disposition"] == expected_disposition
+def test_file_response_with_inline_disposition(tmpdir, test_client_factory):
+ content = b"file content"
+ filename = "hello.txt"
+ path = os.path.join(tmpdir, filename)
+ with open(path, "wb") as f:
+ f.write(content)
+ app = FileResponse(path=path, filename=filename, content_disposition_type="inline")
+ client = test_client_factory(app)
+ response = client.get("/")
+ expected_disposition = 'inline; filename="hello.txt"'
+ assert response.status_code == status.HTTP_200_OK
+ assert response.content == content
+ assert response.headers["content-disposition"] == expected_disposition
+
+
def test_set_cookie(test_client_factory):
async def app(scope, receive, send):
response = Response("Hello, world!", media_type="text/plain")