22using System . Collections . Generic ;
33using System . IO ;
44using System . Net . Http ;
5+ using System . Text . Json ;
56using System . Threading ;
67using System . Threading . Tasks ;
78using BirdMessenger ;
89using BirdMessenger . Collections ;
9- using Newtonsoft . Json ;
10+ using BirdMessenger . Delegates ;
11+ using BirdMessenger . Infrastructure ;
1012using Supabase . Storage . Exceptions ;
1113
1214namespace Supabase . Storage . Extensions
@@ -45,7 +47,10 @@ public static async Task<MemoryStream> DownloadDataAsync(
4547 if ( ! response . IsSuccessStatusCode )
4648 {
4749 var content = await response . Content . ReadAsStringAsync ( ) ;
48- var errorResponse = JsonConvert . DeserializeObject < ErrorResponse > ( content ) ;
50+ var errorResponse = JsonSerializer . Deserialize < ErrorResponse > (
51+ content ,
52+ Helpers . JsonOptions
53+ ) ;
4954 var e = new SupabaseStorageException ( errorResponse ? . Message ?? content )
5055 {
5156 Content = content ,
@@ -175,12 +180,15 @@ public static async Task<HttpResponseMessage> UploadAsync(
175180 }
176181 }
177182
178- var response = await client . PostAsync ( uri , content , cancellationToken ) ;
183+ var response = await client . PostAsync ( uri , content , cancellationToken ) ;
179184
180185 if ( ! response . IsSuccessStatusCode )
181186 {
182187 var httpContent = await response . Content . ReadAsStringAsync ( ) ;
183- var errorResponse = JsonConvert . DeserializeObject < ErrorResponse > ( httpContent ) ;
188+ var errorResponse = JsonSerializer . Deserialize < ErrorResponse > (
189+ httpContent ,
190+ Helpers . JsonOptions
191+ ) ;
184192 var e = new SupabaseStorageException ( errorResponse ? . Message ?? httpContent )
185193 {
186194 Content = httpContent ,
@@ -273,24 +281,26 @@ private static async Task<HttpResponseMessage> ResumableUploadAsync(
273281 UploadLength = fileStream . Length ,
274282 } ;
275283
276- var responseCreate = await client . TusCreateAsync ( createOption , cancellationToken ) ;
284+ TusCreateResponse ? responseCreate ;
285+ try
286+ {
287+ responseCreate = await client . TusCreateAsync ( createOption , cancellationToken ) ;
288+ }
289+ catch ( Exception exception )
290+ {
291+ if ( exception is not TusException response )
292+ throw ;
293+
294+ throw await HandleResponseError ( response ) ;
295+ }
277296
278297 var patchOption = new TusPatchRequestOption
279298 {
280299 FileLocation = responseCreate . FileLocation ,
281300 Stream = fileStream ,
282301 UploadBufferSize = 6 * 1024 * 1024 ,
283302 UploadType = UploadType . Chunk ,
284- OnProgressAsync = x =>
285- {
286- if ( progress == null )
287- return Task . CompletedTask ;
288-
289- var uploadedProgress = ( float ) x . UploadedSize / x . TotalSize * 100f ;
290- progress . Report ( uploadedProgress ) ;
291-
292- return Task . CompletedTask ;
293- } ,
303+ OnProgressAsync = x => ReportProgressAsync ( progress , x ) ,
294304 OnCompletedAsync = _ => Task . CompletedTask ,
295305 OnFailedAsync = _ => Task . CompletedTask ,
296306 } ;
@@ -300,19 +310,57 @@ private static async Task<HttpResponseMessage> ResumableUploadAsync(
300310 if ( responsePatch . OriginResponseMessage . IsSuccessStatusCode )
301311 return responsePatch . OriginResponseMessage ;
302312
303- var httpContent = await responsePatch . OriginResponseMessage . Content . ReadAsStringAsync ( ) ;
304- var errorResponse = JsonConvert . DeserializeObject < ErrorResponse > ( httpContent ) ;
305- var e = new SupabaseStorageException ( errorResponse ? . Message ?? httpContent )
313+ throw await HandleResponseError ( responsePatch . OriginResponseMessage ) ;
314+ }
315+
316+ private static Task ReportProgressAsync (
317+ IProgress < float > ? progress ,
318+ UploadProgressEvent progressInfo
319+ )
320+ {
321+ if ( progress == null )
322+ return Task . CompletedTask ;
323+
324+ var uploadedProgress = ( float ) progressInfo . UploadedSize / progressInfo . TotalSize * 100f ;
325+ progress . Report ( uploadedProgress ) ;
326+
327+ return Task . CompletedTask ;
328+ }
329+
330+ private static async Task < SupabaseStorageException > HandleResponseError (
331+ HttpResponseMessage response
332+ )
333+ {
334+ var httpContent = await response . Content . ReadAsStringAsync ( ) ;
335+ var errorResponse = JsonSerializer . Deserialize < ErrorResponse > (
336+ httpContent ,
337+ Helpers . JsonOptions
338+ ) ;
339+ var error = new SupabaseStorageException ( errorResponse ? . Message ?? httpContent )
340+ {
341+ Content = httpContent ,
342+ Response = response ,
343+ StatusCode = errorResponse ? . StatusCode ?? ( int ) response . StatusCode ,
344+ } ;
345+ error . AddReason ( ) ;
346+
347+ return error ;
348+ }
349+
350+ private static async Task < SupabaseStorageException > HandleResponseError (
351+ TusException response
352+ )
353+ {
354+ var httpContent = await response . OriginHttpResponse . Content . ReadAsStringAsync ( ) ;
355+ var error = new SupabaseStorageException ( httpContent )
306356 {
307357 Content = httpContent ,
308- Response = responsePatch . OriginResponseMessage ,
309- StatusCode =
310- errorResponse ? . StatusCode
311- ?? ( int ) responsePatch . OriginResponseMessage . StatusCode ,
358+ Response = response . OriginHttpResponse ,
359+ StatusCode = ( int ) response . OriginHttpResponse . StatusCode ,
312360 } ;
361+ error . AddReason ( ) ;
313362
314- e . AddReason ( ) ;
315- throw e ;
363+ return error ;
316364 }
317365 }
318366}
0 commit comments