public static async Task <bool> ProcessProxyHttpRequest(HttpContext context, Uri appRequestUri, LDRMResponse ldrmResponse)
        {
            try
            {
                string requestId = DateTime.Now.GetHashCode().ToString();

                Uri originalUri = appRequestUri;
                var builder     = new UriBuilder(appRequestUri);
                try
                {
                    builder.Host = ldrmResponse.destination_domain;
                    try
                    {
                        builder.Port = ldrmResponse.destination_domain_port;
                        if (builder.Port == 443)
                        {
                            builder.Scheme = "https";
                        }

                        appRequestUri = builder.Uri;
                    }
                    catch { }
                }
                catch { }

                var httpResponseMessage = await ProxyHelper.CreateProxyHttpRequest(context.Request, appRequestUri);

                if (httpResponseMessage.StatusCode == HttpStatusCode.Redirect || httpResponseMessage.StatusCode == HttpStatusCode.Moved)
                {
                    var redirectUri = httpResponseMessage.Headers.Location;
                    if (!redirectUri.IsAbsoluteUri)
                    {
                        redirectUri = new Uri(originalUri, redirectUri);
                    }

                    if (httpResponseMessage.StatusCode == HttpStatusCode.Moved)
                    {
                        context.Response.Redirect(redirectUri.AbsoluteUri);
                        return(true);
                    }
                    else
                    {
                        context.Response.Redirect(redirectUri.AbsoluteUri);
                        return(true);
                    }
                }
                else
                {
                    // Preserve Origin Headers
                    var headers = httpResponseMessage.Headers.Concat(httpResponseMessage.Content.Headers);
                    foreach (var header in headers)
                    {
                        context.Response.Headers[header.Key] = header.Value.ToArray();
                    }
                    context.Response.StatusCode = (int)httpResponseMessage.StatusCode;
                    context.Response.Headers.Remove("Transfer-Encoding");
                    context.Response.Headers.TryAdd("x-kitsune-module", "ldrm");

                    Byte[] data = httpResponseMessage.Content.ReadAsByteArrayAsync().Result;

                    //Update contentLength if updating or converting the body content
                    //context.Response.ContentLength = data.Length;

                    context.Response.Body.Write(data, 0, data.Length);

                    return(true);
                }
            }
            catch { }
            return(false);
        }
        public async Task InvokeAsync(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            try
            {
                var request       = context.Request;
                var appRequestUri = new Uri($"{request.Scheme}://{request.Host}{request.Path}{request.QueryString}");

                //TODO: Optimize this OriginDomainArrayStrings()
                if (LDRMProcessor.AllDomainOriginStrings.Contains(appRequestUri.Authority.ToUpper()))
                {
                    var ldrmResponse = LDRMProcessor.HasLegacyMapping(appRequestUri.Authority, appRequestUri);
                    if (ldrmResponse.match)
                    {
                        var builder = new UriBuilder(appRequestUri);
                        try
                        {
                            builder.Host = ldrmResponse.destination_domain;
                            try
                            {
                                builder.Port = ldrmResponse.destination_domain_port;
                                if (builder.Port == 443)
                                {
                                    builder.Scheme = "https";
                                }

                                appRequestUri = builder.Uri;
                            }
                            catch { }
                        }
                        catch { }

                        //TODOC : Check which object to pass to the function and update function accordingly
                        var httpResponseMessage = await ProxyHelper.CreateProxyHttpRequest(request, appRequestUri);

                        if (httpResponseMessage.IsSuccessStatusCode)
                        {
                            var contentType = httpResponseMessage.Content.Headers.ContentType.MediaType;
                            context.Response.StatusCode = (int)httpResponseMessage.StatusCode;

                            foreach (var header in httpResponseMessage.Headers)
                            {
                                context.Response.Headers[header.Key] = header.Value.ToArray();
                            }

                            // Remove Caching
                            context.Response.Headers["Cache-Control"] = "max-age=0, no-cache, no-store, must-revalidate";
                            context.Response.Headers["Pragma"]        = "no-cache";
                            context.Response.Headers["Expires"]       = "0";
                            context.Response.ContentType = contentType;

                            if (contentType.StartsWith("text"))
                            {
                                await context.Response.WriteAsync(await httpResponseMessage.Content.ReadAsStringAsync());
                            }
                            else
                            {
                                Byte[] data = await httpResponseMessage.Content.ReadAsByteArrayAsync();

                                await context.Response.Body.WriteAsync(data, 0, data.Length);
                            }
                            return;
                        }
                    }
                }
            }
            catch { }

            await _next.Invoke(context);
        }