about summary refs log tree commit diff
path: root/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs')
-rw-r--r--MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs37
1 files changed, 29 insertions, 8 deletions
diff --git a/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs b/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
index 8eb0226..47b3121 100644
--- a/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
+++ b/MatrixRoomUtils.Core/Extensions/HttpClientExtensions.cs
@@ -1,19 +1,40 @@
+using System.Text.Json;
+
 namespace MatrixRoomUtils.Core.Extensions;
 
-public static class HttpClientExtensions
-{
-    public static async Task<bool> CheckSuccessStatus(this HttpClient hc, string url)
-    {
+public static class HttpClientExtensions {
+    public static async Task<bool> CheckSuccessStatus(this HttpClient hc, string url) {
         //cors causes failure, try to catch
-        try
-        {
+        try {
             var resp = await hc.GetAsync(url);
             return resp.IsSuccessStatusCode;
         }
-        catch (Exception e)
-        {
+        catch (Exception e) {
             Console.WriteLine($"Failed to check success status: {e.Message}");
             return false;
         }
     }
+}
+
+public class MatrixHttpClient : HttpClient {
+    public override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
+        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) {
+                    await Task.Delay(ex.RetryAfterMs.Value, cancellationToken);
+                    return await SendAsync(request, cancellationToken);
+                }
+
+                throw ex!;
+            }
+
+            throw new InvalidDataException("Encountered invalid data:\n" + content);
+        }
+
+        return a;
+    }
 }
\ No newline at end of file