@@ -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
@@ -108,9 +114,45 @@ internal PutObjectRequest ConstructRequest()
108114
109115 private void PutObjectProgressEventCallback ( object sender , UploadProgressArgs e )
110116 {
111- var progressArgs = new UploadProgressArgs ( e . IncrementTransferred , e . TransferredBytes , e . TotalBytes ,
112- e . CompensationForRetry , _fileTransporterRequest . FilePath ) ;
117+ // Keep track of the total transferred bytes so that we can also return this value in case of failure
118+ long transferredBytes = Interlocked . Add ( ref _totalTransferredBytes , e . IncrementTransferred - e . CompensationForRetry ) ;
119+
120+ var progressArgs = new UploadProgressArgs ( e . IncrementTransferred , transferredBytes , _contentLength ,
121+ e . CompensationForRetry , _fileTransporterRequest . FilePath , _fileTransporterRequest ) ;
113122 this . _fileTransporterRequest . OnRaiseProgressEvent ( progressArgs ) ;
114123 }
124+
125+ private void FireTransferInitiatedEvent ( )
126+ {
127+ var initiatedArgs = new UploadInitiatedEventArgs (
128+ request : _fileTransporterRequest ,
129+ totalBytes : _contentLength
130+ ) ;
131+
132+ _fileTransporterRequest . OnRaiseTransferInitiatedEvent ( initiatedArgs ) ;
133+ }
134+
135+ private void FireTransferCompletedEvent ( TransferUtilityUploadResponse response )
136+ {
137+ var completedArgs = new UploadCompletedEventArgs (
138+ request : _fileTransporterRequest ,
139+ response : response ,
140+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
141+ totalBytes : _contentLength
142+ ) ;
143+
144+ _fileTransporterRequest . OnRaiseTransferCompletedEvent ( completedArgs ) ;
145+ }
146+
147+ private void FireTransferFailedEvent ( )
148+ {
149+ var failedArgs = new UploadFailedEventArgs (
150+ request : _fileTransporterRequest ,
151+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
152+ totalBytes : _contentLength
153+ ) ;
154+
155+ _fileTransporterRequest . OnRaiseTransferFailedEvent ( failedArgs ) ;
156+ }
115157 }
116158}
0 commit comments