annotate src/http/modules/ngx_http_dav_module.c @ 5862:ecbb99aa0e12

Limit req: use complex value in limit_req_zone. One intentional side effect of this change is that key is allowed only in the first position. Previously, it was possible to specify the key variable at any position, but that was never documented, and is contrary with nginx configuration practice for positional parameters.
author Valentin Bartenev <vbart@nginx.com>
date Wed, 24 Sep 2014 21:55:19 +0400
parents 1f70fe0d9576
children 8b6fa4842133
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4133
diff changeset
4 * Copyright (C) Nginx, Inc.
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
13 #define NGX_HTTP_DAV_OFF 2
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
14
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
15
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
16 #define NGX_HTTP_DAV_NO_DEPTH -3
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
17 #define NGX_HTTP_DAV_INVALID_DEPTH -2
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
18 #define NGX_HTTP_DAV_INFINITY_DEPTH -1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
19
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 typedef struct {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 ngx_uint_t methods;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
23 ngx_uint_t access;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
24 ngx_uint_t min_delete_depth;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
25 ngx_flag_t create_full_put_path;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 } ngx_http_dav_loc_conf_t;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
29 typedef struct {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
30 ngx_str_t path;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
31 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
32 } ngx_http_dav_copy_ctx_t;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
33
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
34
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 static ngx_int_t ngx_http_dav_handler(ngx_http_request_t *r);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
36
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
37 static void ngx_http_dav_put_handler(ngx_http_request_t *r);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
38
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
39 static ngx_int_t ngx_http_dav_delete_handler(ngx_http_request_t *r);
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
40 static ngx_int_t ngx_http_dav_delete_path(ngx_http_request_t *r,
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
41 ngx_str_t *path, ngx_uint_t dir);
957
7ea5db4c06cb recursive DELETE
Igor Sysoev <igor@sysoev.ru>
parents: 921
diff changeset
42 static ngx_int_t ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);
7ea5db4c06cb recursive DELETE
Igor Sysoev <igor@sysoev.ru>
parents: 921
diff changeset
43 static ngx_int_t ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
44 static ngx_int_t ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
45
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
46 static ngx_int_t ngx_http_dav_mkcol_handler(ngx_http_request_t *r,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
47 ngx_http_dav_loc_conf_t *dlcf);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
48
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
49 static ngx_int_t ngx_http_dav_copy_move_handler(ngx_http_request_t *r);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
50 static ngx_int_t ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
51 static ngx_int_t ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
52 ngx_str_t *path);
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
53 static ngx_int_t ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx,
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
54 ngx_str_t *path);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
55
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
56 static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
57 static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err,
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
58 ngx_int_t not_found, char *failed, u_char *path);
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
59 static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r, u_char *path);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 void *parent, void *child);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
63 static ngx_int_t ngx_http_dav_init(ngx_conf_t *cf);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 static ngx_conf_bitmask_t ngx_http_dav_methods_mask[] = {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 { ngx_string("off"), NGX_HTTP_DAV_OFF },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 { ngx_string("put"), NGX_HTTP_PUT },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 { ngx_string("delete"), NGX_HTTP_DELETE },
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
70 { ngx_string("mkcol"), NGX_HTTP_MKCOL },
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
71 { ngx_string("copy"), NGX_HTTP_COPY },
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
72 { ngx_string("move"), NGX_HTTP_MOVE },
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 { ngx_null_string, 0 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 };
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 static ngx_command_t ngx_http_dav_commands[] = {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 { ngx_string("dav_methods"),
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 ngx_conf_set_bitmask_slot,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NGX_HTTP_LOC_CONF_OFFSET,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 offsetof(ngx_http_dav_loc_conf_t, methods),
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 &ngx_http_dav_methods_mask },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
86 { ngx_string("create_full_put_path"),
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
87 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
88 ngx_conf_set_flag_slot,
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
89 NGX_HTTP_LOC_CONF_OFFSET,
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
90 offsetof(ngx_http_dav_loc_conf_t, create_full_put_path),
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
91 NULL },
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
92
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
93 { ngx_string("min_delete_depth"),
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
94 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
95 ngx_conf_set_num_slot,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
96 NGX_HTTP_LOC_CONF_OFFSET,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
97 offsetof(ngx_http_dav_loc_conf_t, min_delete_depth),
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
98 NULL },
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
99
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
100 { ngx_string("dav_access"),
675
e924670896ab nginx-0.3.59-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 669
diff changeset
101 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
1296
9fcfca54b208 dav_access uses ngx_conf_set_access_slot()
Igor Sysoev <igor@sysoev.ru>
parents: 1289
diff changeset
102 ngx_conf_set_access_slot,
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
103 NGX_HTTP_LOC_CONF_OFFSET,
1296
9fcfca54b208 dav_access uses ngx_conf_set_access_slot()
Igor Sysoev <igor@sysoev.ru>
parents: 1289
diff changeset
104 offsetof(ngx_http_dav_loc_conf_t, access),
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
105 NULL },
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
106
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 ngx_null_command
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 };
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
111 static ngx_http_module_t ngx_http_dav_module_ctx = {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
113 ngx_http_dav_init, /* postconfiguration */
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 NULL, /* create main configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 NULL, /* init main configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NULL, /* create server configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 NULL, /* merge server configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 ngx_http_dav_create_loc_conf, /* create location configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_http_dav_merge_loc_conf /* merge location configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 };
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_module_t ngx_http_dav_module = {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 NGX_MODULE_V1,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 &ngx_http_dav_module_ctx, /* module context */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 ngx_http_dav_commands, /* module directives */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 NGX_HTTP_MODULE, /* module type */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
132 NULL, /* init module */
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 NULL, /* init process */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 NULL, /* init thread */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 NULL, /* exit thread */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* exit process */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* exit master */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NGX_MODULE_V1_PADDING
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 };
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 static ngx_int_t
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_http_dav_handler(ngx_http_request_t *r)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 ngx_int_t rc;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 ngx_http_dav_loc_conf_t *dlcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 if (!(r->method & dlcf->methods)) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 return NGX_DECLINED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 switch (r->method) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 case NGX_HTTP_PUT:
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 if (r->uri.data[r->uri.len - 1] == '/') {
1813
d3f80e0be8fa change status code and add log message
Igor Sysoev <igor@sysoev.ru>
parents: 1804
diff changeset
159 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
4133
59b99f217c6d Replaced "can not" with "cannot" and "could not" in a bunch of places.
Ruslan Ermilov <ru@nginx.com>
parents: 3612
diff changeset
160 "cannot PUT to a collection");
1813
d3f80e0be8fa change status code and add log message
Igor Sysoev <igor@sysoev.ru>
parents: 1804
diff changeset
161 return NGX_HTTP_CONFLICT;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 r->request_body_in_file_only = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 r->request_body_in_persistent_file = 1;
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1060
diff changeset
166 r->request_body_in_clean_file = 1;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 r->request_body_file_group_access = 1;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
168 r->request_body_file_log_level = 0;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 rc = ngx_http_read_client_request_body(r, ngx_http_dav_put_handler);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 return rc;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 return NGX_DONE;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 case NGX_HTTP_DELETE:
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
180 return ngx_http_dav_delete_handler(r);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
181
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
182 case NGX_HTTP_MKCOL:
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
183
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
184 return ngx_http_dav_mkcol_handler(r, dlcf);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
185
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
186 case NGX_HTTP_COPY:
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
187
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
188 return ngx_http_dav_copy_move_handler(r);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
189
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
190 case NGX_HTTP_MOVE:
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
191
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
192 return ngx_http_dav_copy_move_handler(r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 return NGX_DECLINED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 static void
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 ngx_http_dav_put_handler(ngx_http_request_t *r)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 {
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
202 size_t root;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
203 time_t date;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
204 ngx_str_t *temp, path;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
205 ngx_uint_t status;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
206 ngx_file_info_t fi;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
207 ngx_ext_rename_file_t ext;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
208 ngx_http_dav_loc_conf_t *dlcf;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209
4918
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
210 if (r->request_body == NULL || r->request_body->temp_file == NULL) {
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
211 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
212 return;
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
213 }
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
214
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
215 if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
216 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
217 return;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
218 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
3032
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
220 path.len--;
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
221
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 "http put filename: \"%s\"", path.data);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 temp = &r->request_body->temp_file->file.name;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226
2782
4bd7825fab80 uniform ngx_file_info() interface with ngx_fd_info()
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
227 if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 status = NGX_HTTP_CREATED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 } else {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 status = NGX_HTTP_NO_CONTENT;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
232
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
233 if (ngx_is_dir(&fi)) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
234 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
235 "\"%s\" could not be created", path.data);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
237 if (ngx_delete_file(temp->data) == NGX_FILE_ERROR) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
238 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
239 ngx_delete_file_n " \"%s\" failed",
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
240 temp->data);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
241 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
242
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
243 ngx_http_finalize_request(r, NGX_HTTP_CONFLICT);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
244 return;
661
9079ee4735ae nginx-0.3.52-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
245 }
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
246 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
247
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
248 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
249
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
250 ext.access = dlcf->access;
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
251 ext.path_access = dlcf->access;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
252 ext.time = -1;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
253 ext.create_path = dlcf->create_full_put_path;
1909
cbd321d1e1b3 C++ compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1864
diff changeset
254 ext.delete_file = 1;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
255 ext.log = r->connection->log;
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
256
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
257 if (r->headers_in.date) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
258 date = ngx_http_parse_time(r->headers_in.date->value.data,
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
259 r->headers_in.date->value.len);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
260
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
261 if (date != NGX_ERROR) {
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
262 ext.time = date;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
263 ext.fd = r->request_body->temp_file->file.fd;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
264 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
265 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
266
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
267 if (ngx_ext_rename_file(temp, &path, &ext) != NGX_OK) {
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
268 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
269 return;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
270 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
271
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 if (status == NGX_HTTP_CREATED) {
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
273 if (ngx_http_dav_location(r, path.data) != NGX_OK) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 }
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
277
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
278 r->headers_out.content_length_n = 0;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 r->headers_out.status = status;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 r->header_only = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 ngx_http_finalize_request(r, ngx_http_send_header(r));
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
289 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
290 ngx_http_dav_delete_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
291 {
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
292 size_t root;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
293 ngx_err_t err;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
294 ngx_int_t rc, depth;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
295 ngx_uint_t i, d, dir;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
296 ngx_str_t path;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
297 ngx_file_info_t fi;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
298 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
299
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
300 if (r->headers_in.content_length_n > 0) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
301 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
302 "DELETE with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
303 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
304 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
305
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
306 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
307
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
308 if (dlcf->min_delete_depth) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
309 d = 0;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
310
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
311 for (i = 0; i < r->uri.len; /* void */) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
312 if (r->uri.data[i++] == '/') {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
313 if (++d >= dlcf->min_delete_depth && i < r->uri.len) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
314 goto ok;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
315 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
316 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
317 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
318
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
319 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
320 "insufficient URI depth:%i to DELETE", d);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
321 return NGX_HTTP_CONFLICT;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
322 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
323
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
324 ok:
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
325
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
326 if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
327 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
328 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
329
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
330 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
331 "http delete filename: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
332
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
333 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
334 err = ngx_errno;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
335
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
336 rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
337
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
338 return ngx_http_dav_error(r->connection->log, err,
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
339 rc, ngx_link_info_n, path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
340 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
341
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
342 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
343
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
344 if (r->uri.data[r->uri.len - 1] != '/') {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
345 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
346 "DELETE \"%s\" failed", path.data);
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
347 return NGX_HTTP_CONFLICT;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
348 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
349
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
350 depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
351
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
352 if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
353 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
354 "\"Depth\" header must be infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
355 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
356 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
357
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
358 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
359
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
360 dir = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
361
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
362 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
363
1823
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
364 /*
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
365 * we do not need to test (r->uri.data[r->uri.len - 1] == '/')
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
366 * because ngx_link_info("/file/") returned NGX_ENOTDIR above
1823
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
367 */
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
368
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
369 depth = ngx_http_dav_depth(r, 0);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
370
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
371 if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
372 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
373 "\"Depth\" header must be 0 or infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
374 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
375 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
376
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
377 dir = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
378 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
379
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
380 rc = ngx_http_dav_delete_path(r, &path, dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
381
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
382 if (rc == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
383 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
384 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
385
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
386 return rc;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
387 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
388
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
389
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
390 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
391 ngx_http_dav_delete_path(ngx_http_request_t *r, ngx_str_t *path, ngx_uint_t dir)
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
392 {
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
393 char *failed;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
394 ngx_tree_ctx_t tree;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
395
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
396 if (dir) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
397
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
398 tree.init_handler = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
399 tree.file_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
400 tree.pre_tree_handler = ngx_http_dav_noop;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
401 tree.post_tree_handler = ngx_http_dav_delete_dir;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
402 tree.spec_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
403 tree.data = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
404 tree.alloc = 0;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
405 tree.log = r->connection->log;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
406
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
407 /* TODO: 207 */
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
408
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
409 if (ngx_walk_tree(&tree, path) != NGX_OK) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
410 return NGX_HTTP_INTERNAL_SERVER_ERROR;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
411 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
412
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
413 if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
414 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
415 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
416
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
417 failed = ngx_delete_dir_n;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
418
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
419 } else {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
420
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
421 if (ngx_delete_file(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
422 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
423 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
424
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
425 failed = ngx_delete_file_n;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
426 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
427
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
428 return ngx_http_dav_error(r->connection->log, ngx_errno,
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
429 NGX_HTTP_NOT_FOUND, failed, path->data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
430 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
431
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
432
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
433 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
434 ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
435 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
436 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
437 "http delete dir: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
438
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
439 if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
440
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
441 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
442
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
443 (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_dir_n,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
444 path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
445 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
446
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
447 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
448 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
449
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
450
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
451 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
452 ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
453 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
454 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
455 "http delete file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
456
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
457 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
458
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
459 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
460
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
461 (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_file_n,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
462 path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
463 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
464
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
465 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
466 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
467
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
468
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
469 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
470 ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
471 {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
472 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
473 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
474
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
475
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
476 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
477 ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
478 {
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
479 u_char *p;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
480 size_t root;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
481 ngx_str_t path;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
482
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
483 if (r->headers_in.content_length_n > 0) {
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
484 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
485 "MKCOL with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
486 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
487 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
488
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
489 if (r->uri.data[r->uri.len - 1] != '/') {
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
490 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
491 "MKCOL can create a collection only");
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
492 return NGX_HTTP_CONFLICT;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
493 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
494
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
495 p = ngx_http_map_uri_to_path(r, &path, &root, 0);
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
496 if (p == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
497 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
498 }
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
499
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
500 *(p - 1) = '\0';
3182
6ddaac3e0bf7 omit '\0' from "Location" header on MKCOL request
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
501 r->uri.len--;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
502
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
503 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
504 "http mkcol path: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
505
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
506 if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
507 != NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
508 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
509 if (ngx_http_dav_location(r, path.data) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
510 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
511 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
512
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
513 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
514 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
515
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
516 return ngx_http_dav_error(r->connection->log, ngx_errno,
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
517 NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
518 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
519
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
520
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
521 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
522 ngx_http_dav_copy_move_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
523 {
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
524 u_char *p, *host, *last, ch;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
525 size_t len, root;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
526 ngx_err_t err;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
527 ngx_int_t rc, depth;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
528 ngx_uint_t overwrite, slash, dir, flags;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
529 ngx_str_t path, uri, duri, args;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
530 ngx_tree_ctx_t tree;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
531 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
532 ngx_file_info_t fi;
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
533 ngx_table_elt_t *dest, *over;
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
534 ngx_ext_rename_file_t ext;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
535 ngx_http_dav_copy_ctx_t copy;
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
536 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
537
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
538 if (r->headers_in.content_length_n > 0) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
539 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
540 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
541
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
542 dest = r->headers_in.destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
543
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
544 if (dest == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
545 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
546 "client sent no \"Destination\" header");
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
547 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
548 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
549
3612
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
550 p = dest->value.data;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
551 /* there is always '\0' even after empty header value */
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
552 if (p[0] == '/') {
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
553 last = p + dest->value.len;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
554 goto destination_done;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
555 }
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
556
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
557 len = r->headers_in.server.len;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
558
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
559 if (len == 0) {
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
560 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
561 "client sent no \"Host\" header");
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
562 return NGX_HTTP_BAD_REQUEST;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
563 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
564
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
565 #if (NGX_HTTP_SSL)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
566
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
567 if (r->connection->ssl) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
568 if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
569 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
570 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
571 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
572 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
573
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
574 host = dest->value.data + sizeof("https://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
575
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
576 } else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
577 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
578 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
579 if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
580 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
581 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
582 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
583 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
584
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
585 host = dest->value.data + sizeof("http://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
586 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
587
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
588 if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
589 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
590 "\"Destination\" URI \"%V\" is handled by "
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
591 "different repository than the source URI",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
592 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
593 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
594 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
595
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
596 last = dest->value.data + dest->value.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
597
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
598 for (p = host + len; p < last; p++) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
599 if (*p == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
600 goto destination_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
601 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
602 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
603
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
604 invalid_destination:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
605
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
606 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
607 "client sent invalid \"Destination\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
608 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
609 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
610
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
611 destination_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
612
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
613 duri.len = last - p;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
614 duri.data = p;
5492
5c52ff68f380 Dav: emit a warning about unsafe URI.
Ruslan Ermilov <ru@nginx.com>
parents: 5409
diff changeset
615 flags = NGX_HTTP_LOG_UNSAFE;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
616
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
617 if (ngx_http_parse_unsafe_uri(r, &duri, &args, &flags) != NGX_OK) {
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
618 goto invalid_destination;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
619 }
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
620
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
621 if ((r->uri.data[r->uri.len - 1] == '/' && *(last - 1) != '/')
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
622 || (r->uri.data[r->uri.len - 1] != '/' && *(last - 1) == '/'))
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
623 {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
624 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
625 "both URI \"%V\" and \"Destination\" URI \"%V\" "
1834
aa343f669f11 style fix: remove trailing space
Igor Sysoev <igor@sysoev.ru>
parents: 1831
diff changeset
626 "should be either collections or non-collections",
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
627 &r->uri, &dest->value);
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
628 return NGX_HTTP_CONFLICT;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
629 }
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
630
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
631 depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
632
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
633 if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
634
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
635 if (r->method == NGX_HTTP_COPY) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
636 if (depth != 0) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
637 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
638 "\"Depth\" header must be 0 or infinity");
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
639 return NGX_HTTP_BAD_REQUEST;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
640 }
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
641
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
642 } else {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
643 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
644 "\"Depth\" header must be infinity");
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
645 return NGX_HTTP_BAD_REQUEST;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
646 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
647 }
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
648
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
649 over = r->headers_in.overwrite;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
650
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
651 if (over) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
652 if (over->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
653 ch = over->value.data[0];
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
654
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
655 if (ch == 'T' || ch == 't') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
656 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
657 goto overwrite_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
658 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
659
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
660 if (ch == 'F' || ch == 'f') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
661 overwrite = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
662 goto overwrite_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
663 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
664
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
665 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
666
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
667 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
668 "client sent invalid \"Overwrite\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
669 &over->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
670 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
671 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
672
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
673 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
674
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
675 overwrite_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
676
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
677 if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
678 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
679 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
680
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
681 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
682 "http copy from: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
683
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
684 uri = r->uri;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
685 r->uri = duri;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
686
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
687 if (ngx_http_map_uri_to_path(r, &copy.path, &root, 0) == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
688 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
689 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
690
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
691 r->uri = uri;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
692
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
693 copy.path.len--; /* omit "\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
694
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
695 if (copy.path.data[copy.path.len - 1] == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
696 slash = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
697 copy.path.len--;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
698 copy.path.data[copy.path.len] = '\0';
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
699
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
700 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
701 slash = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
702 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
703
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
704 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
705 "http copy to: \"%s\"", copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
706
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
707 if (ngx_link_info(copy.path.data, &fi) == NGX_FILE_ERROR) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
708 err = ngx_errno;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
709
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
710 if (err != NGX_ENOENT) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
711 return ngx_http_dav_error(r->connection->log, err,
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
712 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
713 copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
714 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
715
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
716 /* destination does not exist */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
717
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
718 overwrite = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
719 dir = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
720
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
721 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
722
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
723 /* destination exists */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
724
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
725 if (ngx_is_dir(&fi) && !slash) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
726 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
727 "\"%V\" could not be %Ved to collection \"%V\"",
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
728 &r->uri, &r->method_name, &dest->value);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
729 return NGX_HTTP_CONFLICT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
730 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
731
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
732 if (!overwrite) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
733 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
734 "\"%s\" could not be created", copy.path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
735 return NGX_HTTP_PRECONDITION_FAILED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
736 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
737
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
738 dir = ngx_is_dir(&fi);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
739 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
740
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
741 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
742 return ngx_http_dav_error(r->connection->log, ngx_errno,
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
743 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
744 path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
745 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
746
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
747 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
748
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
749 if (r->uri.data[r->uri.len - 1] != '/') {
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
750 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
751 "\"%V\" is collection", &r->uri);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
752 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
753 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
754
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
755 if (overwrite) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
756 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
757 "http delete: \"%s\"", copy.path.data);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
758
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
759 rc = ngx_http_dav_delete_path(r, &copy.path, dir);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
760
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
761 if (rc != NGX_OK) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
762 return rc;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
763 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
764 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
765 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
766
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
767 if (ngx_is_dir(&fi)) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
768
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
769 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
770
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
771 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
772 if (ngx_rename_file(path.data, copy.path.data) != NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
773 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
774 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
775 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
776
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
777 if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
778 == NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
779 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
780 return ngx_http_dav_error(r->connection->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
781 NGX_HTTP_NOT_FOUND,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
782 ngx_create_dir_n, copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
783 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
784
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
785 copy.len = path.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
786
1769
a35bc4007ec3 tree.init_handler is never called
Igor Sysoev <igor@sysoev.ru>
parents: 1749
diff changeset
787 tree.init_handler = NULL;
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
788 tree.file_handler = ngx_http_dav_copy_tree_file;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
789 tree.pre_tree_handler = ngx_http_dav_copy_dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
790 tree.post_tree_handler = ngx_http_dav_copy_dir_time;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
791 tree.spec_handler = ngx_http_dav_noop;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
792 tree.data = &copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
793 tree.alloc = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
794 tree.log = r->connection->log;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
795
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
796 if (ngx_walk_tree(&tree, &path) == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
797
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
798 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
799 rc = ngx_http_dav_delete_path(r, &path, 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
800
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
801 if (rc != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
802 return rc;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
803 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
804 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
805
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
806 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
807 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
808
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
809 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
810
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
811 if (r->method == NGX_HTTP_MOVE) {
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
812
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
813 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
814
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
815 ext.access = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
816 ext.path_access = dlcf->access;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
817 ext.time = -1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
818 ext.create_path = 1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
819 ext.delete_file = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
820 ext.log = r->connection->log;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
821
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
822 if (ngx_ext_rename_file(&path, &copy.path, &ext) == NGX_OK) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
823 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
824 }
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
825
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
826 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
827 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
828
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
829 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
830
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
831 cf.size = ngx_file_size(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
832 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
833 cf.access = dlcf->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
834 cf.time = ngx_file_mtime(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
835 cf.log = r->connection->log;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
836
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
837 if (ngx_copy_file(path.data, copy.path.data, &cf) == NGX_OK) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
838 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
839 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
840 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
841
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
842 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
843 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
844
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
845
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
846 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
847 ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
848 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
849 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
850 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
851 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
852
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
853 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
854 "http copy dir: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
855
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
856 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
857
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
858 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
859
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
860 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
861 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
862 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
863 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
864
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
865 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
866 (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
867
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
868 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
869 "http copy dir to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
870
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
871 if (ngx_create_dir(dir, ngx_dir_access(ctx->access)) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
872 (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_create_dir_n,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
873 dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
874 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
875
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
876 ngx_free(dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
877
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
878 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
879 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
880
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
881
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
882 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
883 ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, ngx_str_t *path)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
884 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
885 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
886 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
887 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
888
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
889 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
890 "http copy dir time: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
891
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
892 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
893
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
894 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
895
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
896 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
897 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
898 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
899 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
900
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
901 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
902 (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
903
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
904 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
905 "http copy dir time to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
906
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
907 #if (NGX_WIN32)
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
908 {
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
909 ngx_fd_t fd;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
910
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
911 fd = ngx_open_file(dir, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
912
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
913 if (fd == NGX_INVALID_FILE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
914 (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
915 goto failed;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
916 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
917
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
918 if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
919 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
920 ngx_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
921 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
922
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
923 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
924 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
925 ngx_close_file_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
926 }
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
927 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
928
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
929 failed:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
930
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
931 #else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
932
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
933 if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
934 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
935 ngx_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
936 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
937
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
938 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
939
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
940 ngx_free(dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
941
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
942 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
943 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
944
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
945
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
946 static ngx_int_t
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
947 ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
948 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
949 u_char *p, *file;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
950 size_t len;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
951 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
952 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
953
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
954 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
955 "http copy file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
956
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
957 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
958
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
959 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
960
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
961 file = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
962 if (file == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
963 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
964 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
965
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
966 p = ngx_cpymem(file, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
967 (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
968
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
969 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
970 "http copy file to: \"%s\"", file);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
971
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
972 cf.size = ctx->size;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
973 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
974 cf.access = ctx->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
975 cf.time = ctx->mtime;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
976 cf.log = ctx->log;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
977
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
978 (void) ngx_copy_file(path->data, file, &cf);
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
979
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
980 ngx_free(file);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
981
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
982 return NGX_OK;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
983 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
984
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
985
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
986 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
987 ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
988 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
989 ngx_table_elt_t *depth;
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
990
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
991 depth = r->headers_in.depth;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
992
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
993 if (depth == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
994 return dflt;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
995 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
996
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
997 if (depth->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
998
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
999 if (depth->value.data[0] == '0') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1000 return 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1001 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1002
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1003 if (depth->value.data[0] == '1') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1004 return 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1005 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1006
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1007 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1008
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1009 if (depth->value.len == sizeof("infinity") - 1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1010 && ngx_strcmp(depth->value.data, "infinity") == 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1011 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1012 return NGX_HTTP_DAV_INFINITY_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1013 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1014 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1015
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1016 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1017 "client sent invalid \"Depth\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1018 &depth->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1019
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1020 return NGX_HTTP_DAV_INVALID_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1021 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1022
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1023
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1024 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1025 ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found,
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1026 char *failed, u_char *path)
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1027 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1028 ngx_int_t rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1029 ngx_uint_t level;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1030
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1031 if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1032 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1033 rc = not_found;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1034
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1035 } else if (err == NGX_EACCES || err == NGX_EPERM) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1036 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1037 rc = NGX_HTTP_FORBIDDEN;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1038
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1039 } else if (err == NGX_EEXIST) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1040 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1041 rc = NGX_HTTP_NOT_ALLOWED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1042
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1043 } else if (err == NGX_ENOSPC) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1044 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1045 rc = NGX_HTTP_INSUFFICIENT_STORAGE;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1046
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1047 } else {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1048 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1049 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1050 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1052 ngx_log_error(level, log, err, "%s \"%s\" failed", failed, path);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 return rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1057
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1058 static ngx_int_t
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1059 ngx_http_dav_location(ngx_http_request_t *r, u_char *path)
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1060 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1061 u_char *location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1062 ngx_http_core_loc_conf_t *clcf;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1063
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1064 r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1065 if (r->headers_out.location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1066 return NGX_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1067 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1068
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1069 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1070
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1071 if (!clcf->alias && clcf->root_lengths == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1072 location = path + clcf->root.len;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1073
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1074 } else {
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2007
diff changeset
1075 location = ngx_pnalloc(r->pool, r->uri.len);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1076 if (location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1077 return NGX_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1078 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1079
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1080 ngx_memcpy(location, r->uri.data, r->uri.len);
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1081 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1082
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1083 /*
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1084 * we do not need to set the r->headers_out.location->hash and
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1085 * r->headers_out.location->key fields
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1086 */
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1087
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1088 r->headers_out.location->value.len = r->uri.len;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1089 r->headers_out.location->value.data = location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1090
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1091 return NGX_OK;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1092 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1093
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1094
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1095 static void *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1096 ngx_http_dav_create_loc_conf(ngx_conf_t *cf)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1097 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1098 ngx_http_dav_loc_conf_t *conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1099
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1100 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_loc_conf_t));
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1101 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2782
diff changeset
1102 return NULL;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1103 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 * set by ngx_pcalloc():
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107 *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1108 * conf->methods = 0;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110
1864
524831ec3e69 fix building by msvc introduced in r1817
Igor Sysoev <igor@sysoev.ru>
parents: 1834
diff changeset
1111 conf->min_delete_depth = NGX_CONF_UNSET_UINT;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1112 conf->access = NGX_CONF_UNSET_UINT;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1113 conf->create_full_put_path = NGX_CONF_UNSET;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1114
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 return conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1118
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1119 static char *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120 ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122 ngx_http_dav_loc_conf_t *prev = parent;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 ngx_http_dav_loc_conf_t *conf = child;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1124
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1125 ngx_conf_merge_bitmask_value(conf->methods, prev->methods,
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1126 (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1127
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1128 ngx_conf_merge_uint_value(conf->min_delete_depth,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1129 prev->min_delete_depth, 0);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1131 ngx_conf_merge_uint_value(conf->access, prev->access, 0600);
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1132
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1133 ngx_conf_merge_value(conf->create_full_put_path,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1134 prev->create_full_put_path, 0);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1135
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1136 return NGX_CONF_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1141 ngx_http_dav_init(ngx_conf_t *cf)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1142 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1143 ngx_http_handler_pt *h;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1144 ngx_http_core_main_conf_t *cmcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1145
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1146 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1148 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149 if (h == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1152
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 *h = ngx_http_dav_handler;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1156 }