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