using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using WebDAVSharp.Server.Adapters; using WebDAVSharp.Server.Exceptions; using WebDAVSharp.Server.Stores; namespace WebDAVSharp.Server.MethodHandlers { /// /// This class implements the COPY HTTP method for WebDAV#. /// internal class WebDavCopyMethodHandler : WebDavMethodHandlerBase, IWebDavMethodHandler { /// /// Gets the collection of the names of the HTTP methods handled by this instance. /// /// /// The names. /// public IEnumerable Names { get { return new[] { "COPY" }; } } /// /// 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, HttpContext context, IWebDavStore store, String fileName) { IWebDavStoreItem source = GetItem(server, store, fileName); if (source is IWebDavStoreDocument || source is IWebDavStoreCollection) CopyItem(server, context, store, source); else throw new WebDavMethodNotAllowedException(); } /// /// Copies the item. /// /// The server. /// The context. /// The store. /// The source. /// /// private void CopyItem(WebDavServer server, HttpContext context, IWebDavStore store, IWebDavStoreItem source) { Uri destinationUri = GetDestinationHeader(context.Request); IWebDavStoreCollection destinationParentCollection = GetParentCollection(server, store, ExtractLocalPath(server, destinationUri.AbsoluteUri)); bool copyContent = (GetDepthHeader(context.Request) != 0); bool isNew = true; string destinationName = Uri.UnescapeDataString(destinationUri.Segments.Last().TrimEnd('/', '\\')); IWebDavStoreItem destination = destinationParentCollection.GetItemByName(destinationName); if (destination != null) { if (source.ItemPath == destination.ItemPath) throw new WebDavForbiddenException(); if (!GetOverwriteHeader(context.Request)) throw new WebDavPreconditionFailedException(); if (destination is IWebDavStoreCollection) destinationParentCollection.Delete(destination); isNew = false; } destinationParentCollection.CopyItemHere(source, destinationName, copyContent); context.SendSimpleResponse(isNew ? HttpStatusCode.Created : HttpStatusCode.NoContent); } } }