openstacknetsdk / openstack.net

An OpenStack Cloud SDK for Microsoft .NET
http://www.openstacknetsdk.org
Other
117 stars 101 forks source link

Check if MoveObject was called with the same src and dest location #612

Closed carolynvs closed 8 years ago

carolynvs commented 8 years ago

CloudFilesProvider.MoveObject can end up deleting the object entirely if the source and destination location is the same. This doesn't happen with providers that support the move command, only with providers like Rackspace, where the SDK has to use a COPY + DELETE to accomplish a move.

using System.IO;
using System.Text;
using net.openstack.Core.Domain;
using net.openstack.Providers.Rackspace;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            const string region = "DFW";
            var user = new CloudIdentity
            {
                Username = "{username}",
                APIKey = "{apikey}"
            };

            var cloudFiles = new CloudFilesProvider(user);

            // Setup a test container and file
            cloudFiles.CreateContainer("test", region: region);
            var testObject = new MemoryStream(Encoding.UTF8.GetBytes("hello world"));
            cloudFiles.CreateObject("test", testObject, "helloworld.html", region: region);

            // Accidentally specify that the file should be moved to its current location
            cloudFiles.MoveObject("test", "helloworld.html", "test", "helloworld.html", region: region);

            /* This results in the file being copied "in-place" and then deleted. Fiddler output below:
            COPY /test/helloworld.html
            201 Created(text / html)

            HEAD /test/helloworld.html
            200 OK(text / html)

            DELETE /test/helloworld.html
            204 No Content (text / html)
            */
        }
    }
}

MoveObject should check if the source and destination are the same, and throw an argument exception to prevent accidentally deleting a file.