diff --git a/MxApiExtensions/Controllers/GenericProxyController.cs b/MxApiExtensions/Controllers/Other/GenericProxyController.cs
index c004fcb..bae07c0 100644
--- a/MxApiExtensions/Controllers/GenericProxyController.cs
+++ b/MxApiExtensions/Controllers/Other/GenericProxyController.cs
@@ -7,29 +7,17 @@ namespace MxApiExtensions.Controllers;
[ApiController]
[Route("/{*_}")]
-public class GenericController : ControllerBase {
- private readonly ILogger<GenericController> _logger;
- private readonly MxApiExtensionsConfiguration _config;
- private readonly AuthenticationService _authenticationService;
- private readonly AuthenticatedHomeserverProviderService _authenticatedHomeserverProviderService;
- private static Dictionary<string, string> _tokenMap = new();
-
- public GenericController(ILogger<GenericController> logger, MxApiExtensionsConfiguration config, AuthenticationService authenticationService,
- AuthenticatedHomeserverProviderService authenticatedHomeserverProviderService) {
- _logger = logger;
- _config = config;
- _authenticationService = authenticationService;
- _authenticatedHomeserverProviderService = authenticatedHomeserverProviderService;
- }
-
+public class GenericController(ILogger<GenericController> logger, MxApiExtensionsConfiguration config, AuthenticationService authenticationService,
+ AuthenticatedHomeserverProviderService authenticatedHomeserverProviderService)
+ : ControllerBase {
[HttpGet]
public async Task Proxy([FromQuery] string? access_token, string? _) {
try {
- access_token ??= _authenticationService.GetToken(fail: false);
- var mxid = await _authenticationService.GetMxidFromToken(fail: false);
- var hs = await _authenticatedHomeserverProviderService.GetHomeserver();
+ // access_token ??= _authenticationService.GetToken(fail: false);
+ // var mxid = await _authenticationService.GetMxidFromToken(fail: false);
+ var hs = await authenticatedHomeserverProviderService.GetRemoteHomeserver();
- _logger.LogInformation("Proxying request for {}: {}{}", mxid, Request.Path, Request.QueryString);
+ logger.LogInformation("Proxying request: {}{}", Request.Path, Request.QueryString);
//remove access_token from query string
Request.QueryString = new QueryString(
@@ -55,7 +43,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (MxApiMatrixException e) {
- _logger.LogError(e, "Matrix error");
+ logger.LogError(e, "Matrix error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "application/json";
@@ -63,7 +51,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (Exception e) {
- _logger.LogError(e, "Unhandled error");
+ logger.LogError(e, "Unhandled error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "text/plain";
@@ -75,11 +63,11 @@ public class GenericController : ControllerBase {
[HttpPost]
public async Task ProxyPost([FromQuery] string? access_token, string _) {
try {
- access_token ??= _authenticationService.GetToken(fail: false);
- var mxid = await _authenticationService.GetMxidFromToken(fail: false);
- var hs = await _authenticatedHomeserverProviderService.GetHomeserver();
+ access_token ??= authenticationService.GetToken(fail: false);
+ var mxid = await authenticationService.GetMxidFromToken(fail: false);
+ var hs = await authenticatedHomeserverProviderService.GetHomeserver();
- _logger.LogInformation("Proxying request for {}: {}{}", mxid, Request.Path, Request.QueryString);
+ logger.LogInformation("Proxying request for {}: {}{}", mxid, Request.Path, Request.QueryString);
using var hc = new HttpClient();
hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", access_token);
@@ -112,7 +100,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (MxApiMatrixException e) {
- _logger.LogError(e, "Matrix error");
+ logger.LogError(e, "Matrix error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "application/json";
@@ -120,7 +108,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (Exception e) {
- _logger.LogError(e, "Unhandled error");
+ logger.LogError(e, "Unhandled error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "text/plain";
@@ -132,11 +120,11 @@ public class GenericController : ControllerBase {
[HttpPut]
public async Task ProxyPut([FromQuery] string? access_token, string _) {
try {
- access_token ??= _authenticationService.GetToken(fail: false);
- var mxid = await _authenticationService.GetMxidFromToken(fail: false);
- var hs = await _authenticatedHomeserverProviderService.GetHomeserver();
+ access_token ??= authenticationService.GetToken(fail: false);
+ var mxid = await authenticationService.GetMxidFromToken(fail: false);
+ var hs = await authenticatedHomeserverProviderService.GetHomeserver();
- _logger.LogInformation("Proxying request for {}: {}{}", mxid, Request.Path, Request.QueryString);
+ logger.LogInformation("Proxying request for {}: {}{}", mxid, Request.Path, Request.QueryString);
using var hc = new HttpClient();
hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", access_token);
@@ -169,7 +157,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (MxApiMatrixException e) {
- _logger.LogError(e, "Matrix error");
+ logger.LogError(e, "Matrix error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "application/json";
@@ -177,7 +165,7 @@ public class GenericController : ControllerBase {
await Response.CompleteAsync();
}
catch (Exception e) {
- _logger.LogError(e, "Unhandled error");
+ logger.LogError(e, "Unhandled error");
Response.StatusCode = StatusCodes.Status500InternalServerError;
Response.ContentType = "text/plain";
diff --git a/MxApiExtensions/Controllers/Other/MediaProxyController.cs b/MxApiExtensions/Controllers/Other/MediaProxyController.cs
new file mode 100644
index 0000000..03b68ba
--- /dev/null
+++ b/MxApiExtensions/Controllers/Other/MediaProxyController.cs
@@ -0,0 +1,78 @@
+using System.Net.Http.Headers;
+using LibMatrix.Homeservers;
+using LibMatrix.Services;
+using Microsoft.AspNetCore.Mvc;
+using MxApiExtensions.Classes.LibMatrix;
+using MxApiExtensions.Services;
+
+namespace MxApiExtensions.Controllers;
+
+[ApiController]
+[Route("/")]
+public class MediaProxyController(ILogger<GenericController> logger, MxApiExtensionsConfiguration config, AuthenticationService authenticationService,
+ AuthenticatedHomeserverProviderService authenticatedHomeserverProviderService, HomeserverProviderService hsProvider)
+ : ControllerBase {
+ private class MediaCacheEntry {
+ public DateTime LastRequested { get; set; } = DateTime.Now;
+ public byte[] Data { get; set; }
+ public string ContentType { get; set; }
+ public long Size => Data.LongCount();
+ }
+
+ private static Dictionary<string, MediaCacheEntry> _mediaCache = new();
+ private static SemaphoreSlim _semaphore = new(1, 1);
+
+ [HttpGet("/_matrix/media/{_}/download/{serverName}/{mediaId}")]
+ public async Task Proxy(string? _, string serverName, string mediaId) {
+ try {
+ logger.LogInformation("Proxying media: {}{}", serverName, mediaId);
+
+ await _semaphore.WaitAsync();
+ MediaCacheEntry entry;
+ if (!_mediaCache.ContainsKey($"{serverName}/{mediaId}")) {
+ _mediaCache.Add($"{serverName}/{mediaId}", entry = new());
+ List<RemoteHomeserver> FeasibleHomeservers = new();
+ {
+ var a = await authenticatedHomeserverProviderService.TryGetRemoteHomeserver();
+ if(a is not null)
+ FeasibleHomeservers.Add(a);
+ }
+
+ 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();
+ break;
+ }
+ }
+ else entry = _mediaCache[$"{serverName}/{mediaId}"];
+ _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.FlushAsync();
+ await Response.CompleteAsync();
+ }
+ catch (MxApiMatrixException e) {
+ logger.LogError(e, "Matrix error");
+ Response.StatusCode = StatusCodes.Status500InternalServerError;
+ Response.ContentType = "application/json";
+
+ await Response.WriteAsync(e.GetAsJson());
+ await Response.CompleteAsync();
+ }
+ catch (Exception e) {
+ logger.LogError(e, "Unhandled error");
+ Response.StatusCode = StatusCodes.Status500InternalServerError;
+ Response.ContentType = "text/plain";
+
+ await Response.WriteAsync(e.ToString());
+ await Response.CompleteAsync();
+ }
+ }
+}
diff --git a/MxApiExtensions/Controllers/WellKnownController.cs b/MxApiExtensions/Controllers/Other/WellKnownController.cs
index b27451f..c0e255f 100644
--- a/MxApiExtensions/Controllers/WellKnownController.cs
+++ b/MxApiExtensions/Controllers/Other/WellKnownController.cs
@@ -5,18 +5,14 @@ namespace MxApiExtensions.Controllers;
[ApiController]
[Route("/")]
-public class WellKnownController : ControllerBase {
- private readonly MxApiExtensionsConfiguration _config;
-
- public WellKnownController(MxApiExtensionsConfiguration config) {
- _config = config;
- }
+public class WellKnownController(MxApiExtensionsConfiguration config) : ControllerBase {
+ private readonly MxApiExtensionsConfiguration _config = config;
[HttpGet("/.well-known/matrix/client")]
public object GetWellKnown() {
var res = new JsonObject();
res.Add("m.homeserver", new JsonObject {
- { "base_url", Request.Scheme + "://" + Request.Host + "/" },
+ { "base_url", Request.Scheme + "://" + Request.Host },
});
return res;
}
|