public void Transfer(TransferStrategyOptions transferStrategyOptions)
 {
     var response = transferStrategyOptions.Client.GetObject(new GetObjectRequest(
         transferStrategyOptions.BucketName, transferStrategyOptions.ObjectName, transferStrategyOptions.Stream, transferStrategyOptions.JobId, transferStrategyOptions.BlobOffset));
     if (transferStrategyOptions.BlobOffset == 0)
     {
         transferStrategyOptions.MetadataListener?.Invoke(transferStrategyOptions.ObjectName, MetadataUtils.GetUriUnEscapeMetadata(response.Metadata));
     }
 }
        public void Transfer(TransferStrategyOptions transferStrategyOptions)
        {
            var currentTry = 0;

            while (true)
            {
                var request = new PutObjectRequest(transferStrategyOptions.BucketName, transferStrategyOptions.ObjectName, transferStrategyOptions.Stream)
                    .WithJob(transferStrategyOptions.JobId)
                    .WithOffset(transferStrategyOptions.BlobOffset);

                if (transferStrategyOptions.BlobOffset == 0 && transferStrategyOptions.MetadataAccess != null)
                {
                    request.WithMetadata(MetadataUtils.GetUriEscapeMetadata(transferStrategyOptions.MetadataAccess.GetMetadataValue(transferStrategyOptions.ObjectName)));
                }

                if (transferStrategyOptions.Checksum != null)
                {
                    request.WithChecksum(transferStrategyOptions.Checksum, transferStrategyOptions.ChecksumType);
                }

                try
                {
                    transferStrategyOptions.Client.PutObject(request);
                    return;
                }
                catch (Exception ex)
                {
                    if (ExceptionClassifier.IsRecoverableException(ex))
                    {
                        BestEffort.ModifyForRetry(transferStrategyOptions.Stream, transferStrategyOptions.ObjectTransferAttempts, ref currentTry, request.ObjectName, request.Offset.Value, ex);
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }