@@ -41,12 +41,18 @@ internal partial class SimpleUploadCommand : BaseCommand
4141 IAmazonS3 _s3Client ;
4242 TransferUtilityConfig _config ;
4343 TransferUtilityUploadRequest _fileTransporterRequest ;
44+ long _totalTransferredBytes ;
45+ private readonly long _contentLength ;
4446
4547 internal SimpleUploadCommand ( IAmazonS3 s3Client , TransferUtilityConfig config , TransferUtilityUploadRequest fileTransporterRequest )
4648 {
4749 this . _s3Client = s3Client ;
4850 this . _config = config ;
4951 this . _fileTransporterRequest = fileTransporterRequest ;
52+
53+ // Cache content length immediately while stream is accessible to avoid ObjectDisposedException in failure scenarios
54+ this . _contentLength = this . _fileTransporterRequest . ContentLength ;
55+
5056 var fileName = fileTransporterRequest . FilePath ;
5157 }
5258
@@ -103,9 +109,48 @@ private PutObjectRequest ConstructRequest()
103109
104110 private void PutObjectProgressEventCallback ( object sender , UploadProgressArgs e )
105111 {
106- var progressArgs = new UploadProgressArgs ( e . IncrementTransferred , e . TransferredBytes , e . TotalBytes ,
107- e . CompensationForRetry , _fileTransporterRequest . FilePath ) ;
112+ // Keep track of the total transferred bytes so that we can also return this value in case of failure
113+ long transferredBytes = Interlocked . Add ( ref _totalTransferredBytes , e . IncrementTransferred - e . CompensationForRetry ) ;
114+
115+ var progressArgs = new UploadProgressArgs ( e . IncrementTransferred , transferredBytes , _contentLength ,
116+ e . CompensationForRetry , _fileTransporterRequest . FilePath , _fileTransporterRequest ) ;
108117 this . _fileTransporterRequest . OnRaiseProgressEvent ( progressArgs ) ;
109118 }
119+
120+ private void FireTransferInitiatedEvent ( )
121+ {
122+ var initiatedArgs = new UploadInitiatedEventArgs (
123+ request : _fileTransporterRequest ,
124+ filePath : _fileTransporterRequest . FilePath ,
125+ totalBytes : _contentLength
126+ ) ;
127+
128+ _fileTransporterRequest . OnRaiseTransferInitiatedEvent ( initiatedArgs ) ;
129+ }
130+
131+ private void FireTransferCompletedEvent ( TransferUtilityUploadResponse response )
132+ {
133+ var completedArgs = new UploadCompletedEventArgs (
134+ request : _fileTransporterRequest ,
135+ response : response ,
136+ filePath : _fileTransporterRequest . FilePath ,
137+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
138+ totalBytes : _contentLength
139+ ) ;
140+
141+ _fileTransporterRequest . OnRaiseTransferCompletedEvent ( completedArgs ) ;
142+ }
143+
144+ private void FireTransferFailedEvent ( )
145+ {
146+ var failedArgs = new UploadFailedEventArgs (
147+ request : _fileTransporterRequest ,
148+ filePath : _fileTransporterRequest . FilePath ,
149+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
150+ totalBytes : _contentLength
151+ ) ;
152+
153+ _fileTransporterRequest . OnRaiseTransferFailedEvent ( failedArgs ) ;
154+ }
110155 }
111156}
0 commit comments