⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_dav_module.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
        tree.access = dlcf->access;        tree.log = r->connection->log;        if (ngx_http_dav_copy_file(&tree, path.data, copy.path.data) == NGX_OK)        {            if (r->method == NGX_HTTP_MOVE) {                rc = ngx_http_dav_delete_path(r, &path, 0);                if (rc != NGX_OK) {                    return rc;                }            }            return NGX_HTTP_NO_CONTENT;        }    }    return NGX_HTTP_INTERNAL_SERVER_ERROR;}static ngx_int_tngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path){    u_char                   *p, *dir;    size_t                    len;    ngx_http_dav_copy_ctx_t  *copy;    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy dir: \"%s\"", path->data);    copy = ctx->data;    len = copy->path.len + path->len;    dir = ngx_alloc(len + 1, ctx->log);    if (dir == NULL) {        return NGX_ABORT;    }    p = ngx_cpymem(dir, copy->path.data, copy->path.len);    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy dir to: \"%s\"", dir);    if (ngx_create_dir(dir, ngx_dir_access(ctx->access)) == NGX_FILE_ERROR) {        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_create_dir_n,                                  dir);    }    ngx_free(dir);    return NGX_OK;}static ngx_int_tngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, ngx_str_t *path){    u_char                   *p, *dir;    size_t                    len;    ngx_http_dav_copy_ctx_t  *copy;    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy dir time: \"%s\"", path->data);    copy = ctx->data;    len = copy->path.len + path->len;    dir = ngx_alloc(len + 1, ctx->log);    if (dir == NULL) {        return NGX_ABORT;    }    p = ngx_cpymem(dir, copy->path.data, copy->path.len);    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy dir time to: \"%s\"", dir);#if (NGX_WIN32)    {    ngx_fd_t  fd;    fd = ngx_open_file(dir, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);    if (fd == NGX_INVALID_FILE) {        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, dir);        goto failed;    }    if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_set_file_time_n " \"%s\" failed", dir);    }    if (ngx_close_file(fd) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_close_file_n " \"%s\" failed", dir);    }    }failed:#else    if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_set_file_time_n " \"%s\" failed", dir);    }#endif    ngx_free(dir);    return NGX_OK;}static ngx_int_tngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, ngx_str_t *path){    u_char                   *p, *file;    size_t                    len;    ngx_http_dav_copy_ctx_t  *copy;    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy file: \"%s\"", path->data);    copy = ctx->data;    len = copy->path.len + path->len;    file = ngx_alloc(len + 1, ctx->log);    if (file == NULL) {        return NGX_ABORT;    }    p = ngx_cpymem(file, copy->path.data, copy->path.len);    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,                   "http copy file to: \"%s\"", file);    (void) ngx_http_dav_copy_file(ctx, path->data, file);    ngx_free(file);    return NGX_OK;}static ngx_int_tngx_http_dav_copy_file(ngx_tree_ctx_t *ctx, u_char *from, u_char *to){    off_t       size;    ssize_t     n;    ngx_fd_t    fd, cfd;    ngx_int_t   rc;    u_char      buf[NGX_HTTP_DAV_COPY_BLOCK];    fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);    if (fd == NGX_INVALID_FILE) {        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n,                                  from);        return NGX_ERROR;    }    cfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_CREATE_OR_OPEN,                        ctx->access);    rc = NGX_ERROR;    if (cfd == NGX_INVALID_FILE) {        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, to);        goto failed;    }    for (size = ctx->size; size > 0; size -= n) {        n = ngx_read_fd(fd, buf, NGX_HTTP_DAV_COPY_BLOCK);        if (n == NGX_FILE_ERROR) {            ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                          ngx_read_fd_n " \"%s\" failed", from);            goto failed;        }        if (ngx_write_fd(cfd, buf, n) == NGX_FILE_ERROR) {            ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                          ngx_write_fd_n " \"%s\" failed", to);            goto failed;        }    }    if (ngx_set_file_time(to, cfd, ctx->mtime) != NGX_OK) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_set_file_time_n " \"%s\" failed", to);        goto failed;    }    if (ngx_close_file(cfd) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_close_file_n " \"%s\" failed", to);        goto failed;    }    rc = NGX_OK;failed:    if (ngx_close_file(fd) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,                      ngx_close_file_n " \"%s\" failed", from);    }    return rc;}static ngx_int_tngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt){    ngx_table_elt_t  *depth;    depth = r->headers_in.depth;    if (depth == NULL) {        return dflt;    }    if (depth->value.len == 1) {        if (depth->value.data[0] == '0') {            return 0;        }        if (depth->value.data[0] == '1') {            return 1;        }    } else {        if (depth->value.len == sizeof("infinity") - 1            && ngx_strcmp(depth->value.data, "infinity") == 0)        {            return NGX_HTTP_DAV_INFINITY_DEPTH;        }    }    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                  "client sent invalid \"Depth\" header: \"%V\"",                  &depth->value);    return NGX_HTTP_DAV_INVALID_DEPTH;}static ngx_int_tngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found,    char *failed, u_char *path){    ngx_int_t   rc;    ngx_uint_t  level;    if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {        level = NGX_LOG_ERR;        rc = not_found;    } else if (err == NGX_EACCES || err == NGX_EPERM) {        level = NGX_LOG_ERR;        rc = NGX_HTTP_FORBIDDEN;    } else if (err == NGX_EEXIST) {        level = NGX_LOG_ERR;        rc = NGX_HTTP_NOT_ALLOWED;    } else if (err == NGX_ENOSPC) {        level = NGX_LOG_CRIT;        rc = NGX_HTTP_INSUFFICIENT_STORAGE;    } else {        level = NGX_LOG_CRIT;        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;    }    ngx_log_error(level, log, err, "%s \"%s\" failed", failed, path);    return rc;}static ngx_int_tngx_http_dav_location(ngx_http_request_t *r, u_char *path){    u_char                    *location;    ngx_http_core_loc_conf_t  *clcf;    r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));    if (r->headers_out.location == NULL) {        return NGX_ERROR;    }    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);    if (!clcf->alias && clcf->root_lengths == NULL) {        location = path + clcf->root.len;    } else {        location = ngx_palloc(r->pool, r->uri.len);        if (location == NULL) {            return NGX_ERROR;        }        ngx_memcpy(location, r->uri.data, r->uri.len);    }    /*     * we do not need to set the r->headers_out.location->hash and     * r->headers_out.location->key fields     */    r->headers_out.location->value.len = r->uri.len;    r->headers_out.location->value.data = location;    return NGX_OK;}static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf){    ngx_http_dav_loc_conf_t  *conf;    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_loc_conf_t));    if (conf == NULL) {        return NGX_CONF_ERROR;    }    /*     * set by ngx_pcalloc():     *     *     conf->methods = 0;     */    conf->min_delete_depth = NGX_CONF_UNSET_UINT;    conf->access = NGX_CONF_UNSET_UINT;    conf->create_full_put_path = NGX_CONF_UNSET;    return conf;}static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){    ngx_http_dav_loc_conf_t  *prev = parent;    ngx_http_dav_loc_conf_t  *conf = child;    ngx_conf_merge_bitmask_value(conf->methods, prev->methods,                         (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));    ngx_conf_merge_uint_value(conf->min_delete_depth,                         prev->min_delete_depth, 0);    ngx_conf_merge_uint_value(conf->access, prev->access, 0600);    ngx_conf_merge_value(conf->create_full_put_path,                         prev->create_full_put_path, 0);    return NGX_CONF_OK;}static ngx_int_tngx_http_dav_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_handler;    return NGX_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -