Class WebdavServlet

  • All Implemented Interfaces:
    Servlet, ServletConfig, java.io.Serializable, PeriodicEventListener

    public class WebdavServlet
    extends DefaultServlet
    implements PeriodicEventListener
    This servlet adds support for WebDAV level 3. All the basic HTTP requests are handled by the DefaultServlet.

    The WebDAV servlet is only designed for use with path mapping. The WebdavServlet must not be used as the default servlet (i.e. mapped to '/') or with any other mapping types as it will not work in those configurations.

    By default, the entire web application is exposed via the WebDAV servlet. Mapping the WebDAV servlet to /* provides WebDAV access to all the resources within the web application. To aid separation of normal users and WebDAV users, the WebDAV servlet may be mounted at a sub-path (e.g. /webdav/*) which creates an additional mapping for the entire web application under that sub-path, with WebDAV access to all the resources.

    By default, the WEB-INF and META-INF directories are not accessible via WebDAV. This may be changed by setting the allowSpecialPaths initialisation parameter to true.

    It is also possible to enable WebDAV access to a sub-set of the standard web application URL space rather than creating an additional, WebDAV specific mapping. To do this, map the WebDAV servlet to the desired sub-path and set the serveSubpathOnly initialisation parameter to true.

    Security constraints using the same URL pattern as the mapping (e.g. /webdav/*) can be used to limit the users with access to WebDAV functionality. Care is required if using security constraints to further limit WebDAV functionality. In particular, administrators should be aware that security constraints apply only to the request URL. Security constraints do not apply to any destination URL associated with the WebDAV operation (such as COPY or MOVE).

    To enable WebDAV for a context add the following to web.xml:

     <servlet>
      <servlet-name>webdav</servlet-name>
      <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>webdav</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
     
    This will enable read only access with folder listings enabled. To enable read-write access add:
      <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
      </init-param>
     
    To make the content editable via a different URL, use the following mapping:
      <servlet-mapping>
        <servlet-name>webdav</servlet-name>
        <url-pattern>/webdavedit/*</url-pattern>
      </servlet-mapping>
     
    By default, access to /WEB-INF and META-INF are not available via WebDAV. To enable access to these URLs, add:
      <init-param>
        <param-name>allowSpecialPaths</param-name>
        <param-value>true</param-value>
      </init-param>
     
    Don't forget to secure access appropriately to the editing URLs, especially if allowSpecialPaths is used. With the mapping configuration above, the context will be accessible to normal users as before. Those users with the necessary access will be able to edit content available via http://host:port/context/content using http://host:port/context/webdavedit/content

    The Servlet provides support for arbitrary dead properties on all resources (dead properties are properties whose values are not protected by the server, such as the content length of a resource). By default, the Servlet will use non persistent memory storage for them. Persistence can be achieved by implementing the PropertyStore interface and configuring the Servlet to use that store. The propertyStore init-param allows configuring the class name of the store to use, while the parameters in the form of store.xxx will be set on the store object as bean properties. For example, this would configure a store with class com.MyPropertyStore, and set its property myName to value myValue:

      <init-param>
        <param-name>propertyStore</param-name>
        <param-value>com.MyPropertyStore</param-value>
      </init-param>
      <init-param>
        <param-name>store.myName</param-name>
        <param-value>myValue</param-value>
      </init-param>
     

    See Also:
    RFC 4918, Serialized Form
    • Field Detail

      • DEFAULT_NAMESPACE

        protected static final java.lang.String DEFAULT_NAMESPACE
        Default namespace.
        See Also:
        Constant Field Values
      • SUPPORTED_LOCKS

        protected static final java.lang.String SUPPORTED_LOCKS
        Pre generated raw XML for supported locks.
        See Also:
        Constant Field Values
      • creationDateFormat

        protected static final ConcurrentDateFormat creationDateFormat
        Simple date format for the creation date ISO representation (partial).
      • LOCK_SCHEME

        protected static final java.lang.String LOCK_SCHEME
        Lock scheme used.
        See Also:
        Constant Field Values
    • Constructor Detail

      • WebdavServlet

        public WebdavServlet()
    • Method Detail

      • getDocumentBuilder

        protected javax.xml.parsers.DocumentBuilder getDocumentBuilder()
                                                                throws ServletException
        Return JAXP document builder instance.
        Returns:
        the document builder
        Throws:
        ServletException - document builder creation failed (wrapped ParserConfigurationException exception)
      • checkIfHeaders

        protected boolean checkIfHeaders​(HttpServletRequest request,
                                         HttpServletResponse response,
                                         WebResource resource)
                                  throws java.io.IOException
        Description copied from class: DefaultServlet
        Check if the conditions specified in the optional If headers are satisfied.
        Overrides:
        checkIfHeaders in class DefaultServlet
        Parameters:
        request - The servlet request we are processing
        response - The servlet response we are creating
        resource - The resource
        Returns:
        true if the resource meets all the specified conditions, and false if any of the conditions is not satisfied, in which case request processing is stopped
        Throws:
        java.io.IOException - an IO error occurred
      • getRelativePath

        protected java.lang.String getRelativePath​(HttpServletRequest request,
                                                   boolean allowEmptyPath)
        Override the DefaultServlet implementation and only use the PathInfo. If the ServletPath is non-null, it will be because the WebDAV servlet has been mapped to a url other than /* to configure editing at different url than normal viewing.
        Overrides:
        getRelativePath in class DefaultServlet
        Parameters:
        request - The servlet request we are processing
        allowEmptyPath - Used only to identify a call from DefaultServlet, to avoid removing the trailing slash
        Returns:
        the relative path
      • doProppatch

        protected void doProppatch​(HttpServletRequest req,
                                   HttpServletResponse resp)
                            throws ServletException,
                                   java.io.IOException
        PROPPATCH Method. Dead properties support is a SHOULD in the specification and are not implemented.
        Parameters:
        req - The Servlet request
        resp - The Servlet response
        Throws:
        ServletException - If an error occurs
        java.io.IOException - If an IO error occurs
      • doDelete

        protected void doDelete​(HttpServletRequest req,
                                HttpServletResponse resp)
                         throws ServletException,
                                java.io.IOException
        Description copied from class: jakarta.servlet.http.HttpServlet
        Called by the server (via the service method) to allow a servlet to handle a DELETE request. The DELETE operation allows a client to remove a document or Web page from the server.

        This method does not need to be either safe or idempotent. Operations requested through DELETE can have side effects for which users can be held accountable. When using this method, it may be useful to save a copy of the affected URL in temporary storage.

        If the HTTP DELETE request is incorrectly formatted, doDelete returns an HTTP "Bad Request" message.

        Overrides:
        doDelete in class DefaultServlet
        Parameters:
        req - the HttpServletRequest object that contains the request the client made of the servlet
        resp - the HttpServletResponse object that contains the response the servlet returns to the client
        Throws:
        ServletException - if the request for the DELETE cannot be handled
        java.io.IOException - if an input or output error occurs while the servlet is handling the DELETE request
      • doPut

        protected void doPut​(HttpServletRequest req,
                             HttpServletResponse resp)
                      throws ServletException,
                             java.io.IOException
        Description copied from class: jakarta.servlet.http.HttpServlet
        Called by the server (via the service method) to allow a servlet to handle a PUT request. The PUT operation allows a client to place a file on the server and is similar to sending a file by FTP.

        When overriding this method, leave intact any content headers sent with the request (including Content-Length, Content-Type, Content-Transfer-Encoding, Content-Encoding, Content-Base, Content-Language, Content-Location, Content-MD5, and Content-Range). If your method cannot handle a content header, it must issue an error message (HTTP 501 - Not Implemented) and discard the request. For more information on HTTP 1.1, see RFC 2616 .

        This method does not need to be either safe or idempotent. Operations that doPut performs can have side effects for which the user can be held accountable. When using this method, it may be useful to save a copy of the affected URL in temporary storage.

        If the HTTP PUT request is incorrectly formatted, doPut returns an HTTP "Bad Request" message.

        Overrides:
        doPut in class DefaultServlet
        Parameters:
        req - the HttpServletRequest object that contains the request the client made of the servlet
        resp - the HttpServletResponse object that contains the response the servlet returns to the client
        Throws:
        ServletException - if the request for the PUT cannot be handled
        java.io.IOException - if an input or output error occurs while the servlet is handling the PUT request
      • doCopy

        protected void doCopy​(HttpServletRequest req,
                              HttpServletResponse resp)
                       throws java.io.IOException
        COPY Method.
        Parameters:
        req - The Servlet request
        resp - The Servlet response
        Throws:
        java.io.IOException - If an IO error occurs
      • doMove

        protected void doMove​(HttpServletRequest req,
                              HttpServletResponse resp)
                       throws java.io.IOException
        MOVE Method.
        Parameters:
        req - The Servlet request
        resp - The Servlet response
        Throws:
        java.io.IOException - If an IO error occurs
      • doUnlock

        protected void doUnlock​(HttpServletRequest req,
                                HttpServletResponse resp)
                         throws java.io.IOException
        UNLOCK Method.
        Parameters:
        req - The Servlet request
        resp - The Servlet response
        Throws:
        java.io.IOException - If an IO error occurs