nginx-dav-ext-module icon indicating copy to clipboard operation
nginx-dav-ext-module copied to clipboard

nginx WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK support


nginx-dav-ext-module


nginx_ WebDAV_ PROPFIND,OPTIONS,LOCK,UNLOCK support.

.. contents::

About

The standard ngx_http_dav_module_ provides partial WebDAV_ implementation and only supports GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE methods.

For full WebDAV_ support in nginx_ you need to enable the standard ngx_http_dav_module_ as well as this module for the missing methods.

Build

Building nginx_ with the module:

.. code-block:: bash

# static module
$ ./configure --with-http_dav_module --add-module=/path/to/nginx-dav-ext-module

# dynamic module
$ ./configure --with-http_dav_module --add-dynamic-module=/path/to/nginx-dav-ext-module

Trying to compile nginx_ with this module but without ngx_http_dav_module_ will result in compilation error.

Requirements

  • nginx_ version >= 1.13.4
  • libxml2 + libxslt

The libxslt library is technically redundant and is only required since this combination is supported by nginx_ for the xslt module. Using builtin nginx mechanisms for linking against third-party libraries brings certain compatibility benefits. However this redundancy can be easily eliminated in the config file.

Testing

The module tests require standard nginx-tests_ and Perl HTTP::DAV library.

.. code-block:: bash

$ export PERL5LIB=/path/to/nginx-tests/lib
$ export TEST_NGINX_BINARY=/path/to/nginx
$ prove t

Locking

  • Only the exclusive write locks are supported, which is the only type of locks described in the WebDAV_ specification.

  • All currently held locks are kept in a list. Checking if an object is constrained by a lock requires O(n) operations. A huge number of simultaneously held locks may degrade performance. Thus it is not recommended to have a large lock timeout which would increase the number of locks.

Directives

dav_ext_methods

========== ==== Syntax: dav_ext_methods [PROPFIND] [OPTIONS] [LOCK] [UNLOCK] Context: http, server, location ========== ====

Enables support for the specified WebDAV methods in the current scope.

dav_ext_lock_zone

========== ==== Syntax: dav_ext_lock_zone zone=NAME:SIZE [timeout=TIMEOUT] Context: http ========== ====

Defines a shared zone for WebDAV locks with specified NAME and SIZE. Also, defines a lock expiration TIMEOUT. Default lock timeout value is 1 minute.

dav_ext_lock

========== ==== Syntax: dav_ext_lock zone=NAME Context: http, server, location ========== ====

Enables WebDAV locking in the specified scope. Locks are stored in the shared zone specified by NAME. This zone must be defined with the dav_ext_lock_zone directive.

Note that even though this directive enables locking capabilities in the current scope, HTTP methods LOCK and UNLOCK should also be explicitly specified in the dav_ext_methods.

Example 1

Simple lockless example::

location / {
    root /data/www;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
}

Example 2

WebDAV with locking::

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}

Example 3

WebDAV with locking which works with MacOS client::

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            # enable creating directories without trailing slash
            set $x $uri$request_method;
            if ($x ~ [^/]MKCOL$) {
                rewrite ^(.*)$ $1/;
            }

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}

.. _ngx_http_dav_module: http://nginx.org/en/docs/http/ngx_http_dav_module.html .. _nginx-tests: http://hg.nginx.org/nginx-tests .. _nginx: http://nginx.org .. _WebDAV: https://tools.ietf.org/html/rfc4918 .. _RFC4918 If Header: https://tools.ietf.org/html/rfc4918#section-10.4