/// <summary>
    ///     private helper method to remove list of objects from bucket
    /// </summary>
    /// <param name="args">GetObjectArgs Arguments Object encapsulates information like - bucket name, object name etc </param>
    /// <param name="cancellationToken">Optional cancellation token to cancel the operation</param>
    private async Task <ObjectStat> getObjectHelper(GetObjectArgs args, CancellationToken cancellationToken = default)
    {
        // StatObject is called to both verify the existence of the object and return it with GetObject.
        // NOTE: This avoids writing the error body to the action stream passed (Do not remove).
        var statArgs = new StatObjectArgs()
                       .WithBucket(args.BucketName)
                       .WithObject(args.ObjectName)
                       .WithVersionId(args.VersionId)
                       .WithMatchETag(args.MatchETag)
                       .WithNotMatchETag(args.NotMatchETag)
                       .WithModifiedSince(args.ModifiedSince)
                       .WithUnModifiedSince(args.UnModifiedSince)
                       .WithServerSideEncryption(args.SSE);

        if (args.OffsetLengthSet)
        {
            statArgs.WithOffsetAndLength(args.ObjectOffset, args.ObjectLength);
        }
        var objStat = await StatObjectAsync(statArgs, cancellationToken).ConfigureAwait(false);

        args.Validate();
        if (args.FileName != null)
        {
            await getObjectFileAsync(args, objStat, cancellationToken);
        }
        else
        {
            await getObjectStreamAsync(args, objStat, args.CallBack, cancellationToken);
        }
        return(objStat);
    }