Browse Source

Added http server support for etags

LukePulverenti Luke Pulverenti luke pulverenti 12 years ago
parent
commit
19e202d5e1

+ 17 - 0
MediaBrowser.Api/HttpHandlers/ImageHandler.cs

@@ -137,6 +137,23 @@ namespace MediaBrowser.Api.HttpHandlers
             return date;
         }
 
+        protected override async Task<string> GetETag()
+        {
+            string tag = string.Empty;
+
+            var entity = await GetSourceEntity().ConfigureAwait(false);
+
+            foreach (var processor in Kernel.Instance.ImageProcessors)
+            {
+                if (processor.IsConfiguredToProcess(entity, ImageType, ImageIndex))
+                {
+                    tag += processor.ProcessingConfigurationDateLastModifiedUtc.Ticks.ToString();
+                }
+            }
+
+            return tag;
+        }
+
         private int ImageIndex
         {
             get

+ 17 - 1
MediaBrowser.Common/Net/Handlers/BaseHandler.cs

@@ -192,6 +192,13 @@ namespace MediaBrowser.Common.Net.Handlers
 
                 ctx.Response.ContentType = await GetContentType().ConfigureAwait(false);
 
+                string etag = await GetETag().ConfigureAwait(false);
+
+                if (!string.IsNullOrEmpty(etag))
+                {
+                    ctx.Response.Headers["ETag"] = etag;
+                }
+
                 TimeSpan cacheDuration = CacheDuration;
 
                 DateTime? lastDateModified = await GetLastDateModified().ConfigureAwait(false);
@@ -205,7 +212,11 @@ namespace MediaBrowser.Common.Net.Handlers
                         // If the cache hasn't expired yet just return a 304
                         if (IsCacheValid(ifModifiedSince.ToUniversalTime(), cacheDuration, lastDateModified))
                         {
-                            StatusCode = 304;
+                            // ETag must also match (if supplied)
+                            if ((etag ?? string.Empty).Equals(ctx.Request.Headers["If-None-Match"] ?? string.Empty))
+                            {
+                                StatusCode = 304;
+                            }
                         }
                     }
                 }
@@ -311,6 +322,11 @@ namespace MediaBrowser.Common.Net.Handlers
             response.Headers[HttpResponseHeader.LastModified] = lastModified.ToString("r");
         }
 
+        protected virtual Task<string> GetETag()
+        {
+            return Task.FromResult<string>(string.Empty);
+        }
+
         /// <summary>
         /// Gives subclasses a chance to do any prep work, and also to validate data and set an error status code, if needed
         /// </summary>

+ 4 - 2
MediaBrowser.Controller/Drawing/BaseImageProcessor.cs

@@ -83,12 +83,14 @@ namespace MediaBrowser.Controller.Drawing
             }
         }
 
+        private static DateTime testDate = DateTime.UtcNow;
+
         public override DateTime ProcessingConfigurationDateLastModifiedUtc
         {
             get
             {
-                // This will result in a situation where images are never cached, but again, this is a prototype
-                return DateTime.UtcNow;
+                // This will result in a situation where images are only cached throughout a server session, but again, this is a prototype
+                return testDate;
             }
         }