浏览代码

Merge pull request #2864 from JustAMan/fix-caching

Make Last-Modified and If-Modified-Since headers follow the spec

(cherry picked from commit 1f28d49fc70c16f7eedf04cc1c01af77a37cd89b)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
dkanada 5 年之前
父节点
当前提交
3044dfc114
共有 1 个文件被更改,包括 12 次插入2 次删除
  1. 12 2
      Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

+ 12 - 2
Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

@@ -29,6 +29,12 @@ namespace Emby.Server.Implementations.HttpServer
     /// </summary>
     /// </summary>
     public class HttpResultFactory : IHttpResultFactory
     public class HttpResultFactory : IHttpResultFactory
     {
     {
+        // Last-Modified and If-Modified-Since must follow strict date format,
+        // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since
+        private const string HttpDateFormat = "ddd, dd MMM yyyy HH:mm:ss \"GMT\"";
+        // We specifically use en-US culture because both day of week and month names require it
+        private static readonly CultureInfo _enUSculture = new CultureInfo("en-US", false);
+
         /// <summary>
         /// <summary>
         /// The logger.
         /// The logger.
         /// </summary>
         /// </summary>
@@ -421,7 +427,11 @@ namespace Emby.Server.Implementations.HttpServer
 
 
             if (!noCache)
             if (!noCache)
             {
             {
-                DateTime.TryParse(requestContext.Headers[HeaderNames.IfModifiedSince], out var ifModifiedSinceHeader);
+                if (!DateTime.TryParseExact(requestContext.Headers[HeaderNames.IfModifiedSince], HttpDateFormat, _enUSculture, DateTimeStyles.AssumeUniversal, out var ifModifiedSinceHeader))
+                {
+                    _logger.LogDebug("Failed to parse If-Modified-Since header date: {0}", requestContext.Headers[HeaderNames.IfModifiedSince]);
+                    return null;
+                }
 
 
                 if (IsNotModified(ifModifiedSinceHeader, options.CacheDuration, options.DateLastModified))
                 if (IsNotModified(ifModifiedSinceHeader, options.CacheDuration, options.DateLastModified))
                 {
                 {
@@ -630,7 +640,7 @@ namespace Emby.Server.Implementations.HttpServer
 
 
             if (lastModifiedDate.HasValue)
             if (lastModifiedDate.HasValue)
             {
             {
-                responseHeaders[HeaderNames.LastModified] = lastModifiedDate.Value.ToString(CultureInfo.InvariantCulture);
+                responseHeaders[HeaderNames.LastModified] = lastModifiedDate.Value.ToUniversalTime().ToString(HttpDateFormat, _enUSculture);
             }
             }
         }
         }