@ -21,7 +21,7 @@ using IRequest = MediaBrowser.Model.Services.IRequest;
using MimeTypes = MediaBrowser . Model . Net . MimeTypes ;
using StreamWriter = Emby . Server . Implementations . HttpServer . StreamWriter ;
namespace MediaBrowser .Server.Implementations.HttpServer
namespace Emby .Server.Implementations.HttpServer
{
/// <summary>
/// Class HttpResultFactory
@ -161,13 +161,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
public static string GetCompressionType ( IRequest request )
{
var prefs = new RequestPreferences ( request ) ;
var acceptEncoding = request . Headers [ "Accept-Encoding" ] ;
if ( prefs . AcceptsDeflate )
return "deflate" ;
if ( ! string . IsNullOrWhiteSpace ( acceptEncoding ) )
{
if ( acceptEncoding . Contains ( "deflate" ) )
return "deflate" ;
if ( prefs . AcceptsGzip )
return "gzip" ;
if ( acceptEncoding . Contains ( "gzip" ) )
return "gzip" ;
}
return null ;
}
@ -187,14 +190,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer
if ( compressionType = = null )
{
var contentType = request . ResponseContentType ;
var contentTypeAttr = ContentFormat . GetEndpointAttributes ( contentType ) ;
switch ( contentTypeAttr )
switch ( GetRealContentType( contentType ) )
{
case RequestAttributes . Xml :
case "application/xml" :
case "text/xml" :
case "text/xml; charset=utf-8" : //"text/xml; charset=utf-8" also matches xml
return SerializeToXmlString ( dto ) ;
case RequestAttributes . Json :
case "application/json" :
case "text/json" :
return _jsonSerializer . SerializeToString ( dto ) ;
}
}
@ -204,7 +209,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
using ( var compressionStream = GetCompressionStream ( ms , compressionType ) )
{
ContentTypes . Instance . SerializeToStream ( request , dto , compressionStream ) ;
compressionStream . Cl ose( ) ;
compressionStream . Disp ose( ) ;
var compressedBytes = ms . ToArray ( ) ;
@ -221,6 +226,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
public static string GetRealContentType ( string contentType )
{
return contentType = = null
? null
: contentType . Split ( ';' ) [ 0 ] . ToLower ( ) . Trim ( ) ;
}
public static string SerializeToXmlString ( object from )
{
using ( var ms = new MemoryStream ( ) )
@ -520,7 +532,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
private bool ShouldCompressResponse ( IRequest requestContext , string contentType )
{
// It will take some work to support compression with byte range requests
if ( ! string . IsNullOrEmpty ( requestContext . Get Header( "Range" ) ) )
if ( ! string . IsNullOrEmpty ( requestContext . Headers. Get ( "Range" ) ) )
{
return false ;
}
@ -573,7 +585,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
if ( ! compress | | string . IsNullOrEmpty ( requestedCompressionType ) )
{
var rangeHeader = requestContext . Get Header( "Range" ) ;
var rangeHeader = requestContext . Headers. Get ( "Range" ) ;
var stream = await factoryFn ( ) . ConfigureAwait ( false ) ;
@ -648,7 +660,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
using ( var zipStream = new DeflateStream ( ms , CompressionMode . Compress ) )
{
zipStream . Write ( bytes , 0 , bytes . Length ) ;
zipStream . Cl ose( ) ;
zipStream . Disp ose( ) ;
return ms . ToArray ( ) ;
}
@ -665,7 +677,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
using ( var zipStream = new GZipStream ( ms , CompressionMode . Compress ) )
{
zipStream . Write ( buffer , 0 , buffer . Length ) ;
zipStream . Cl ose( ) ;
zipStream . Disp ose( ) ;
return ms . ToArray ( ) ;
}
@ -747,7 +759,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
{
var isNotModified = true ;
var ifModifiedSinceHeader = requestContext . Get Header( "If-Modified-Since" ) ;
var ifModifiedSinceHeader = requestContext . Headers. Get ( "If-Modified-Since" ) ;
if ( ! string . IsNullOrEmpty ( ifModifiedSinceHeader ) )
{
@ -759,7 +771,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
}
}
var ifNoneMatchHeader = requestContext . Get Header( "If-None-Match" ) ;
var ifNoneMatchHeader = requestContext . Headers. Get ( "If-None-Match" ) ;
// Validate If-None-Match
if ( isNotModified & & ( cacheKey . HasValue | | ! string . IsNullOrEmpty ( ifNoneMatchHeader ) ) )