|
@@ -105,6 +105,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
|
|
DefaultRedirectPath = defaultRedirectpath;
|
|
|
_logger = logger;
|
|
|
|
|
|
+ ServiceStack.Logging.LogManager.LogFactory = new NLogFactory();
|
|
|
+
|
|
|
EndpointHostConfig.Instance.ServiceStackHandlerFactoryPath = null;
|
|
|
EndpointHostConfig.Instance.MetadataRedirectPath = "metadata";
|
|
|
|
|
@@ -136,58 +138,56 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
|
|
Plugins.Add(new SwaggerFeature());
|
|
|
Plugins.Add(new CorsFeature());
|
|
|
|
|
|
- ServiceStack.Logging.LogManager.LogFactory = new NLogFactory();
|
|
|
-
|
|
|
ResponseFilters.Add((req, res, dto) =>
|
|
|
+ {
|
|
|
+ var exception = dto as Exception;
|
|
|
+
|
|
|
+ if (exception != null)
|
|
|
{
|
|
|
- var exception = dto as Exception;
|
|
|
+ _logger.ErrorException("Error processing request for {0}", exception, req.RawUrl);
|
|
|
|
|
|
- if (exception != null)
|
|
|
+ if (!string.IsNullOrEmpty(exception.Message))
|
|
|
{
|
|
|
- _logger.ErrorException("Error processing request for {0}", exception, req.RawUrl);
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(exception.Message))
|
|
|
- {
|
|
|
- var error = exception.Message.Replace(Environment.NewLine, " ");
|
|
|
- error = RemoveControlCharacters(error);
|
|
|
+ var error = exception.Message.Replace(Environment.NewLine, " ");
|
|
|
+ error = RemoveControlCharacters(error);
|
|
|
|
|
|
- res.AddHeader("X-Application-Error-Code", error);
|
|
|
- }
|
|
|
+ res.AddHeader("X-Application-Error-Code", error);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (dto is CompressedResult)
|
|
|
- {
|
|
|
- // Per Google PageSpeed
|
|
|
- // This instructs the proxies to cache two versions of the resource: one compressed, and one uncompressed.
|
|
|
- // The correct version of the resource is delivered based on the client request header.
|
|
|
- // This is a good choice for applications that are singly homed and depend on public proxies for user locality.
|
|
|
- res.AddHeader("Vary", "Accept-Encoding");
|
|
|
- }
|
|
|
+ if (dto is CompressedResult)
|
|
|
+ {
|
|
|
+ // Per Google PageSpeed
|
|
|
+ // This instructs the proxies to cache two versions of the resource: one compressed, and one uncompressed.
|
|
|
+ // The correct version of the resource is delivered based on the client request header.
|
|
|
+ // This is a good choice for applications that are singly homed and depend on public proxies for user locality.
|
|
|
+ res.AddHeader("Vary", "Accept-Encoding");
|
|
|
+ }
|
|
|
|
|
|
- var hasOptions = dto as IHasOptions;
|
|
|
+ var hasOptions = dto as IHasOptions;
|
|
|
|
|
|
- if (hasOptions != null)
|
|
|
+ if (hasOptions != null)
|
|
|
+ {
|
|
|
+ // Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
|
|
|
+ string contentLength;
|
|
|
+
|
|
|
+ if (hasOptions.Options.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
|
|
|
{
|
|
|
- // Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
|
|
|
- string contentLength;
|
|
|
+ var length = long.Parse(contentLength, UsCulture);
|
|
|
|
|
|
- if (hasOptions.Options.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
|
|
|
+ if (length > 0)
|
|
|
{
|
|
|
- var length = long.Parse(contentLength, UsCulture);
|
|
|
-
|
|
|
- if (length > 0)
|
|
|
- {
|
|
|
- var response = (HttpListenerResponse) res.OriginalResponse;
|
|
|
+ var response = (HttpListenerResponse)res.OriginalResponse;
|
|
|
|
|
|
- response.ContentLength64 = length;
|
|
|
+ response.ContentLength64 = length;
|
|
|
|
|
|
- // 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
|
|
|
- response.SendChunked = false;
|
|
|
- }
|
|
|
+ // 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
|
|
|
+ response.SendChunked = false;
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
/// <summary>
|