summary refs log tree commit diff
path: root/MxApiExtensions/Controllers/Other
diff options
context:
space:
mode:
authorTheArcaneBrony <myrainbowdash949@gmail.com>2023-11-23 05:43:15 +0100
committerTheArcaneBrony <myrainbowdash949@gmail.com>2023-11-23 05:43:15 +0100
commitd3d95bbb271902391cbd43a11a6a5d72b0ccfaef (patch)
tree29fb4dd65d855a66fa65755fbf8d443a6154dc80 /MxApiExtensions/Controllers/Other
parentFix sync (diff)
downloadMxApiExtensions-d3d95bbb271902391cbd43a11a6a5d72b0ccfaef.tar.xz
Add more code
Diffstat (limited to 'MxApiExtensions/Controllers/Other')
-rw-r--r--MxApiExtensions/Controllers/Other/GenericProxyController.cs19
-rw-r--r--MxApiExtensions/Controllers/Other/MediaProxyController.cs26
2 files changed, 42 insertions, 3 deletions
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<GenericController> logger, MxApiExtensionsConfiguration config, AuthenticationService authenticationService, AuthenticatedHomeserverProviderService authenticatedHomeserverProviderService) : ControllerBase { + /// <summary> + /// Direct proxy to upstream + /// </summary> + /// <param name="_">API path (unused, as Request.Path is used instead)</param> + /// <param name="access_token">Optional access token</param> [HttpGet] public async Task Proxy([FromQuery] string? access_token, string? _) { try { @@ -60,6 +65,11 @@ public class GenericController(ILogger<GenericController> logger, MxApiExtension } } + /// <summary> + /// Direct proxy to upstream + /// </summary> + /// <param name="_">API path (unused, as Request.Path is used instead)</param> + /// <param name="access_token">Optional access token</param> [HttpPost] public async Task ProxyPost([FromQuery] string? access_token, string _) { try { @@ -117,6 +127,11 @@ public class GenericController(ILogger<GenericController> logger, MxApiExtension } } + /// <summary> + /// Direct proxy to upstream + /// </summary> + /// <param name="_">API path (unused, as Request.Path is used instead)</param> + /// <param name="access_token">Optional access token</param> [HttpPut] public async Task ProxyPut([FromQuery] string? access_token, string _) { try { @@ -173,4 +188,4 @@ public class GenericController(ILogger<GenericController> 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<GenericController> 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(); }