mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-08 23:00:51 +02:00
Cleanup some small things
This commit is contained in:
parent
b27315bc08
commit
07a8e49c4b
|
@ -238,7 +238,6 @@ namespace Emby.Server.Implementations
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
|
||||||
#if BETA
|
#if BETA
|
||||||
return PackageVersionClass.Beta;
|
return PackageVersionClass.Beta;
|
||||||
#endif
|
#endif
|
||||||
|
@ -552,7 +551,7 @@ namespace Emby.Server.Implementations
|
||||||
protected void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
|
protected void RegisterSingleInstance<T>(T obj, bool manageLifetime = true)
|
||||||
where T : class
|
where T : class
|
||||||
{
|
{
|
||||||
Container.RegisterSingleton(obj);
|
Container.RegisterInstance<T>(obj);
|
||||||
|
|
||||||
if (manageLifetime)
|
if (manageLifetime)
|
||||||
{
|
{
|
||||||
|
@ -617,7 +616,7 @@ namespace Emby.Server.Implementations
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, "Error loading assembly {file}", file);
|
Logger.LogError(ex, "Error loading assembly {File}", file);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -389,7 +389,7 @@ namespace Emby.Server.Implementations.HttpClientManager
|
||||||
{
|
{
|
||||||
options.ResourcePool?.Release();
|
options.ResourcePool?.Release();
|
||||||
|
|
||||||
throw new HttpException(string.Format("Connection to {0} timed out", options.Url)) { IsTimedOut = true };
|
throw new HttpException($"Connection to {options.Url} timed out") { IsTimedOut = true };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.LogRequest)
|
if (options.LogRequest)
|
||||||
|
|
|
@ -1,27 +1,28 @@
|
||||||
using MediaBrowser.Common.Extensions;
|
|
||||||
using MediaBrowser.Controller.Configuration;
|
|
||||||
using MediaBrowser.Controller.Net;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Sockets;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Emby.Server.Implementations.Net;
|
||||||
using Emby.Server.Implementations.Services;
|
using Emby.Server.Implementations.Services;
|
||||||
|
using MediaBrowser.Common.Extensions;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
using MediaBrowser.Common.Security;
|
using MediaBrowser.Common.Security;
|
||||||
using MediaBrowser.Controller;
|
using MediaBrowser.Controller;
|
||||||
|
using MediaBrowser.Controller.Configuration;
|
||||||
|
using MediaBrowser.Controller.Net;
|
||||||
|
using MediaBrowser.Model.Events;
|
||||||
using MediaBrowser.Model.Extensions;
|
using MediaBrowser.Model.Extensions;
|
||||||
using MediaBrowser.Model.Serialization;
|
using MediaBrowser.Model.Serialization;
|
||||||
using MediaBrowser.Model.Services;
|
using MediaBrowser.Model.Services;
|
||||||
using MediaBrowser.Model.Text;
|
using MediaBrowser.Model.Text;
|
||||||
using System.Net.Sockets;
|
using Microsoft.Extensions.Logging;
|
||||||
using Emby.Server.Implementations.Net;
|
|
||||||
using MediaBrowser.Model.Events;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.HttpServer
|
namespace Emby.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
|
@ -55,40 +56,33 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
|
private IWebSocketListener[] _webSocketListeners = Array.Empty<IWebSocketListener>();
|
||||||
private readonly List<IWebSocketConnection> _webSocketConnections = new List<IWebSocketConnection>();
|
private readonly List<IWebSocketConnection> _webSocketConnections = new List<IWebSocketConnection>();
|
||||||
|
|
||||||
public HttpListenerHost(IServerApplicationHost applicationHost,
|
public HttpListenerHost(
|
||||||
|
IServerApplicationHost applicationHost,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
IServerConfigurationManager config,
|
IServerConfigurationManager config,
|
||||||
string defaultRedirectPath, INetworkManager networkManager, ITextEncoding textEncoding, IJsonSerializer jsonSerializer, IXmlSerializer xmlSerializer, Func<Type, Func<string, object>> funcParseFn)
|
string defaultRedirectPath,
|
||||||
|
INetworkManager networkManager,
|
||||||
|
ITextEncoding textEncoding,
|
||||||
|
IJsonSerializer jsonSerializer,
|
||||||
|
IXmlSerializer xmlSerializer,
|
||||||
|
Func<Type, Func<string, object>> funcParseFn)
|
||||||
{
|
{
|
||||||
Instance = this;
|
|
||||||
|
|
||||||
_appHost = applicationHost;
|
_appHost = applicationHost;
|
||||||
|
_logger = logger;
|
||||||
|
_config = config;
|
||||||
DefaultRedirectPath = defaultRedirectPath;
|
DefaultRedirectPath = defaultRedirectPath;
|
||||||
_networkManager = networkManager;
|
_networkManager = networkManager;
|
||||||
_textEncoding = textEncoding;
|
_textEncoding = textEncoding;
|
||||||
_jsonSerializer = jsonSerializer;
|
_jsonSerializer = jsonSerializer;
|
||||||
_xmlSerializer = xmlSerializer;
|
_xmlSerializer = xmlSerializer;
|
||||||
_config = config;
|
|
||||||
|
|
||||||
_logger = logger;
|
|
||||||
_funcParseFn = funcParseFn;
|
_funcParseFn = funcParseFn;
|
||||||
|
|
||||||
ResponseFilters = new Action<IRequest, IResponse, object>[] { };
|
Instance = this;
|
||||||
|
ResponseFilters = Array.Empty<Action<IRequest, IResponse, object>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GlobalResponse { get; set; }
|
public string GlobalResponse { get; set; }
|
||||||
|
|
||||||
readonly Dictionary<Type, int> _mapExceptionToStatusCode = new Dictionary<Type, int>
|
|
||||||
{
|
|
||||||
{typeof (ResourceNotFoundException), 404},
|
|
||||||
{typeof (RemoteServiceUnavailableException), 502},
|
|
||||||
{typeof (FileNotFoundException), 404},
|
|
||||||
//{typeof (DirectoryNotFoundException), 404},
|
|
||||||
{typeof (SecurityException), 401},
|
|
||||||
{typeof (PaymentRequiredException), 402},
|
|
||||||
{typeof (ArgumentException), 400}
|
|
||||||
};
|
|
||||||
|
|
||||||
protected ILogger Logger
|
protected ILogger Logger
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -111,9 +105,9 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
//Exec all RequestFilter attributes with Priority < 0
|
//Exec all RequestFilter attributes with Priority < 0
|
||||||
var attributes = GetRequestFilterAttributes(requestDto.GetType());
|
var attributes = GetRequestFilterAttributes(requestDto.GetType());
|
||||||
var i = 0;
|
|
||||||
var count = attributes.Count;
|
|
||||||
|
|
||||||
|
int count = attributes.Count;
|
||||||
|
int i = 0;
|
||||||
for (; i < count && attributes[i].Priority < 0; i++)
|
for (; i < count && attributes[i].Priority < 0; i++)
|
||||||
{
|
{
|
||||||
var attribute = attributes[i];
|
var attribute = attributes[i];
|
||||||
|
@ -176,10 +170,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
_webSocketConnections.Add(connection);
|
_webSocketConnections.Add(connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WebSocketConnected != null)
|
WebSocketConnected?.Invoke(this, new GenericEventArgs<IWebSocketConnection>(connection));
|
||||||
{
|
|
||||||
WebSocketConnected?.Invoke(this, new GenericEventArgs<IWebSocketConnection>(connection));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Connection_Closed(object sender, EventArgs e)
|
private void Connection_Closed(object sender, EventArgs e)
|
||||||
|
@ -192,8 +183,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private Exception GetActualException(Exception ex)
|
private Exception GetActualException(Exception ex)
|
||||||
{
|
{
|
||||||
var agg = ex as AggregateException;
|
if (ex is AggregateException agg)
|
||||||
if (agg != null)
|
|
||||||
{
|
{
|
||||||
var inner = agg.InnerException;
|
var inner = agg.InnerException;
|
||||||
if (inner != null)
|
if (inner != null)
|
||||||
|
@ -215,27 +205,17 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private int GetStatusCode(Exception ex)
|
private int GetStatusCode(Exception ex)
|
||||||
{
|
{
|
||||||
if (ex is ArgumentException)
|
switch (ex)
|
||||||
{
|
{
|
||||||
return 400;
|
case ArgumentException _: return 400;
|
||||||
|
case SecurityException _: return 401;
|
||||||
|
case PaymentRequiredException _: return 402;
|
||||||
|
case DirectoryNotFoundException _:
|
||||||
|
case FileNotFoundException _:
|
||||||
|
case ResourceNotFoundException _: return 404;
|
||||||
|
case RemoteServiceUnavailableException _: return 502;
|
||||||
|
default: return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
var exceptionType = ex.GetType();
|
|
||||||
|
|
||||||
int statusCode;
|
|
||||||
if (!_mapExceptionToStatusCode.TryGetValue(exceptionType, out statusCode))
|
|
||||||
{
|
|
||||||
if (ex is DirectoryNotFoundException)
|
|
||||||
{
|
|
||||||
statusCode = 404;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
statusCode = 500;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return statusCode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ErrorHandler(Exception ex, IRequest httpReq, bool logExceptionStackTrace, bool logExceptionMessage)
|
private async Task ErrorHandler(Exception ex, IRequest httpReq, bool logExceptionStackTrace, bool logExceptionMessage)
|
||||||
|
@ -321,29 +301,22 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Dictionary<string, int> _skipLogExtensions = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
|
private static readonly string[] _skipLogExtensions =
|
||||||
{
|
{
|
||||||
{".js", 0},
|
".js",
|
||||||
{".css", 0},
|
".css",
|
||||||
{".woff", 0},
|
".woff",
|
||||||
{".woff2", 0},
|
".woff2",
|
||||||
{".ttf", 0},
|
".ttf",
|
||||||
{".html", 0}
|
".html"
|
||||||
};
|
};
|
||||||
|
|
||||||
private bool EnableLogging(string url, string localPath)
|
private bool EnableLogging(string url, string localPath)
|
||||||
{
|
{
|
||||||
var extension = GetExtension(url);
|
var extension = GetExtension(url);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(extension) || !_skipLogExtensions.ContainsKey(extension))
|
return ((string.IsNullOrEmpty(extension) || !_skipLogExtensions.Contains(extension))
|
||||||
{
|
&& (string.IsNullOrEmpty(localPath) || localPath.IndexOf("system/ping", StringComparison.OrdinalIgnoreCase) == -1));
|
||||||
if (string.IsNullOrEmpty(localPath) || localPath.IndexOf("system/ping", StringComparison.OrdinalIgnoreCase) == -1)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetExtension(string url)
|
private string GetExtension(string url)
|
||||||
|
@ -566,9 +539,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.Equals(localPath, "/mediabrowser/", StringComparison.OrdinalIgnoreCase) ||
|
if (localPath.IndexOf("mediabrowser/web", StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
string.Equals(localPath, "/mediabrowser", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
localPath.IndexOf("mediabrowser/web", StringComparison.OrdinalIgnoreCase) != -1)
|
|
||||||
{
|
{
|
||||||
httpRes.StatusCode = 200;
|
httpRes.StatusCode = 200;
|
||||||
httpRes.ContentType = "text/html";
|
httpRes.ContentType = "text/html";
|
||||||
|
@ -723,7 +694,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogError("Could not find handler for {pathInfo}", pathInfo);
|
_logger.LogError("Could not find handler for {PathInfo}", pathInfo);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -737,14 +708,13 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private void RedirectToSecureUrl(IHttpRequest httpReq, IResponse httpRes, string url)
|
private void RedirectToSecureUrl(IHttpRequest httpReq, IResponse httpRes, string url)
|
||||||
{
|
{
|
||||||
int currentPort;
|
if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri))
|
||||||
Uri uri;
|
|
||||||
if (Uri.TryCreate(url, UriKind.Absolute, out uri))
|
|
||||||
{
|
{
|
||||||
currentPort = uri.Port;
|
var builder = new UriBuilder(uri)
|
||||||
var builder = new UriBuilder(uri);
|
{
|
||||||
builder.Port = _config.Configuration.PublicHttpsPort;
|
Port = _config.Configuration.PublicHttpsPort,
|
||||||
builder.Scheme = "https";
|
Scheme = "https"
|
||||||
|
};
|
||||||
url = builder.Uri.ToString();
|
url = builder.Uri.ToString();
|
||||||
|
|
||||||
RedirectToUrl(httpRes, url);
|
RedirectToUrl(httpRes, url);
|
||||||
|
@ -844,12 +814,6 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
public Task<object> DeserializeJson(Type type, Stream stream)
|
public Task<object> DeserializeJson(Type type, Stream stream)
|
||||||
{
|
{
|
||||||
//using (var reader = new StreamReader(stream))
|
|
||||||
//{
|
|
||||||
// var json = reader.ReadToEnd();
|
|
||||||
// logger.LogInformation(json);
|
|
||||||
// return _jsonSerializer.DeserializeFromString(json, type);
|
|
||||||
//}
|
|
||||||
return _jsonSerializer.DeserializeFromStreamAsync(stream, type);
|
return _jsonSerializer.DeserializeFromStreamAsync(stream, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -412,8 +412,10 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
serializer.WriteObject(xw, from);
|
serializer.WriteObject(xw, from);
|
||||||
xw.Flush();
|
xw.Flush();
|
||||||
ms.Seek(0, SeekOrigin.Begin);
|
ms.Seek(0, SeekOrigin.Begin);
|
||||||
var reader = new StreamReader(ms);
|
using (var reader = new StreamReader(ms))
|
||||||
return reader.ReadToEnd();
|
{
|
||||||
|
return reader.ReadToEnd();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,7 +427,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
{
|
{
|
||||||
responseHeaders["ETag"] = string.Format("\"{0}\"", cacheKeyString);
|
responseHeaders["ETag"] = string.Format("\"{0}\"", cacheKeyString);
|
||||||
|
|
||||||
var noCache = (requestContext.Headers.Get("Cache-Control") ?? string.Empty).IndexOf("no-cache", StringComparison.OrdinalIgnoreCase) != -1;
|
bool noCache = (requestContext.Headers.Get("Cache-Control") ?? string.Empty).IndexOf("no-cache", StringComparison.OrdinalIgnoreCase) != -1;
|
||||||
|
|
||||||
if (!noCache)
|
if (!noCache)
|
||||||
{
|
{
|
||||||
|
@ -463,8 +465,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<object> GetStaticFileResult(IRequest requestContext,
|
public Task<object> GetStaticFileResult(IRequest requestContext, StaticFileResultOptions options)
|
||||||
StaticFileResultOptions options)
|
|
||||||
{
|
{
|
||||||
var path = options.Path;
|
var path = options.Path;
|
||||||
var fileShare = options.FileShare;
|
var fileShare = options.FileShare;
|
||||||
|
@ -699,36 +700,26 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
|
|
||||||
var ifModifiedSinceHeader = requestContext.Headers.Get("If-Modified-Since");
|
var ifModifiedSinceHeader = requestContext.Headers.Get("If-Modified-Since");
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(ifModifiedSinceHeader))
|
if (!string.IsNullOrEmpty(ifModifiedSinceHeader)
|
||||||
|
&& DateTime.TryParse(ifModifiedSinceHeader, out DateTime ifModifiedSince)
|
||||||
|
&& IsNotModified(ifModifiedSince.ToUniversalTime(), cacheDuration, lastDateModified))
|
||||||
{
|
{
|
||||||
DateTime ifModifiedSince;
|
return true;
|
||||||
|
|
||||||
if (DateTime.TryParse(ifModifiedSinceHeader, out ifModifiedSince))
|
|
||||||
{
|
|
||||||
if (IsNotModified(ifModifiedSince.ToUniversalTime(), cacheDuration, lastDateModified))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ifNoneMatchHeader = requestContext.Headers.Get("If-None-Match");
|
var ifNoneMatchHeader = requestContext.Headers.Get("If-None-Match");
|
||||||
|
|
||||||
var hasCacheKey = !cacheKey.Equals(Guid.Empty);
|
bool hasCacheKey = !cacheKey.Equals(Guid.Empty);
|
||||||
|
|
||||||
// Validate If-None-Match
|
// Validate If-None-Match
|
||||||
if ((hasCacheKey || !string.IsNullOrEmpty(ifNoneMatchHeader)))
|
if ((hasCacheKey && !string.IsNullOrEmpty(ifNoneMatchHeader)))
|
||||||
{
|
{
|
||||||
Guid ifNoneMatch;
|
|
||||||
|
|
||||||
ifNoneMatchHeader = (ifNoneMatchHeader ?? string.Empty).Trim('\"');
|
ifNoneMatchHeader = (ifNoneMatchHeader ?? string.Empty).Trim('\"');
|
||||||
|
|
||||||
if (Guid.TryParse(ifNoneMatchHeader, out ifNoneMatch))
|
if (Guid.TryParse(ifNoneMatchHeader, out Guid ifNoneMatch)
|
||||||
|
&& cacheKey.Equals(ifNoneMatch))
|
||||||
{
|
{
|
||||||
if (hasCacheKey && cacheKey.Equals(ifNoneMatch))
|
return true;
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,6 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
||||||
|
|
||||||
public List<Cookie> Cookies { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Additional HTTP Headers
|
/// Additional HTTP Headers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -75,7 +73,6 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
Headers["Accept-Ranges"] = "bytes";
|
Headers["Accept-Ranges"] = "bytes";
|
||||||
StatusCode = HttpStatusCode.PartialContent;
|
StatusCode = HttpStatusCode.PartialContent;
|
||||||
|
|
||||||
Cookies = new List<Cookie>();
|
|
||||||
SetRangeValues(contentLength);
|
SetRangeValues(contentLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,7 +220,5 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
get { return (HttpStatusCode)Status; }
|
get { return (HttpStatusCode)Status; }
|
||||||
set { Status = (int)value; }
|
set { Status = (int)value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string StatusDescription { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,14 +25,11 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
public void FilterResponse(IRequest req, IResponse res, object dto)
|
public void FilterResponse(IRequest req, IResponse res, object dto)
|
||||||
{
|
{
|
||||||
// Try to prevent compatibility view
|
// Try to prevent compatibility view
|
||||||
//res.AddHeader("X-UA-Compatible", "IE=Edge");
|
|
||||||
res.AddHeader("Access-Control-Allow-Headers", "Accept, Accept-Language, Authorization, Cache-Control, Content-Disposition, Content-Encoding, Content-Language, Content-Length, Content-MD5, Content-Range, Content-Type, Date, Host, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Origin, OriginToken, Pragma, Range, Slug, Transfer-Encoding, Want-Digest, X-MediaBrowser-Token, X-Emby-Authorization");
|
res.AddHeader("Access-Control-Allow-Headers", "Accept, Accept-Language, Authorization, Cache-Control, Content-Disposition, Content-Encoding, Content-Language, Content-Length, Content-MD5, Content-Range, Content-Type, Date, Host, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Origin, OriginToken, Pragma, Range, Slug, Transfer-Encoding, Want-Digest, X-MediaBrowser-Token, X-Emby-Authorization");
|
||||||
res.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS");
|
res.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS");
|
||||||
res.AddHeader("Access-Control-Allow-Origin", "*");
|
res.AddHeader("Access-Control-Allow-Origin", "*");
|
||||||
|
|
||||||
var exception = dto as Exception;
|
if (dto is Exception exception)
|
||||||
|
|
||||||
if (exception != null)
|
|
||||||
{
|
{
|
||||||
_logger.LogError(exception, "Error processing request for {RawUrl}", req.RawUrl);
|
_logger.LogError(exception, "Error processing request for {RawUrl}", req.RawUrl);
|
||||||
|
|
||||||
|
@ -45,43 +42,26 @@ namespace Emby.Server.Implementations.HttpServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var hasHeaders = dto as IHasHeaders;
|
if (dto is IHasHeaders hasHeaders)
|
||||||
|
|
||||||
if (hasHeaders != null)
|
|
||||||
{
|
{
|
||||||
if (!hasHeaders.Headers.ContainsKey("Server"))
|
if (!hasHeaders.Headers.ContainsKey("Server"))
|
||||||
{
|
{
|
||||||
hasHeaders.Headers["Server"] = "Microsoft-NetCore/2.0, UPnP/1.0 DLNADOC/1.50";
|
hasHeaders.Headers["Server"] = "Microsoft-NetCore/2.0, UPnP/1.0 DLNADOC/1.50";
|
||||||
//hasHeaders.Headers["Server"] = "Mono-HTTPAPI/1.1";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
|
// Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
|
||||||
string contentLength;
|
if (hasHeaders.Headers.TryGetValue("Content-Length", out string contentLength)
|
||||||
|
&& !string.IsNullOrEmpty(contentLength))
|
||||||
if (hasHeaders.Headers.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
|
|
||||||
{
|
{
|
||||||
var length = long.Parse(contentLength, UsCulture);
|
var length = long.Parse(contentLength, UsCulture);
|
||||||
|
|
||||||
if (length > 0)
|
if (length > 0)
|
||||||
{
|
{
|
||||||
res.SetContentLength(length);
|
res.SetContentLength(length);
|
||||||
|
|
||||||
//var listenerResponse = res.OriginalResponse as HttpListenerResponse;
|
|
||||||
|
|
||||||
//if (listenerResponse != null)
|
|
||||||
//{
|
|
||||||
// // Disable chunked encoding. Technically this is only needed when using Content-Range, but
|
|
||||||
// // anytime we know the content length there's no need for it
|
|
||||||
// listenerResponse.SendChunked = false;
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
res.SendChunked = false;
|
res.SendChunked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//res.KeepAlive = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace Emby.Server.Implementations.Services
|
||||||
public HttpResult(object response, string contentType, HttpStatusCode statusCode)
|
public HttpResult(object response, string contentType, HttpStatusCode statusCode)
|
||||||
{
|
{
|
||||||
this.Headers = new Dictionary<string, string>();
|
this.Headers = new Dictionary<string, string>();
|
||||||
this.Cookies = new List<Cookie>();
|
|
||||||
|
|
||||||
this.Response = response;
|
this.Response = response;
|
||||||
this.ContentType = contentType;
|
this.ContentType = contentType;
|
||||||
|
@ -26,8 +25,6 @@ namespace Emby.Server.Implementations.Services
|
||||||
|
|
||||||
public IDictionary<string, string> Headers { get; private set; }
|
public IDictionary<string, string> Headers { get; private set; }
|
||||||
|
|
||||||
public List<Cookie> Cookies { get; private set; }
|
|
||||||
|
|
||||||
public int Status { get; set; }
|
public int Status { get; set; }
|
||||||
|
|
||||||
public HttpStatusCode StatusCode
|
public HttpStatusCode StatusCode
|
||||||
|
@ -40,15 +37,16 @@ namespace Emby.Server.Implementations.Services
|
||||||
|
|
||||||
public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken)
|
public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var response = RequestContext != null ? RequestContext.Response : null;
|
var response = RequestContext == null ? null : RequestContext.Response;
|
||||||
|
|
||||||
var bytesResponse = this.Response as byte[];
|
if (this.Response is byte[] bytesResponse)
|
||||||
if (bytesResponse != null)
|
|
||||||
{
|
{
|
||||||
var contentLength = bytesResponse.Length;
|
var contentLength = bytesResponse.Length;
|
||||||
|
|
||||||
if (response != null)
|
if (response != null)
|
||||||
|
{
|
||||||
response.SetContentLength(contentLength);
|
response.SetContentLength(contentLength);
|
||||||
|
}
|
||||||
|
|
||||||
if (contentLength > 0)
|
if (contentLength > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,4 +49,4 @@ namespace Emby.Server.Implementations.Services
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue