diff --git a/packages/storage_client/lib/src/fetch.dart b/packages/storage_client/lib/src/fetch.dart index 7362a2983..da68254fe 100644 --- a/packages/storage_client/lib/src/fetch.dart +++ b/packages/storage_client/lib/src/fetch.dart @@ -159,16 +159,21 @@ class Fetch { StorageRetryController? retryController, ) async { final headers = options?.headers ?? {}; - final request = http.MultipartRequest(method, Uri.parse(url)) - ..headers.addAll(headers) - ..files.add(multipartFile) - ..fields['cacheControl'] = fileOptions.cacheControl - ..headers['x-upsert'] = fileOptions.upsert.toString(); - if (fileOptions.metadata != null) { - request.fields['metadata'] = json.encode(fileOptions.metadata); - } - if (fileOptions.headers != null) { - request.headers.addAll(fileOptions.headers!); + + // Create a factory function that generates a fresh MultipartRequest for each attempt + http.MultipartRequest createRequest() { + final request = http.MultipartRequest(method, Uri.parse(url)) + ..headers.addAll(headers) + ..files.add(multipartFile) + ..fields['cacheControl'] = fileOptions.cacheControl + ..headers['x-upsert'] = fileOptions.upsert.toString(); + if (fileOptions.metadata != null) { + request.fields['metadata'] = json.encode(fileOptions.metadata); + } + if (fileOptions.headers != null) { + request.headers.addAll(fileOptions.headers!); + } + return request; } final http.StreamedResponse streamedResponse; @@ -178,6 +183,10 @@ class Fetch { () async { attempts++; _log.finest('Request: attempt: $attempts $method $url $headers'); + + // Create a fresh request for each retry attempt + final request = createRequest(); + if (httpClient != null) { return httpClient!.send(request); } else {