Click or drag to resize

IMethodHandler Interface

IT Hit WebDAV Classes Reference
Represents HTTP method handler.

Namespace: ITHit.WebDAV.Server.Extensibility
Assembly: ITHit.WebDAV.Server (in ITHit.WebDAV.Server.dll) Version: 4.5.3121.0
Syntax
public interface IMethodHandler

The IMethodHandler type exposes the following members.

Properties
  NameDescription
Public propertyEnableInputDebugLogging
Determines whether input read by this handler shall be logged if debug logging is enabled.
Public propertyEnableOutputBuffering
Determines whether engine can buffer content to calculate content length.
Public propertyEnableOutputDebugLogging
Determines whether output produces by this handler shall be logged if debug logging is enabled.
Top
Methods
  NameDescription
Public methodAppliesTo
Determines whether this method shall be enlisted in 'supported-method-set' for item.
Public methodProcessRequest
Enables processing of HTTP Web requests by a custom handler.
Top
Remarks

The IT Hit WebDAV Server Engine allows creating custom HTTP handlers and replacing original engine handlers. To add or replace handler call RegisterMethodHandler(String, IMethodHandler) method passing HTTP method name and object instance implementing IMethodHandler. The original handler, if any, is returned from RegisterMethodHandler(String, IMethodHandler) method.

The ProcessRequest(DavContextBase, IHierarchyItem) method of this interface is called by the engine during Run(DavContextBase) call. The hierarchy item returned from GetHierarchyItem(String) is passed to ProcessRequest method as a parameter.

Remarks
The handler must call BeforeResponse when all update methods have been called and the handler is about to start writing response.
Examples

The code below is part of 'CardDAVServer.NtfsStorage' sample provided with the SDK.

internal class MyCustomGetHandler : IMethodHandler
{
    public IMethodHandler OriginalHandler { get; set; }

    public bool EnableOutputBuffering
    {
        get { return false; }
    }

    public bool EnableOutputDebugLogging
    {
        get { return false; }
    }

    public bool EnableInputDebugLogging
    {
        get { return false; }
    }

    public void ProcessRequest(DavContextBase context, IHierarchyItem item)
    {
        string htmlPath = HttpContext.Current.Request.MapPath("/");

        if (item is IItemCollection)
        {
            // In case of GET requests to WebDAV folders we serve a web page to display 
            // any information about this server and how to use it.

            // Remember to call EnsureBeforeResponseWasCalled here if your context implementation
            // makes some useful things in BeforeResponseAsync.
            context.EnsureBeforeResponseWasCalled();

            // Request to iOS/OS X CalDAV/CardDAV profile.
            if (context.Request.RawUrl.EndsWith("?connect"))
            {
                WriteProfile(context, item, htmlPath);
                return;
            }
            IHttpAsyncHandler page = (IHttpAsyncHandler)System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(
                "~/MyCustomHandlerPage.aspx", typeof(MyCustomHandlerPage));
            page.ProcessRequest(HttpContext.Current);
        }
        else
        {
            OriginalHandler.ProcessRequest(context, item);
        }
    }

    public bool AppliesTo(IHierarchyItem item)
    {
        return item is IFolder || OriginalHandler.AppliesTo(item);
    }

    private void WriteProfile(DavContextBase context, IHierarchyItem item, string htmlPath)
    {
        string mobileconfigFileName = null;
        string decription = null;
        if (item is IAddressbookFolder)
        {
            mobileconfigFileName = "CardDAV.AppleProfileTemplete.mobileconfig";
            decription = (item as IAddressbookFolder).AddressbookDescription;
        }

        decription = !string.IsNullOrEmpty(decription) ? decription : item.Name;

        string templateContent = null;
        using (TextReader reader = new StreamReader(Path.Combine(htmlPath, mobileconfigFileName)))
        {
            templateContent = reader.ReadToEnd();
        }

        Uri url = new Uri(context.Request.UrlPrefix);

        string payloadUUID = item.Path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); // PayloadUUID

        string profile = string.Format(templateContent
            , url.Host // host name
            , item.Path // CalDAV / CardDAV Principal URL. Here we can return ((item as ICurrentUserPrincipal).GetCurrentUserPrincipal()).Path if needed.
            , (context as DavContext).UserName // user name
            , url.Port // port                
            , (url.Scheme == "https").ToString().ToLower() // SSL
            , decription // CardDAV / CardDAV Account Description
            , Assembly.GetAssembly(this.GetType()).GetName().Version.ToString()
            , Assembly.GetAssembly(typeof(DavEngine)).GetName().Version.ToString()
            , payloadUUID
            );

        byte[] profileBytes = SignProfile(context, profile);

        context.Response.ContentType = "application/x-apple-aspen-config";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=profile.mobileconfig");
        context.Response.ContentLength = profileBytes.Length;
        using (BinaryWriter writer = new BinaryWriter(context.Response.OutputStream))
        {
            writer.Write(profileBytes);
        }
    }

    private byte[] SignProfile(DavContextBase context, string profile)
    {
        // Here you will sign your profile with SSL certificate to avoid "Unsigned" warning on iOS and OS X.
        // For demo purposes we just return the profile content unmodified.
        return context.Engine.ContentEncoding.GetBytes(profile);
    }
}
See Also