/// <summary>
 /// Packages the output. <c>Flush()</c> would be called in this method.
 /// </summary>
 /// <param name="response">The response.</param>
 /// <param name="data">The data.</param>
 /// <param name="baseException">The base exception.</param>
 /// <param name="acceptEncoding">Name of the compress.</param>
 /// <param name="noBody">if set to <c>true</c> [no body].</param>
 /// <param name="settings">The settings.</param>
 /// <returns>System.Object.</returns>
 protected virtual void PackageOutput(HttpResponse response, object data, BaseException baseException = null, string acceptEncoding = null, bool noBody = false, RestApiSettings settings = null)
 {
     PackageResponse(response, data, baseException, acceptEncoding, noBody, settings);
 }
        /// <summary>
        /// Packages the response. <c>Flush()</c> would be called in this method.
        /// </summary>
        /// <param name="response">The response.</param>
        /// <param name="data">The data.</param>
        /// <param name="ex">The ex.</param>
        /// <param name="acceptEncoding">The accept encoding.</param>
        /// <param name="noBody">if set to <c>true</c> [no body].</param>
        /// <param name="settings">The settings.</param>
        public static void PackageResponse(HttpResponseBase response, object data, BaseException ex = null, string acceptEncoding = null, bool noBody = false, RestApiSettings settings = null)
        {
            if (response != null)
            {
                if (settings == null)
                {
                    settings = defaultRestApiSettings;
                }

                var objectToReturn = ex != null ? (settings.EnableOutputFullExceptionInfo ? ex.ToExceptionInfo() : new SimpleExceptionInfo
                {
                    Message = ex.Hint != null ? (ex.Hint.Message ?? ex.Hint.Cause) : ex.RootCause.Message,
                    Data = data == null ? null : JObject.FromObject(data),
                    Code = ex.Hint?.Code ?? ex.Code
                } as object) : data;

                response.Headers.Add(HttpConstants.HttpHeader.SERVERNAME, EnvironmentCore.ServerName);
                response.Headers.AddIfNotNull(HttpConstants.HttpHeader.TRACEID, ApiTraceContext.TraceId);

                response.StatusCode = (int)(ex == null ? (noBody ? HttpStatusCode.NoContent : HttpStatusCode.OK) : ex.Code.ToHttpStatusCode());

                if (!noBody)
                {
                    response.ContentType = "application/json";

                    if (settings.EnableContentCompression)
                    {
                        acceptEncoding = acceptEncoding.SafeToString().ToLower();
                        if (acceptEncoding.Contains("gzip"))
                        {
                            response.Filter = new System.IO.Compression.GZipStream(response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                            response.Headers.Remove(HttpConstants.HttpHeader.ContentEncoding);
                            response.AppendHeader(HttpConstants.HttpHeader.ContentEncoding, "gzip");
                        }
                        else if (acceptEncoding.Contains("deflate"))
                        {
                            response.Filter = new System.IO.Compression.DeflateStream(response.Filter,
                                                System.IO.Compression.CompressionMode.Compress);
                            response.Headers.Remove(HttpConstants.HttpHeader.ContentEncoding);
                            response.AppendHeader(HttpConstants.HttpHeader.ContentEncoding, "deflate");
                        }
                    }

                    response.Write(objectToReturn.ToJson(true, JsonConverters));
                }

                response.Headers.Add(HttpConstants.HttpHeader.SERVEREXITTIME, DateTime.UtcNow.ToFullDateTimeTzString());
                response.Flush();
            }
        }
 /// <summary>
 /// Packages the response. <c>Flush()</c> would be called in this method.
 /// </summary>
 /// <param name="response">The response.</param>
 /// <param name="data">The data.</param>
 /// <param name="ex">The ex.</param>
 /// <param name="acceptEncoding">Name of the compression.</param>
 /// <param name="noBody">if set to <c>true</c> [no body].</param>
 /// <param name="settings">The settings.</param>
 /// <returns>System.Object.</returns>
 public static void PackageResponse(HttpResponse response, object data, BaseException ex = null, string acceptEncoding = null, bool noBody = false, RestApiSettings settings = null)
 {
     if (response != null)
     {
         PackageResponse(new HttpResponseWrapper(response), data, ex, acceptEncoding, noBody, settings);
     }
 }
        /// <summary>
        /// Packages the response. <c>Flush()</c> would be called in this method.
        /// </summary>
        /// <param name="response">The response.</param>
        /// <param name="data">The data.</param>
        /// <param name="ex">The ex.</param>
        /// <param name="acceptEncoding">The accept encoding.</param>
        /// <param name="noBody">if set to <c>true</c> [no body].</param>
        /// <param name="contentType">Type of the content.</param>
        /// <param name="settings">The settings.</param>
        public static void PackageResponse(HttpResponseBase response, object data, BaseException ex = null, string acceptEncoding = null, bool noBody = false, string contentType = null, RestApiSettings settings = null)
        {
            if (response != null)
            {
                if (settings == null)
                {
                    settings = defaultRestApiSettings;
                }

                var objectToReturn = ex != null ? (settings.OmitExceptionDetail ? ex.ToSimpleExceptionInfo() : ex.ToExceptionInfo()) : data;

                response.Headers.Add(HttpConstants.HttpHeader.SERVERNAME, EnvironmentCore.ServerName);
                response.Headers.AddIfNotNullOrEmpty(HttpConstants.HttpHeader.TRACEID, ApiTraceContext.TraceId);

                response.StatusCode = (int)(ex == null ? (noBody ? HttpStatusCode.NoContent : HttpStatusCode.OK) : ex.Code.ToHttpStatusCode());

                if (!noBody)
                {
                    response.ContentType = contentType.SafeToString(HttpConstants.ContentType.Json);

                    if (settings.EnableContentCompression)
                    {
                        acceptEncoding = acceptEncoding.SafeToString().ToLower();
                        if (acceptEncoding.Contains(HttpConstants.HttpValues.GZip))
                        {
                            response.Filter = new System.IO.Compression.GZipStream(response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                            response.Headers.Remove(HttpConstants.HttpHeader.ContentEncoding);
                            response.AppendHeader(HttpConstants.HttpHeader.ContentEncoding, HttpConstants.HttpValues.GZip);
                        }
                        else if (acceptEncoding.Contains("deflate"))
                        {
                            response.Filter = new System.IO.Compression.DeflateStream(response.Filter,
                                                System.IO.Compression.CompressionMode.Compress);
                            response.Headers.Remove(HttpConstants.HttpHeader.ContentEncoding);
                            response.AppendHeader(HttpConstants.HttpHeader.ContentEncoding, "deflate");
                        }
                    }

                    response.Write(objectToReturn.ToJson(true, JsonConverters));
                }

                response.Headers.Add(HttpConstants.HttpHeader.SERVEREXITTIME, DateTime.UtcNow.ToFullDateTimeTzString());
            }
        }
 /// <summary>
 /// Fills the exit information.
 /// </summary>
 /// <param name="exception">The exception.</param>
 /// <param name="exitStamp">The exit stamp.</param>
 /// <param name="appIdentifier">The application identifier.</param>
 /// <param name="serverIdentifier">The server identifier.</param>
 /// <param name="level">The level.</param>
 /// <param name="operatorIdentifier">The operator identifier.</param>
 internal void FillExitInfo(BaseException exception = null, DateTime? exitStamp = null, string appIdentifier = null, string serverIdentifier = null, ExceptionInfo.ExceptionCriticality level = ExceptionInfo.ExceptionCriticality.Error, string operatorIdentifier = null)
 {
     this.ExitStamp = exitStamp ?? DateTime.UtcNow;
     this.Exception = exception.ToExceptionInfo(appIdentifier, serverIdentifier, level, operatorIdentifier);
 }
 /// <summary>
 /// Handles the unauthorized action.
 /// </summary>
 /// <param name="filterContext">The filter context.</param>
 /// <param name="baseException">The base exception.</param>
 protected virtual void HandleUnauthorizedAction(ActionExecutingContext filterContext, BaseException baseException)
 {
     if (filterContext.HttpContext.Request.IsAjaxRequest())
     {
         ApiHandlerBase.PackageResponse(filterContext.HttpContext.Response, null, baseException, settings: settings);
         filterContext.Result = null;
     }
     else
     {
         filterContext.Result = new RedirectToRouteResult(routeValues: new RouteValueDictionary
         {
             {"controller", "Error"},
             {"action", "Index"},
             {"code", 401},
             {"minor", baseException.Code.Minor},
             {"message", baseException.Message}
         });
     }
 }