From b086f067e9338eb6d4955a4586e79b7e871cb94b Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 9 Mar 2020 18:10:25 +0100 Subject: [PATCH] Use inline disposition. --- backend/src/Squidex.Web/FileCallbackResult.cs | 8 ++++---- .../Pipeline/FileCallbackResultExecutor.cs | 12 +++++++++++- .../Areas/Api/Controllers/Apps/AppsController.cs | 5 ++++- .../Controllers/Assets/AssetContentController.cs | 14 +++++++------- .../Controllers/Backups/BackupContentController.cs | 2 +- .../Api/Controllers/Statistics/UsagesController.cs | 2 +- .../Areas/Api/Controllers/Users/UsersController.cs | 2 +- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/backend/src/Squidex.Web/FileCallbackResult.cs b/backend/src/Squidex.Web/FileCallbackResult.cs index 83b29268b..1f30a9146 100644 --- a/backend/src/Squidex.Web/FileCallbackResult.cs +++ b/backend/src/Squidex.Web/FileCallbackResult.cs @@ -17,19 +17,19 @@ namespace Squidex.Web { public sealed class FileCallbackResult : FileResult { - public bool Send404 { get; } + public bool Send404 { get; set; } + + public bool SendInline { get; set; } public Func Callback { get; } - public FileCallbackResult(string contentType, string? name, bool send404, Func callback) + public FileCallbackResult(string contentType, string? name, Func callback) : base(contentType) { Guard.NotNull(callback); FileDownloadName = name; - Send404 = send404; - Callback = callback; } diff --git a/backend/src/Squidex.Web/Pipeline/FileCallbackResultExecutor.cs b/backend/src/Squidex.Web/Pipeline/FileCallbackResultExecutor.cs index fc8b011d7..3e6a9305b 100644 --- a/backend/src/Squidex.Web/Pipeline/FileCallbackResultExecutor.cs +++ b/backend/src/Squidex.Web/Pipeline/FileCallbackResultExecutor.cs @@ -10,13 +10,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; +using Microsoft.Net.Http.Headers; namespace Squidex.Web.Pipeline { public sealed class FileCallbackResultExecutor : FileResultExecutorBase { public FileCallbackResultExecutor(ILoggerFactory loggerFactory) - : base(CreateLogger(loggerFactory)) + : base(CreateLogger(loggerFactory)) { } @@ -26,6 +27,15 @@ namespace Squidex.Web.Pipeline { SetHeadersAndLog(context, result, null, false); + if (!string.IsNullOrWhiteSpace(result.FileDownloadName) && result.SendInline) + { + var headerValue = new ContentDispositionHeaderValue("inline"); + + headerValue.SetHttpFileName(result.FileDownloadName); + + context.HttpContext.Response.Headers[HeaderNames.ContentDisposition] = headerValue.ToString(); + } + await result.Callback(context.HttpContext.Response.Body); } catch (Exception e) diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs index 1ac09cb43..ffc795d40 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs @@ -250,7 +250,10 @@ namespace Squidex.Areas.Api.Controllers.Apps } }); - return new FileCallbackResult(App.Image.MimeType, null, true, handler); + return new FileCallbackResult(App.Image.MimeType, null, handler) + { + Send404 = true + }; } /// diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index 1b3036e4a..7cc78a78d 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -164,14 +164,14 @@ namespace Squidex.Areas.Api.Controllers.Assets } }); - if (query.Download == 1) - { - return new FileCallbackResult(asset.MimeType, asset.FileName, true, handler); - } - else + var inline = query.Download != 1; + + return new FileCallbackResult(asset.MimeType, asset.FileName, handler) { - return new FileCallbackResult(asset.MimeType, null, true, handler); - } + LastModified = asset.LastModified.ToDateTimeOffset(), + Send404 = true, + SendInline = inline, + }; } private async Task ResizeAsync(IAssetEntity asset, Stream bodyStream, string fileName, long fileVersion, ResizeOptions resizeOptions, bool overwrite) diff --git a/backend/src/Squidex/Areas/Api/Controllers/Backups/BackupContentController.cs b/backend/src/Squidex/Areas/Api/Controllers/Backups/BackupContentController.cs index ef1193462..be9b65c6c 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Backups/BackupContentController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Backups/BackupContentController.cs @@ -59,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Backups var fileName = $"backup-{app}-{backup.Started:yyyy-MM-dd_HH-mm-ss}.zip"; - return new FileCallbackResult("application/zip", fileName, false, bodyStream => + return new FileCallbackResult("application/zip", fileName, bodyStream => { return backupArchiveStore.DownloadAsync(id, bodyStream); }); diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs index 4740aa854..58816eec5 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs @@ -174,7 +174,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics var today = DateTime.UtcNow.Date; - return new FileCallbackResult("text/csv", $"Usage-{today:yyy-MM-dd}.csv", false, stream => + return new FileCallbackResult("text/csv", $"Usage-{today:yyy-MM-dd}.csv", stream => { return appLogStore.ReadLogAsync(Guid.Parse(appId), today.AddDays(-30), today, stream); }); diff --git a/backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs b/backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs index 0b8b9c778..573b861dd 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs @@ -164,7 +164,7 @@ namespace Squidex.Areas.Api.Controllers.Users { if (entity.IsPictureUrlStored()) { - return new FileCallbackResult("image/png", null, false, async stream => + return new FileCallbackResult("image/png", null, async stream => { try {