Skip to content

Commit cffee35

Browse files
fix(Storage): Resolve memory leak by implementing IDisposable for interceptor cleanup
The Crc32cHashInterceptor is registered globally on the shared HttpClient.MessageHandler. Previously, cleanup only occurred on successful or failed upload events. If an upload was cancelled or aborted, the interceptor remained in the handler's interceptor list indefinitely, causing a memory leak. Added IDisposable to CustomMediaUpload to ensure the interceptor is explicitly removed from the MessageHandler even if the upload does not reach a terminal state.
1 parent 0371e67 commit cffee35

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ namespace Google.Cloud.Storage.V1
2828
/// <summary>
2929
/// Upload subclass which allows us to modify headers, for customer-supplied encryption keys.
3030
/// </summary>
31-
internal sealed class CustomMediaUpload : InsertMediaUpload
31+
internal sealed class CustomMediaUpload : InsertMediaUpload, IDisposable
3232
{
3333
private readonly Crc32cHashInterceptor _interceptor;
3434
private readonly IClientService _service;
3535
private readonly HashingStream _hashingStream;
36+
private bool _disposed;
3637

3738
public CustomMediaUpload(IClientService service, Apis.Storage.v1.Data.Object body, string bucket,
3839
Stream stream, string contentType, UploadObjectOptions options)
@@ -50,6 +51,15 @@ public CustomMediaUpload(IClientService service, Apis.Storage.v1.Data.Object bod
5051

5152
internal new ResumableUploadOptions Options => base.Options;
5253

54+
public void Dispose()
55+
{
56+
if (!_disposed)
57+
{
58+
_service?.HttpClient?.MessageHandler?.RemoveExecuteInterceptor(_interceptor);
59+
_disposed = true;
60+
}
61+
}
62+
5363
private sealed class Crc32cHashInterceptor : IHttpExecuteInterceptor
5464
{
5565
private const string GoogleHashHeader = "x-goog-hash";

0 commit comments

Comments
 (0)