From d3d95bbb271902391cbd43a11a6a5d72b0ccfaef Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 23 Nov 2023 05:43:15 +0100 Subject: Add more code --- .../Controllers/Other/GenericProxyController.cs | 19 ++++++++++++++-- .../Controllers/Other/MediaProxyController.cs | 26 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) (limited to 'MxApiExtensions/Controllers/Other') diff --git a/MxApiExtensions/Controllers/Other/GenericProxyController.cs b/MxApiExtensions/Controllers/Other/GenericProxyController.cs index bae07c0..36ceab7 100644 --- a/MxApiExtensions/Controllers/Other/GenericProxyController.cs +++ b/MxApiExtensions/Controllers/Other/GenericProxyController.cs @@ -6,10 +6,15 @@ using MxApiExtensions.Services; namespace MxApiExtensions.Controllers; [ApiController] -[Route("/{*_}")] +[Route("/_matrix/{*_}")] public class GenericController(ILogger logger, MxApiExtensionsConfiguration config, AuthenticationService authenticationService, AuthenticatedHomeserverProviderService authenticatedHomeserverProviderService) : ControllerBase { + /// + /// Direct proxy to upstream + /// + /// API path (unused, as Request.Path is used instead) + /// Optional access token [HttpGet] public async Task Proxy([FromQuery] string? access_token, string? _) { try { @@ -60,6 +65,11 @@ public class GenericController(ILogger logger, MxApiExtension } } + /// + /// Direct proxy to upstream + /// + /// API path (unused, as Request.Path is used instead) + /// Optional access token [HttpPost] public async Task ProxyPost([FromQuery] string? access_token, string _) { try { @@ -117,6 +127,11 @@ public class GenericController(ILogger logger, MxApiExtension } } + /// + /// Direct proxy to upstream + /// + /// API path (unused, as Request.Path is used instead) + /// Optional access token [HttpPut] public async Task ProxyPut([FromQuery] string? access_token, string _) { try { @@ -173,4 +188,4 @@ public class GenericController(ILogger logger, MxApiExtension await Response.CompleteAsync(); } } -} +} \ No newline at end of file diff --git a/MxApiExtensions/Controllers/Other/MediaProxyController.cs b/MxApiExtensions/Controllers/Other/MediaProxyController.cs index fb40aa2..d4c4ea0 100644 --- a/MxApiExtensions/Controllers/Other/MediaProxyController.cs +++ b/MxApiExtensions/Controllers/Other/MediaProxyController.cs @@ -36,25 +36,49 @@ public class MediaProxyController(ILogger logger, MxApiExtens var a = await authenticatedHomeserverProviderService.TryGetRemoteHomeserver(); if(a is not null) FeasibleHomeservers.Add(a); + + if (a is AuthenticatedHomeserverGeneric ahg) { + var rooms = await ahg.GetJoinedRooms(); + foreach (var room in rooms) { + var ahs = (await room.GetMembersByHomeserverAsync()).Keys.Select(x=>x.ToString()).ToList(); + foreach (var ah in ahs) { + try { + if (!FeasibleHomeservers.Any(x => x.BaseUrl == ah)) { + FeasibleHomeservers.Add(await hsProvider.GetRemoteHomeserver(ah)); + } + } + catch { } + } + } + } } FeasibleHomeservers.Add(await hsProvider.GetRemoteHomeserver(serverName)); + foreach (var homeserver in FeasibleHomeservers) { var resp = await homeserver.ClientHttpClient.GetAsync($"{Request.Path}"); if(!resp.IsSuccessStatusCode) continue; entry.ContentType = resp.Content.Headers.ContentType?.ToString() ?? "application/json"; entry.Data = await resp.Content.ReadAsByteArrayAsync(); + if (entry.Data is not { Length: >0 }) throw new NullReferenceException("No data received?"); break; } + if (entry.Data is not { Length: >0 }) throw new NullReferenceException("No data received from any homeserver?"); + } + else if (_mediaCache[$"{serverName}/{mediaId}"].Data is not { Length: > 0 }) { + _mediaCache.Remove($"{serverName}/{mediaId}"); + await ProxyMedia(_, serverName, mediaId); + return; } else entry = _mediaCache[$"{serverName}/{mediaId}"]; + if (entry.Data is null) throw new NullReferenceException("No data?"); _semaphore.Release(); Response.StatusCode = 200; Response.ContentType = entry.ContentType; await Response.StartAsync(); - await Response.Body.WriteAsync(entry.Data, 0, entry.Data.Length); + await Response.Body.WriteAsync(entry.Data.ToArray(), 0, entry.Data.Length); await Response.Body.FlushAsync(); await Response.CompleteAsync(); } -- cgit 1.5.1