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); }