From bb8caf7dd16aa36f48894a2fe41f7dc82808ef6a Mon Sep 17 00:00:00 2001 From: Nicolas Wavrant <nicolas.wavrant@tiolive.com> Date: Wed, 5 Feb 2014 11:48:03 +0100 Subject: [PATCH] slaprunner: remove useless file forgotten here while developping the frontend feature --- software/slaprunner/ngx_http_dav_ext_module.c | 803 ------------------ 1 file changed, 803 deletions(-) delete mode 100644 software/slaprunner/ngx_http_dav_ext_module.c diff --git a/software/slaprunner/ngx_http_dav_ext_module.c b/software/slaprunner/ngx_http_dav_ext_module.c deleted file mode 100644 index fbce3093f..000000000 --- a/software/slaprunner/ngx_http_dav_ext_module.c +++ /dev/null @@ -1,803 +0,0 @@ -/****************************************************************************** - Copyright (c) 2012, Roman Arutyunyan (arut@qip.ru) - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - OF SUCH DAMAGE. - *******************************************************************************/ - -/* - - NGINX missing WebDAV commands support - - *PROPFIND & OPTIONS* - - */ - -#include <ngx_config.h> -#include <ngx_core.h> -#include <ngx_http.h> - -#include <sys/types.h> -#include <dirent.h> -#include <time.h> - -#include <expat.h> - -#define NGX_HTTP_DAV_EXT_OFF 2 - -typedef struct { - - ngx_uint_t methods; - -} ngx_http_dav_ext_loc_conf_t; - -static ngx_int_t ngx_http_dav_ext_init(ngx_conf_t *cf); -static void * ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf); -static char * ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); - -static ngx_conf_bitmask_t ngx_http_dav_ext_methods_mask[] = { - - { ngx_string("off"), NGX_HTTP_DAV_EXT_OFF }, - { ngx_string("propfind"), NGX_HTTP_PROPFIND }, - { ngx_string("options"), NGX_HTTP_OPTIONS }, - { ngx_null_string, 0 } - -}; - -static ngx_command_t ngx_http_dav_ext_commands[] = { - - { ngx_string("dav_ext_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_ext_loc_conf_t, methods), - &ngx_http_dav_ext_methods_mask }, - - ngx_null_command -}; - -static ngx_http_module_t ngx_http_dav_ext_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_dav_ext_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_dav_ext_create_loc_conf, /* create location configuration */ - ngx_http_dav_ext_merge_loc_conf, /* merge location configuration */ -}; - - -ngx_module_t ngx_http_dav_ext_module = { - NGX_MODULE_V1, - &ngx_http_dav_ext_module_ctx, /* module context */ - ngx_http_dav_ext_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - -#define NGX_HTTP_DAV_EXT_NODE_propfind 0x001 -#define NGX_HTTP_DAV_EXT_NODE_prop 0x002 -#define NGX_HTTP_DAV_EXT_NODE_propname 0x004 -#define NGX_HTTP_DAV_EXT_NODE_allprop 0x008 - -#define NGX_HTTP_DAV_EXT_PROP_creationdate 0x001 -#define NGX_HTTP_DAV_EXT_PROP_displayname 0x002 -#define NGX_HTTP_DAV_EXT_PROP_getcontentlanguage 0x004 -#define NGX_HTTP_DAV_EXT_PROP_getcontentlength 0x008 -#define NGX_HTTP_DAV_EXT_PROP_getcontenttype 0x010 -#define NGX_HTTP_DAV_EXT_PROP_getetag 0x020 -#define NGX_HTTP_DAV_EXT_PROP_getlastmodified 0x040 -#define NGX_HTTP_DAV_EXT_PROP_lockdiscovery 0x080 -#define NGX_HTTP_DAV_EXT_PROP_resourcetype 0x100 -#define NGX_HTTP_DAV_EXT_PROP_source 0x200 -#define NGX_HTTP_DAV_EXT_PROP_supportedlock 0x400 - -#define NGX_HTTP_DAV_EXT_PROPFIND_SELECTED 1 -#define NGX_HTTP_DAV_EXT_PROPFIND_NAMES 2 -#define NGX_HTTP_DAV_EXT_PROPFIND_ALL 3 - -typedef struct { - - ngx_uint_t nodes; - - ngx_uint_t props; - - ngx_uint_t propfind; - -} ngx_http_dav_ext_ctx_t; - -static int ngx_http_dav_ext_xmlcmp(const char *xname, const char *sname) { - - const char *c; - - c = strrchr(xname, ':'); - - return strcmp(c ? c + 1 : xname, sname); -} - -static void ngx_http_dav_ext_start_xml_elt(void *user_data, - const XML_Char *name, const XML_Char **atts) -{ - ngx_http_dav_ext_ctx_t *ctx = user_data; - -#define NGX_HTTP_DAV_EXT_SET_NODE(nm) \ - if (!ngx_http_dav_ext_xmlcmp(name, #nm)) \ - ctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_##nm - - NGX_HTTP_DAV_EXT_SET_NODE(propfind); - NGX_HTTP_DAV_EXT_SET_NODE(prop); - NGX_HTTP_DAV_EXT_SET_NODE(propname); - NGX_HTTP_DAV_EXT_SET_NODE(allprop); - -} - -static void ngx_http_dav_ext_end_xml_elt(void *user_data, const XML_Char *name) -{ - ngx_http_dav_ext_ctx_t *ctx = user_data; - - if (ctx->nodes & NGX_HTTP_DAV_EXT_NODE_propfind) { - - if (ctx->nodes & NGX_HTTP_DAV_EXT_NODE_prop) { - - ctx->propfind = NGX_HTTP_DAV_EXT_PROPFIND_SELECTED; - -#define NGX_HTTP_DAV_EXT_SET_PROP(nm) \ - if (!ngx_http_dav_ext_xmlcmp(name, #nm)) \ - ctx->props |= NGX_HTTP_DAV_EXT_PROP_##nm - - NGX_HTTP_DAV_EXT_SET_PROP(creationdate); - NGX_HTTP_DAV_EXT_SET_PROP(displayname); - NGX_HTTP_DAV_EXT_SET_PROP(getcontentlanguage); - NGX_HTTP_DAV_EXT_SET_PROP(getcontentlength); - NGX_HTTP_DAV_EXT_SET_PROP(getcontenttype); - NGX_HTTP_DAV_EXT_SET_PROP(getetag); - NGX_HTTP_DAV_EXT_SET_PROP(getlastmodified); - NGX_HTTP_DAV_EXT_SET_PROP(lockdiscovery); - NGX_HTTP_DAV_EXT_SET_PROP(resourcetype); - NGX_HTTP_DAV_EXT_SET_PROP(source); - NGX_HTTP_DAV_EXT_SET_PROP(supportedlock); - - } - - if (ctx->nodes & NGX_HTTP_DAV_EXT_NODE_propname) { - - ctx->propfind = NGX_HTTP_DAV_EXT_PROPFIND_NAMES; - - } - - if (ctx->nodes & NGX_HTTP_DAV_EXT_NODE_allprop) { - - ctx->propfind = NGX_HTTP_DAV_EXT_PROPFIND_ALL; - - } - - } - - ngx_http_dav_ext_start_xml_elt(user_data, name, NULL); -} - -#define NGX_HTTP_DAV_EXT_COPY 0x01 -#define NGX_HTTP_DAV_EXT_ESCAPE 0x02 - -static void -ngx_http_dav_ext_output(ngx_http_request_t *r, ngx_chain_t **ll, - ngx_int_t flags, u_char *data, ngx_uint_t len) -{ - ngx_chain_t *cl; - ngx_buf_t *b; - - if (!len) { - return; - } - - if (flags & NGX_HTTP_DAV_EXT_ESCAPE) { - - b = ngx_create_temp_buf(r->pool, len + ngx_escape_html(NULL, data, len)); - b->last = (u_char*)ngx_escape_html(b->pos, data, len); - - } else if (flags & NGX_HTTP_DAV_EXT_COPY) { - - b = ngx_create_temp_buf(r->pool, len); - b->last = ngx_cpymem(b->pos, data, len); - - } else { - - b = ngx_calloc_buf(r->pool); - b->memory = 1; - b->pos = data; - b->start = data; - b->last = b->pos + len; - b->end = b->last; - } - - cl = ngx_alloc_chain_link(r->pool); - cl->buf = b; - cl->next = NULL; - - if (*ll != NULL) { - cl->next = (*ll)->next; - (*ll)->next = cl; - *ll = cl; - } else { - *ll = cl; - cl->next = cl; - } -} - -static void -ngx_http_dav_ext_flush(ngx_http_request_t *r, ngx_chain_t **ll) -{ - ngx_chain_t *cl; - - cl = (*ll)->next; - (*ll)->next = NULL; - ngx_http_output_filter(r, cl); - *ll = NULL; -} - -/* output shortcuts - - NB: these shortcuts assume 2 variables exist in current context: - r - request ptr - ll - chain ptr ptr - - output chains are buffered in circular list & flushed on demand -*/ - -/* output buffer copy */ -#define NGX_HTTP_DAV_EXT_OUTCB(data, len) \ - ngx_http_dav_ext_output(r, ll, NGX_HTTP_DAV_EXT_COPY, (data), (len)) - -/* output string (no copy) */ -#define NGX_HTTP_DAV_EXT_OUTS(s) \ - ngx_http_dav_ext_output(r, ll, 0, (s)->data, (s)->len) - -/* output escaped string */ -#define NGX_HTTP_DAV_EXT_OUTES(s) \ - ngx_http_dav_ext_output(r, ll, NGX_HTTP_DAV_EXT_ESCAPE, (s)->data, (s)->len) - -/* output literal */ -#define NGX_HTTP_DAV_EXT_OUTL(s) \ - ngx_http_dav_ext_output(r, ll, 0, (u_char*)(s), sizeof(s) - 1) - -static ngx_int_t -ngx_http_dav_ext_send_propfind_atts(ngx_http_request_t *r, - char *path, ngx_str_t *uri, ngx_chain_t **ll, ngx_uint_t props) -{ - struct stat st; - struct tm stm; - u_char buf[256]; - ngx_str_t name; - - if (stat(path, &st)) { - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - "dav_ext stat failed on '%s'", path); - - return NGX_HTTP_NOT_FOUND; - } - - if (props & NGX_HTTP_DAV_EXT_PROP_creationdate) { - - /* output file ctime (attr change time) as creation time */ - if (gmtime_r(&st.st_ctime, &stm) == NULL) - return NGX_ERROR; - - /* ISO 8601 time format - 2012-02-20T16:15:00Z */ - NGX_HTTP_DAV_EXT_OUTCB(buf, strftime((char*)buf, sizeof(buf), - "<D:creationdate>" - "%Y-%m-%dT%TZ" - "</D:creationdate>\n", - - &stm)); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_displayname) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:displayname>" - ); - - if (uri->len) { - - for(name.data = uri->data + uri->len; - name.data >= uri->data + 1 && name.data[-1] != '/'; - --name.data); - - name.len = uri->data + uri->len - name.data; - - NGX_HTTP_DAV_EXT_OUTES(&name); - } - - NGX_HTTP_DAV_EXT_OUTL( - "</D:displayname>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_getcontentlanguage) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:getcontentlanguage/>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_getcontentlength) { - NGX_HTTP_DAV_EXT_OUTCB(buf, ngx_snprintf(buf, sizeof(buf), - "<D:getcontentlength>" - "%O" - "</D:getcontentlength>\n", - - st.st_size) - buf); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_getcontenttype) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:getcontenttype/>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_getetag) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:getetag/>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_getlastmodified) { - - if (gmtime_r(&st.st_mtime, &stm) == NULL) - return NGX_ERROR; - - /* RFC 2822 time format */ - NGX_HTTP_DAV_EXT_OUTCB(buf, strftime((char*)buf, sizeof(buf), - "<D:getlastmodified>" - "%a, %d %b %Y %T GMT" - "</D:getlastmodified>\n", - - &stm)); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_lockdiscovery) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:lockdiscovery/>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_resourcetype) { - if (S_ISDIR(st.st_mode)) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:resourcetype>" - "<D:collection/>" - "</D:resourcetype>\n" - ); - } else { - NGX_HTTP_DAV_EXT_OUTL( - "<D:resourcetype/>\n" - ); - } - } - - if (props & NGX_HTTP_DAV_EXT_PROP_source) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:source/>\n" - ); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_supportedlock) { - NGX_HTTP_DAV_EXT_OUTL( - "<D:supportedlock/>\n" - ); - } - - return NGX_OK; -} - -static ngx_int_t -ngx_http_dav_ext_send_propfind_item(ngx_http_request_t *r, - char *path, ngx_str_t *uri) -{ - ngx_http_dav_ext_ctx_t *ctx; - ngx_chain_t *l = NULL, **ll = &l; - u_char vbuf[8]; - ngx_str_t status_line = ngx_string("200 OK"); - - ctx = ngx_http_get_module_ctx(r, ngx_http_dav_ext_module); - - NGX_HTTP_DAV_EXT_OUTL( - "<D:response>\n" - "<D:href>" - ); - - NGX_HTTP_DAV_EXT_OUTES(uri); - - NGX_HTTP_DAV_EXT_OUTL( - "</D:href>\n" - "<D:propstat>\n" - "<D:prop>\n" - ); - - if (ctx->propfind == NGX_HTTP_DAV_EXT_PROPFIND_NAMES) { - - NGX_HTTP_DAV_EXT_OUTL( - "<D:creationdate/>\n" - "<D:displayname/>\n" - "<D:getcontentlanguage/>\n" - "<D:getcontentlength/>\n" - "<D:getcontenttype/>\n" - "<D:getetag/>\n" - "<D:getlastmodified/>\n" - "<D:lockdiscovery/>\n" - "<D:resourcetype/>\n" - "<D:source/>\n" - "<D:supportedlock/>\n" - ); - - } else { - - switch (ngx_http_dav_ext_send_propfind_atts(r, path, uri, ll, - ctx->propfind == NGX_HTTP_DAV_EXT_PROPFIND_SELECTED ? - ctx->props : (ngx_uint_t)-1)) - { - case NGX_HTTP_NOT_FOUND: - ngx_str_set(&status_line, "404 Not Found"); - break; - - case NGX_OK: - case NGX_HTTP_OK: - break; - - default: - ngx_str_set(&status_line, "500 Internal Server Error"); - } - } - - NGX_HTTP_DAV_EXT_OUTL( - "</D:prop>\n" - "<D:status>HTTP/" - ); - - NGX_HTTP_DAV_EXT_OUTCB(vbuf, ngx_snprintf(vbuf, sizeof(vbuf), "%d.%d ", - r->http_major, r->http_minor) - vbuf); - - NGX_HTTP_DAV_EXT_OUTS(&status_line); - - NGX_HTTP_DAV_EXT_OUTL( - "</D:status>\n" - "</D:propstat>\n" - "</D:response>\n" - - ); - - ngx_http_dav_ext_flush(r, ll); - - return NGX_OK; -} - -/* path returned by this function is terminated - with a hidden (out-of-len) null */ -static void ngx_http_dav_ext_make_child(ngx_pool_t *pool, ngx_str_t *parent, - u_char *child, size_t chlen, ngx_str_t *path) -{ - u_char *s; - - path->data = ngx_palloc(pool, parent->len + 2 + chlen); - s = path->data; - s = ngx_cpymem(s, parent->data, parent->len); - if (parent->len > 0 && s[-1] != '/') - *s++ = '/'; - s = ngx_cpymem(s, child, chlen); - path->len = s - path->data; - *s = 0; -} - -#define DAV_EXT_INFINITY (-1) - -static ngx_int_t -ngx_http_dav_ext_send_propfind(ngx_http_request_t *r) -{ - size_t root; - ngx_str_t path, spath, suri; - ngx_chain_t *l = NULL, **ll = &l; - DIR *dir; - int depth; - struct dirent *de; - size_t len; - ngx_http_variable_value_t vv; - ngx_str_t depth_name = ngx_string("depth"); - u_char *p; - - if (ngx_http_variable_unknown_header(&vv, &depth_name, - &r->headers_in.headers.part, 0) == NGX_OK - && vv.valid) - { - if (vv.len == sizeof("infinity") -1 - && !ngx_strncasecmp(vv.data, (u_char*)"infinity", vv.len)) - { - depth = DAV_EXT_INFINITY; - } else { - depth = ngx_atoi(vv.data, vv.len); - } - - } else { - depth = DAV_EXT_INFINITY; - } - - p = ngx_http_map_uri_to_path(r, &path, &root, 0); - - if (p == NULL || !path.len) { - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "dav_ext error mapping uri to path"); - - return NGX_ERROR; - } - - path.len = p - path.data; - *p = 0; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http propfind path: \"%V\"", &path); - - NGX_HTTP_DAV_EXT_OUTL( - "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" - "<D:multistatus xmlns:D=\"DAV:\">\n" - ); - - ngx_http_dav_ext_flush(r, ll); - - ngx_http_dav_ext_send_propfind_item(r, (char*)path.data, &r->uri); - - if (depth) { - - /* treat infinite depth as 1 for performance reasons */ - - if ((dir = opendir((char*)path.data))) { - - while((de = readdir(dir))) { - - if (!strcmp(de->d_name, ".") - || !strcmp(de->d_name, "..")) - { - continue; - } - - len = strlen(de->d_name); - - ngx_http_dav_ext_make_child(r->pool, &path, - (u_char*)de->d_name, len, &spath); - - ngx_http_dav_ext_make_child(r->pool, &r->uri, - (u_char*)de->d_name, len, &suri); - - ngx_http_dav_ext_send_propfind_item(r, (char*)spath.data, &suri); - - } - - closedir(dir); - } - - } - - NGX_HTTP_DAV_EXT_OUTL( - "</D:multistatus>\n" - ); - - if (*ll && (*ll)->buf) { - (*ll)->buf->last_buf = 1; - } - - ngx_http_dav_ext_flush(r, ll); - - return NGX_OK; -} - -static void -ngx_http_dav_ext_propfind_handler(ngx_http_request_t *r) -{ - ngx_chain_t *c; - ngx_buf_t *b; - XML_Parser parser; - ngx_uint_t status; - ngx_http_dav_ext_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_dav_ext_module); - - if (ctx == NULL) { - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_dav_ext_ctx_t)); - ngx_http_set_ctx(r, ctx, ngx_http_dav_ext_module); - } - - c = r->request_body->bufs; - - status = NGX_OK; - - parser = XML_ParserCreate(NULL); - - XML_SetUserData(parser, ctx); - - XML_SetElementHandler(parser, - ngx_http_dav_ext_start_xml_elt, - ngx_http_dav_ext_end_xml_elt); - - for(; c != NULL && c->buf != NULL && !c->buf->last_buf; c = c->next) { - - b = c ->buf; - - if (!XML_Parse(parser, (const char*)b->pos, b->last - b->pos, b->last_buf)) { - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "dav_ext propfind XML error"); - - status = NGX_ERROR; - - break; - } - - } - - XML_ParserFree(parser); - - if (status == NGX_OK) { - - r->headers_out.status = 207; - - ngx_str_set(&r->headers_out.status_line, "207 Multi-Status"); - - ngx_http_send_header(r); - - ngx_http_finalize_request(r, ngx_http_dav_ext_send_propfind(r)); - - } else { - - r->headers_out.status = NGX_HTTP_INTERNAL_SERVER_ERROR; - - r->header_only = 1; - - r->headers_out.content_length_n = 0; - - ngx_http_finalize_request(r, ngx_http_send_header(r)); - - } - -} - -static ngx_int_t -ngx_http_dav_ext_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_http_dav_ext_loc_conf_t *delcf; - - delcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - - if (!(r->method & delcf->methods)) { - return NGX_DECLINED; - } - - switch (r->method) { - - case NGX_HTTP_PROPFIND: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "dav_ext propfind"); - - rc = ngx_http_read_client_request_body(r, - ngx_http_dav_ext_propfind_handler); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; - - case NGX_HTTP_OPTIONS: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "dav_ext options"); - - h = ngx_list_push(&r->headers_out.headers); - - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_str_set(&h->key, "DAV"); - ngx_str_set(&h->value, "1"); - h->hash = 1; - - h = ngx_list_push(&r->headers_out.headers); - - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* FIXME: it looks so ugly because I cannot access nginx dav module */ - ngx_str_set(&h->key, "Allow"); - ngx_str_set(&h->value, "GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE,PROPFIND,OPTIONS"); - h->hash = 1; - - r->headers_out.status = NGX_HTTP_OK; - r->header_only = 1; - r->headers_out.content_length_n = 0; - - ngx_http_send_header(r); - - return NGX_OK; - - } - - return NGX_DECLINED; -} - -static void * -ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_dav_ext_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_ext_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - return conf; -} - -static char * -ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_dav_ext_loc_conf_t *prev = parent; - ngx_http_dav_ext_loc_conf_t *conf = child; - - ngx_conf_merge_bitmask_value(conf->methods, prev->methods, - (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_EXT_OFF)); - - return NGX_CONF_OK; -} - -static ngx_int_t -ngx_http_dav_ext_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_dav_ext_handler; - - return NGX_OK; -} - -- 2.30.9