diff --git a/UmlautAdaptarr/Program.cs b/UmlautAdaptarr/Program.cs index 84c3a3f..b1b4eae 100644 --- a/UmlautAdaptarr/Program.cs +++ b/UmlautAdaptarr/Program.cs @@ -56,13 +56,13 @@ internal class Program builder.AddLidarrSupport(); builder.AddReadarrSupport(); builder.Services.AddSingleton(); - builder.AddProxyRequestService(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); var app = builder.Build(); GlobalStaticLogger.Initialize(app.Services.GetService()!); app.UseHttpsRedirection(); - app.UseAuthorization(); app.MapControllerRoute(name: "caps", diff --git a/UmlautAdaptarr/Services/HttpProxyService.cs b/UmlautAdaptarr/Services/HttpProxyService.cs new file mode 100644 index 0000000..07be92d --- /dev/null +++ b/UmlautAdaptarr/Services/HttpProxyService.cs @@ -0,0 +1,85 @@ +using System.Net; + +namespace UmlautAdaptarr.Services +{ + public class HttpProxyService : IHostedService + { + private HttpListener _listener; + private readonly IHttpClientFactory _clientFactory; + private readonly ILogger _logger; + private const int PROXY_PORT = 5006; // TODO move to appsettings.json + + public HttpProxyService(IHttpClientFactory clientFactory, ILogger logger) + { + _clientFactory = clientFactory; + _logger = logger; + } + + private async Task HandleRequests() + { + while (_listener.IsListening) + { + try + { + var context = await _listener.GetContextAsync(); + await ProcessRequest(context); + } + catch (Exception ex) + { + _logger.LogError($"Error handling request: {ex.Message}"); + } + } + } + + private async Task ProcessRequest(HttpListenerContext context) + { + var request = context.Request; + var response = context.Response; + + try + { + var originalUri = new Uri(request.RawUrl); + var modifiedUri = "http://localhost:5005/_/" + originalUri.Host + originalUri.PathAndQuery; // TODO read port from appsettings? + + // Act as a proxy and forward the modified request to internal endpoints + using var client = _clientFactory.CreateClient(); + var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, modifiedUri); + var result = await client.SendAsync(httpRequestMessage); + + if (result.IsSuccessStatusCode) + { + var responseData = await result.Content.ReadAsByteArrayAsync(); + response.ContentLength64 = responseData.Length; + await response.OutputStream.WriteAsync(responseData); + } + else + { + response.StatusCode = (int)result.StatusCode; + } + } + catch (Exception ex) + { + _logger.LogError($"HTTP Proxy error: {ex.Message}"); + response.StatusCode = 500; + } + finally + { + response.OutputStream.Close(); + } + } + public Task StartAsync(CancellationToken cancellationToken) + { + _listener = new HttpListener(); + _listener.Prefixes.Add($"http://*:{PROXY_PORT}/"); + _listener.Start(); + Task.Run(HandleRequests, cancellationToken); + return Task.CompletedTask; + } + public Task StopAsync(CancellationToken cancellationToken) + { + _listener.Stop(); + _listener.Close(); + return Task.CompletedTask; + } + } +}