From 07e56850beba99d3a5794a27280b96032880eb1e Mon Sep 17 00:00:00 2001 From: David Date: Wed, 22 Jul 2020 10:39:48 +0200 Subject: [PATCH] Remove caching and content length --- .../Helpers/FileStreamResponseHelpers.cs | 91 +------------------ 1 file changed, 2 insertions(+), 89 deletions(-) diff --git a/Jellyfin.Api/Helpers/FileStreamResponseHelpers.cs b/Jellyfin.Api/Helpers/FileStreamResponseHelpers.cs index e03cafe35d..6ba74d5901 100644 --- a/Jellyfin.Api/Helpers/FileStreamResponseHelpers.cs +++ b/Jellyfin.Api/Helpers/FileStreamResponseHelpers.cs @@ -1,7 +1,5 @@ using System; -using System.Globalization; using System.IO; -using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -10,7 +8,6 @@ using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Model.IO; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Jellyfin.Api.Helpers @@ -35,7 +32,6 @@ namespace Jellyfin.Api.Helpers CancellationTokenSource cancellationTokenSource) { HttpClient httpClient = new HttpClient(); - var responseHeaders = controller.Response.Headers; if (state.RemoteHttpHeaders.TryGetValue(HeaderNames.UserAgent, out var useragent)) { @@ -45,13 +41,7 @@ namespace Jellyfin.Api.Helpers var response = await httpClient.GetAsync(state.MediaPath).ConfigureAwait(false); var contentType = response.Content.Headers.ContentType.ToString(); - responseHeaders[HeaderNames.AcceptRanges] = "none"; - - // Seeing cases of -1 here - if (response.Content.Headers.ContentLength.HasValue && response.Content.Headers.ContentLength.Value >= 0) - { - responseHeaders[HeaderNames.ContentLength] = response.Content.Headers.ContentLength.Value.ToString(CultureInfo.InvariantCulture); - } + controller.Response.Headers[HeaderNames.AcceptRanges] = "none"; if (isHeadRequest) { @@ -74,7 +64,6 @@ namespace Jellyfin.Api.Helpers /// Whether the current request is a HTTP HEAD request so only the headers get returned. /// The managing the response. /// An the file. - // TODO: caching doesn't work public static ActionResult GetStaticFileResult( string path, string contentType, @@ -83,52 +72,7 @@ namespace Jellyfin.Api.Helpers bool isHeadRequest, ControllerBase controller) { - bool disableCaching = false; - if (controller.Request.Headers.TryGetValue(HeaderNames.CacheControl, out StringValues headerValue)) - { - disableCaching = headerValue.FirstOrDefault().Contains("no-cache", StringComparison.InvariantCulture); - } - - bool parsingSuccessful = DateTime.TryParseExact(controller.Request.Headers[HeaderNames.IfModifiedSince], "ddd, dd MMM yyyy HH:mm:ss \"GMT\"", new CultureInfo("en-US", false), DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime ifModifiedSinceHeader); - - // if the parsing of the IfModifiedSince header was not successfull, disable caching - if (!parsingSuccessful) - { - disableCaching = true; - } - controller.Response.ContentType = contentType; - controller.Response.Headers.Add(HeaderNames.Age, Convert.ToInt64((DateTime.UtcNow - dateLastModified).TotalSeconds).ToString(CultureInfo.InvariantCulture)); - controller.Response.Headers.Add(HeaderNames.Vary, HeaderNames.Accept); - - if (disableCaching) - { - controller.Response.Headers.Add(HeaderNames.CacheControl, "no-cache, no-store, must-revalidate"); - controller.Response.Headers.Add(HeaderNames.Pragma, "no-cache, no-store, must-revalidate"); - } - else - { - if (cacheDuration.HasValue) - { - controller.Response.Headers.Add(HeaderNames.CacheControl, "public, max-age=" + cacheDuration.Value.TotalSeconds); - } - else - { - controller.Response.Headers.Add(HeaderNames.CacheControl, "public"); - } - - controller.Response.Headers.Add(HeaderNames.LastModified, dateLastModified.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss \"GMT\"", new CultureInfo("en-US", false))); - - // if the image was not modified since "ifModifiedSinceHeader"-header, return a HTTP status code 304 not modified - if (!(dateLastModified > ifModifiedSinceHeader)) - { - if (ifModifiedSinceHeader.Add(cacheDuration!.Value) < DateTime.UtcNow) - { - controller.Response.StatusCode = StatusCodes.Status304NotModified; - return new ContentResult(); - } - } - } // if the request is a head request, return a NoContent result with the same headers as it would with a GET request if (isHeadRequest) @@ -164,27 +108,13 @@ namespace Jellyfin.Api.Helpers TranscodingJobType transcodingJobType, CancellationTokenSource cancellationTokenSource) { - IHeaderDictionary responseHeaders = controller.Response.Headers; // Use the command line args with a dummy playlist path var outputPath = state.OutputFilePath; - responseHeaders[HeaderNames.AcceptRanges] = "none"; + controller.Response.Headers[HeaderNames.AcceptRanges] = "none"; var contentType = state.GetMimeType(outputPath); - // TODO: The isHeadRequest is only here because ServiceStack will add Content-Length=0 to the response - // TODO (from api-migration): Investigate if this is still neccessary as we migrated away from ServiceStack - var contentLength = state.EstimateContentLength || isHeadRequest ? GetEstimatedContentLength(state) : null; - - if (contentLength.HasValue) - { - responseHeaders[HeaderNames.ContentLength] = contentLength.Value.ToString(CultureInfo.InvariantCulture); - } - else - { - responseHeaders.Remove(HeaderNames.ContentLength); - } - // Headers only if (isHeadRequest) { @@ -215,22 +145,5 @@ namespace Jellyfin.Api.Helpers transcodingLock.Release(); } } - - /// - /// Gets the length of the estimated content. - /// - /// The state. - /// System.Nullable{System.Int64}. - private static long? GetEstimatedContentLength(StreamState state) - { - var totalBitrate = state.TotalOutputBitrate ?? 0; - - if (totalBitrate > 0 && state.RunTimeTicks.HasValue) - { - return Convert.ToInt64(totalBitrate * TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalSeconds / 8); - } - - return null; - } } }