Added http server support for etags

This commit is contained in:
LukePulverenti Luke Pulverenti luke pulverenti 2012-09-18 18:50:26 -04:00
parent bd6c2d2a22
commit 19e202d5e1
3 changed files with 38 additions and 3 deletions

View file

@ -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

View file

@ -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>

View file

@ -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;
}
}