Package org.apache.catalina.servlets

# Class WebdavServlet

java.lang.Object
javax.servlet.GenericServlet
javax.servlet.http.HttpServlet
org.apache.catalina.servlets.DefaultServlet
org.apache.catalina.servlets.WebdavServlet

All Implemented Interfaces:
  `Serializable`, `Servlet`, `ServletConfig`, `PeriodicEventListener`

public class WebdavServlet extends DefaultServlet implements PeriodicEventListener
Servlet which adds support for WebDAV level 2. All the basic HTTP requests are handled by the DefaultServlet. The WebDAVServlet must not be used as the default servlet (ie mapped to '/') as it will not work in this configuration.

Mapping a subpath (e.g. `/webdav/*` to this servlet has the effect of re-mounting the entire web application under that sub-path, with WebDAV access to all the resources. The `WEB-INF` and `META-INF` directories are protected in this re-mounted resource tree.

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>false</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>webdav</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>

This will enable read only access. 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, use 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

See Also:
  - RFC 4918
  - Serialized Form

## Nested Class Summary

## Nested classes/interfaces inherited from class org.apache.catalina.servlets.DefaultServlet

`DefaultServlet.CompressionFormat, DefaultServlet.Range`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected static final ConcurrentDateFormat`
`creationDateFormat`
Simple date format for the creation date ISO representation (partial).
`protected static final String`
`DEFAULT_NAMESPACE`
Default namespace.

### Fields inherited from class org.apache.catalina.servlets.DefaultServlet

`BUFFER_SIZE, compressionFormats, contextXsltFile, debug, fileEncoding, FULL, globalXsltFile, input, listings, localXsltFile, mimeSeparation, output, readmeFile, readOnly, resources, sendfileSize, showServerInfo, sm, sortListings, sortManager, useAcceptRanges`

## Constructor Summary

Constructors
Constructor
Description
`WebdavServlet()`

## Method Summary

Modifier and Type
Method
Description
`protected boolean`
`checkIfHeaders(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
Check if the conditions specified in the optional If headers are satisfied.
`protected String`
`determineMethodsAllowed(HttpServletRequest req)`
Determines the methods normally allowed for the resource.
`protected void`
`doCopy(HttpServletRequest req, HttpServletResponse resp)`
COPY Method.
`protected void`
`doDelete(HttpServletRequest req, HttpServletResponse resp)`
Called by the server (via the `service` method) to allow a servlet to handle a DELETE request.
`protected void`
`doLock(HttpServletRequest req, HttpServletResponse resp)`
LOCK Method.
`protected void`
`doMkcol(HttpServletRequest req, HttpServletResponse resp)`
MKCOL Method.
`protected void`
`doMove(HttpServletRequest req, HttpServletResponse resp)`
MOVE Method.
`protected void`
`doOptions(HttpServletRequest req, HttpServletResponse resp)`
Override default implementation to ensure that TRACE is correctly handled.
`protected void`
`doPropfind(HttpServletRequest req, HttpServletResponse resp)`
PROPFIND Method.
`protected void`
`doProppatch(HttpServletRequest req, HttpServletResponse resp)`
PROPPATCH Method.
`protected void`
`doPut(HttpServletRequest req, HttpServletResponse resp)`
Called by the server (via the `service` method) to allow a servlet to handle a PUT request.
`protected void`
`doUnlock(HttpServletRequest req, HttpServletResponse resp)`
UNLOCK Method.
`protected DocumentBuilder`
`getDocumentBuilder()`
Return JAXP document builder instance.
`protected String`
`getPathPrefix(HttpServletRequest request)`
Determines the appropriate path to prepend resources with when generating directory listings.
`protected String`
`getRelativePath(HttpServletRequest request)`
Override the DefaultServlet implementation and only use the PathInfo.
`protected String`
`getRelativePath(HttpServletRequest request, boolean allowEmptyPath)`
`void`
`init()`
A convenience method which can be overridden so that there's no need to call `super.init(config)`.
`void`
`periodicEvent()`
Execute a periodic task, such as reloading, etc.
`protected void`
`service(HttpServletRequest req, HttpServletResponse resp)`
Handles the special WebDAV methods.

### Methods inherited from class org.apache.catalina.servlets.DefaultServlet

`checkIfMatch, checkIfModifiedSince, checkIfNoneMatch, checkIfUnmodifiedSince, checkSendfile, copy, copy, copy, copy, copyRange, copyRange, copyRange, destroy, doGet, doHead, doPost, executePartialPut, findXsltSource, generateETag, getReadme, parseContentRange, parseRange, render, render, renderHtml, renderHtml, renderSize, renderXml, renderXml, rewriteUrl, sendNotAllowed, serveResource`

### Methods inherited from class javax.servlet.http.HttpServlet

`doTrace, getLastModified, service`

### Methods inherited from class javax.servlet.GenericServlet

`getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, log, log`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### DEFAULT_NAMESPACE

protected static final String DEFAULT_NAMESPACE
Default namespace.

See Also:
  - Constant Field Values

### creationDateFormat

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

## Constructor Details

### WebdavServlet

public WebdavServlet()

## Method Details

### init

public void init() throws ServletException
Description copied from class: `javax.servlet.GenericServlet`
A convenience method which can be overridden so that there's no need to call `super.init(config)`.

Instead of overriding `GenericServlet.init(ServletConfig)`, simply override this method and it will be called by `GenericServlet.init(ServletConfig config)`. The `ServletConfig` object can still be retrieved via `GenericServlet.getServletConfig()`.

Overrides:
  `init` in class `DefaultServlet`
Throws:
  `ServletException` - if an exception occurs that interrupts the servlet's normal operation

### periodicEvent

public void periodicEvent()
Description copied from interface: `PeriodicEventListener`
Execute a periodic task, such as reloading, etc.

Specified by:
  `periodicEvent` in interface `PeriodicEventListener`

### getDocumentBuilder

protected DocumentBuilder getDocumentBuilder() throws ServletException
Return JAXP document builder instance.

Returns:
  the document builder
Throws:
  `ServletException` - document builder creation failed (wrapped `ParserConfigurationException` exception)

### service

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Handles the special WebDAV methods.

Overrides:
  `service` 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 HTTP request cannot be handled
  `IOException` - if an input or output error occurs while the servlet is handling the HTTP request
See Also:
  - `Servlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)`

### checkIfHeaders

protected boolean checkIfHeaders(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws 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:
  `IOException` - an IO error occurred

### getRelativePath

protected String getRelativePath(HttpServletRequest request)
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
Returns:
  the relative path

### getRelativePath

protected String getRelativePath(HttpServletRequest request, boolean allowEmptyPath)

Overrides:
  `getRelativePath` in class `DefaultServlet`

### getPathPrefix

protected String getPathPrefix(HttpServletRequest request)
Description copied from class: `DefaultServlet`
Determines the appropriate path to prepend resources with when generating directory listings. Depending on the behaviour of `DefaultServlet.getRelativePath(HttpServletRequest)` this will change.

Overrides:
  `getPathPrefix` in class `DefaultServlet`
Parameters:
  `request` - the request to determine the path for
Returns:
  the prefix to apply to all resources in the listing.

### doOptions

protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Description copied from class: `DefaultServlet`
Override default implementation to ensure that TRACE is correctly handled.

Overrides:
  `doOptions` 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 OPTIONS cannot be handled
  `IOException` - if an input or output error occurs while the servlet is handling the OPTIONS request

### doPropfind

protected void doPropfind(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
PROPFIND Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `ServletException` - If an error occurs
  `IOException` - If an IO error occurs

### doProppatch

protected void doProppatch(HttpServletRequest req, HttpServletResponse resp) throws IOException
PROPPATCH Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `IOException` - If an IO error occurs

### doMkcol

protected void doMkcol(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
MKCOL Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `ServletException` - If an error occurs
  `IOException` - If an IO error occurs

### doDelete

protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Description copied from class: `javax.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
  `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, IOException
Description copied from class: `javax.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
  `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 IOException
COPY Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `IOException` - If an IO error occurs

### doMove

protected void doMove(HttpServletRequest req, HttpServletResponse resp) throws IOException
MOVE Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `IOException` - If an IO error occurs

### doLock

protected void doLock(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
LOCK Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `ServletException` - If an error occurs
  `IOException` - If an IO error occurs

### doUnlock

protected void doUnlock(HttpServletRequest req, HttpServletResponse resp) throws IOException
UNLOCK Method.

Parameters:
  `req` - The Servlet request
  `resp` - The Servlet response
Throws:
  `IOException` - If an IO error occurs

### determineMethodsAllowed

protected String determineMethodsAllowed(HttpServletRequest req)
Description copied from class: `DefaultServlet`
Determines the methods normally allowed for the resource.

Overrides:
  `determineMethodsAllowed` in class `DefaultServlet`
Parameters:
  `req` - The Servlet request
Returns:
  The allowed HTTP methods