mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-21 05:00:39 +02:00
Added http server support for etags
This commit is contained in:
parent
bd6c2d2a22
commit
19e202d5e1
|
@ -137,6 +137,23 @@ namespace MediaBrowser.Api.HttpHandlers
|
||||||
return date;
|
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
|
private int ImageIndex
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
|
@ -192,6 +192,13 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||||
|
|
||||||
ctx.Response.ContentType = await GetContentType().ConfigureAwait(false);
|
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;
|
TimeSpan cacheDuration = CacheDuration;
|
||||||
|
|
||||||
DateTime? lastDateModified = await GetLastDateModified().ConfigureAwait(false);
|
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 the cache hasn't expired yet just return a 304
|
||||||
if (IsCacheValid(ifModifiedSince.ToUniversalTime(), cacheDuration, lastDateModified))
|
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");
|
response.Headers[HttpResponseHeader.LastModified] = lastModified.ToString("r");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual Task<string> GetETag()
|
||||||
|
{
|
||||||
|
return Task.FromResult<string>(string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gives subclasses a chance to do any prep work, and also to validate data and set an error status code, if needed
|
/// Gives subclasses a chance to do any prep work, and also to validate data and set an error status code, if needed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -83,12 +83,14 @@ namespace MediaBrowser.Controller.Drawing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DateTime testDate = DateTime.UtcNow;
|
||||||
|
|
||||||
public override DateTime ProcessingConfigurationDateLastModifiedUtc
|
public override DateTime ProcessingConfigurationDateLastModifiedUtc
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// This will result in a situation where images are never cached, but again, this is a prototype
|
// This will result in a situation where images are only cached throughout a server session, but again, this is a prototype
|
||||||
return DateTime.UtcNow;
|
return testDate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue