about summary refs log tree commit diff
path: root/MatrixRoomUtils.Core/Extensions
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixRoomUtils.Core/Extensions')
-rw-r--r--MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs21
1 files changed, 17 insertions, 4 deletions
diff --git a/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs b/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
index 47b3121..852e1d8 100644
--- a/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
+++ b/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
@@ -1,3 +1,4 @@
+using System.Reflection;
 using System.Text.Json;
 
 namespace MatrixRoomUtils.Core.Extensions;
@@ -18,23 +19,35 @@ public static class HttpClientExtensions {
 
 public class MatrixHttpClient : HttpClient {
     public override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
+        try
+        {
+            HttpRequestOptionsKey<bool> WebAssemblyEnableStreamingResponseKey = new HttpRequestOptionsKey<bool>("WebAssemblyEnableStreamingResponse");
+            request.Options.Set(WebAssemblyEnableStreamingResponseKey, true);
+            // var asm = Assembly.Load("Microsoft.AspNetCore.Components.WebAssembly");
+            // var browserHttpHandlerType = asm.GetType("Microsoft.AspNetCore.Components.WebAssembly.Http.WebAssemblyHttpRequestMessageExtensions", true);
+            // var browserHttpHandlerMethod = browserHttpHandlerType.GetMethod("SetBrowserResponseStreamingEnabled", BindingFlags.Public | BindingFlags.Static);
+            // browserHttpHandlerMethod?.Invoke(null, new object[] {request, true});
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine("Failed to set browser response streaming:");
+            Console.WriteLine(e);
+        }
         var a = await base.SendAsync(request, cancellationToken);
         if (!a.IsSuccessStatusCode) {
             Console.WriteLine($"Failed to send request: {a.StatusCode}");
             var content = await a.Content.ReadAsStringAsync(cancellationToken);
             if (content.StartsWith('{')) {
                 var ex = JsonSerializer.Deserialize<MatrixException>(content);
-                if (ex?.RetryAfterMs != null) {
+                if (ex?.RetryAfterMs is not null) {
                     await Task.Delay(ex.RetryAfterMs.Value, cancellationToken);
+                    typeof(HttpRequestMessage).GetField("_sendStatus", BindingFlags.NonPublic | BindingFlags.Instance)?.SetValue(request, 0);
                     return await SendAsync(request, cancellationToken);
                 }
-
                 throw ex!;
             }
-
             throw new InvalidDataException("Encountered invalid data:\n" + content);
         }
-
         return a;
     }
 }
\ No newline at end of file