Skip to content

Commit 2809a94

Browse files
refactor(Storage): Implement IDisposable on Crc32cHashInterceptor to prevent memory leaks
- Implement `IDisposable` on the nested `Crc32cHashInterceptor` class to explicitly unsubscribe from `UploadSessionData` and `ProgressChanged` events on disposal. - Invoke the interceptor's `Dispose` method during `CustomMediaUpload.Dispose()` to ensure robust cleanup and release resources during upload cancellation or early exit.
1 parent cffee35 commit 2809a94

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

apis/Google.Cloud.Storage.V1/Google.Cloud.Storage.V1/CustomMediaUpload.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@ public void Dispose()
5656
if (!_disposed)
5757
{
5858
_service?.HttpClient?.MessageHandler?.RemoveExecuteInterceptor(_interceptor);
59+
_interceptor?.Dispose();
5960
_disposed = true;
6061
}
6162
}
6263

63-
private sealed class Crc32cHashInterceptor : IHttpExecuteInterceptor
64+
private sealed class Crc32cHashInterceptor : IHttpExecuteInterceptor, IDisposable
6465
{
6566
private const string GoogleHashHeader = "x-goog-hash";
6667
private readonly IClientService _service;
@@ -112,6 +113,12 @@ private void OnProgressChanged(IUploadProgress progress)
112113
_mediaUpload.ProgressChanged -= OnProgressChanged;
113114
}
114115
}
116+
117+
public void Dispose()
118+
{
119+
_mediaUpload.UploadSessionData -= OnSessionData;
120+
_mediaUpload.ProgressChanged -= OnProgressChanged;
121+
}
115122
}
116123

117124
private static bool IsFinalChunk(string rangeHeader)

0 commit comments

Comments
 (0)