@ -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 . To String( CultureInfo . InvariantC ulture) ;
responseHeaders [ HeaderNames . LastModified ] = lastModifiedDate . Value . To UniversalTime( ) . ToString ( HttpDateFormat , _enUSc ulture) ;
}
}
}
}