@@ -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,48 @@ 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+ filePath : _fileTransporterRequest . FilePath ,
130+ totalBytes : _contentLength
131+ ) ;
132+
133+ _fileTransporterRequest . OnRaiseTransferInitiatedEvent ( initiatedArgs ) ;
134+ }
135+
136+ private void FireTransferCompletedEvent ( TransferUtilityUploadResponse response )
137+ {
138+ var completedArgs = new UploadCompletedEventArgs (
139+ request : _fileTransporterRequest ,
140+ response : response ,
141+ filePath : _fileTransporterRequest . FilePath ,
142+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
143+ totalBytes : _contentLength
144+ ) ;
145+
146+ _fileTransporterRequest . OnRaiseTransferCompletedEvent ( completedArgs ) ;
147+ }
148+
149+ private void FireTransferFailedEvent ( )
150+ {
151+ var failedArgs = new UploadFailedEventArgs (
152+ request : _fileTransporterRequest ,
153+ filePath : _fileTransporterRequest . FilePath ,
154+ transferredBytes : Interlocked . Read ( ref _totalTransferredBytes ) ,
155+ totalBytes : _contentLength
156+ ) ;
157+
158+ _fileTransporterRequest . OnRaiseTransferFailedEvent ( failedArgs ) ;
159+ }
115160 }
116161}
0 commit comments