using System; using System.Collections.Generic; using System.Linq; using System.Net; using Mtp2Dav.WebDAVSharp.Server._1d2086a502937936ebc6bfe19cfa15d855be1c31.Adapters; using Mtp2Dav.WebDAVSharp.Server._1d2086a502937936ebc6bfe19cfa15d855be1c31.Exceptions; using Mtp2Dav.WebDAVSharp.Server._1d2086a502937936ebc6bfe19cfa15d855be1c31.Stores; namespace Mtp2Dav.WebDAVSharp.Server._1d2086a502937936ebc6bfe19cfa15d855be1c31.MethodHandlers { /// /// This class implements the MOVE HTTP method for WebDAV#. /// internal class WebDavMoveMethodHandler : WebDavMethodHandlerBase, IWebDavMethodHandler { /// /// Gets the collection of the names of the HTTP methods handled by this instance. /// /// /// The names. /// public IEnumerable Names => new[] { "MOVE" }; /// /// Processes the request. /// /// The through which the request came in from the client. /// /// The /// object containing both the request and response /// objects to use. /// /// The that the is hosting. public void ProcessRequest(WebDavServer server, IHttpListenerContext context, IWebDavStore store) { var source = context.Request.Url.GetItem(server, store); MoveItem(server, context, store, source); } /// /// Moves the /// /// The through which the request came in from the client. /// /// The /// object containing both the request and response /// objects to use. /// /// The that the is hosting. /// The that will be moved /// /// If the source path is the same as the /// destination path /// /// If one of the preconditions failed private void MoveItem(WebDavServer server, IHttpListenerContext context, IWebDavStore store, IWebDavStoreItem sourceWebDavStoreItem) { var destinationUri = GetDestinationHeader(context.Request); var destinationParentCollection = GetParentCollection(server, store, destinationUri); var isNew = true; var destinationName = Uri.UnescapeDataString(destinationUri.Segments.Last().TrimEnd('/', '\\')); var destination = destinationParentCollection.GetItemByName(destinationName); if (destination != null) { if (sourceWebDavStoreItem.ItemPath == destination.ItemPath) throw new WebDavForbiddenException(); // if the overwrite header is F, statuscode = precondition failed if (!GetOverwriteHeader(context.Request)) throw new WebDavPreconditionFailedException(); // else delete destination and set isNew to false destinationParentCollection.Delete(destination); isNew = false; } destinationParentCollection.MoveItemHere(sourceWebDavStoreItem, destinationName); // send correct response context.SendSimpleResponse(isNew ? HttpStatusCode.Created : HttpStatusCode.NoContent); } } }