annotate src/http/modules/ngx_http_dav_module.c @ 5204:a64c8a5da336

PCRE: retain input pattern for all regular expressions. Previously, input pattern was kept only for regular expressions with named captures, which resulted in error log entries without input pattern for PCRE errors that occured while processing regular expressions without them. Signed-off-by: Piotr Sikora <piotr@cloudflare.com>
author Piotr Sikora <piotr@cloudflare.com>
date Thu, 02 May 2013 03:26:36 -0700
parents e7467ae41626
children 11599a3d0c7c
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_COPY_BLOCK 65536
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 #define NGX_HTTP_DAV_OFF 2
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
16
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
17
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
18 #define NGX_HTTP_DAV_NO_DEPTH -3
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
19 #define NGX_HTTP_DAV_INVALID_DEPTH -2
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
20 #define NGX_HTTP_DAV_INFINITY_DEPTH -1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
21
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 typedef struct {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 ngx_uint_t methods;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
25 ngx_uint_t access;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
26 ngx_uint_t min_delete_depth;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
27 ngx_flag_t create_full_put_path;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 } ngx_http_dav_loc_conf_t;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
31 typedef struct {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
32 ngx_str_t path;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
33 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
34 } ngx_http_dav_copy_ctx_t;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
35
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
36
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 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
38
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
39 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
40
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
41 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
42 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
43 ngx_str_t *path, ngx_uint_t dir);
957
7ea5db4c06cb recursive DELETE
Igor Sysoev <igor@sysoev.ru>
parents: 921
diff changeset
44 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
45 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
46 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
47
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
48 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
49 ngx_http_dav_loc_conf_t *dlcf);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
50
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
51 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
52 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
53 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
54 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
55 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
56 ngx_str_t *path);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
57
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
58 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
59 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
60 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
61 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
62 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
63 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
64 void *parent, void *child);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
65 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
66
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 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
69 { ngx_string("off"), NGX_HTTP_DAV_OFF },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 { ngx_string("put"), NGX_HTTP_PUT },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 { ngx_string("delete"), NGX_HTTP_DELETE },
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
72 { ngx_string("mkcol"), NGX_HTTP_MKCOL },
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
73 { ngx_string("copy"), NGX_HTTP_COPY },
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
74 { ngx_string("move"), NGX_HTTP_MOVE },
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 { ngx_null_string, 0 }
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
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 static ngx_command_t ngx_http_dav_commands[] = {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 { ngx_string("dav_methods"),
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 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
83 ngx_conf_set_bitmask_slot,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 NGX_HTTP_LOC_CONF_OFFSET,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 offsetof(ngx_http_dav_loc_conf_t, methods),
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 &ngx_http_dav_methods_mask },
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
88 { ngx_string("create_full_put_path"),
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
89 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
90 ngx_conf_set_flag_slot,
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
91 NGX_HTTP_LOC_CONF_OFFSET,
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
92 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
93 NULL },
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
94
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
95 { ngx_string("min_delete_depth"),
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
96 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
97 ngx_conf_set_num_slot,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
98 NGX_HTTP_LOC_CONF_OFFSET,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
99 offsetof(ngx_http_dav_loc_conf_t, min_delete_depth),
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
100 NULL },
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
101
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
102 { ngx_string("dav_access"),
675
e924670896ab nginx-0.3.59-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 669
diff changeset
103 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
104 ngx_conf_set_access_slot,
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
105 NGX_HTTP_LOC_CONF_OFFSET,
1296
9fcfca54b208 dav_access uses ngx_conf_set_access_slot()
Igor Sysoev <igor@sysoev.ru>
parents: 1289
diff changeset
106 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
107 NULL },
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
108
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 ngx_null_command
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 };
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
113 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
114 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
115 ngx_http_dav_init, /* postconfiguration */
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 NULL, /* create main configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NULL, /* init main configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL, /* create server configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* merge server configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 ngx_http_dav_create_loc_conf, /* create location configuration */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 ngx_http_dav_merge_loc_conf /* merge location configuration */
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
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 ngx_module_t ngx_http_dav_module = {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 NGX_MODULE_V1,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 &ngx_http_dav_module_ctx, /* module context */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 ngx_http_dav_commands, /* module directives */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NGX_HTTP_MODULE, /* module type */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
134 NULL, /* init module */
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 NULL, /* init process */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* init thread */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* exit thread */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NULL, /* exit process */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 NULL, /* exit master */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NGX_MODULE_V1_PADDING
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
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 static ngx_int_t
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 ngx_http_dav_handler(ngx_http_request_t *r)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 ngx_int_t rc;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 ngx_http_dav_loc_conf_t *dlcf;
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 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
151
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 if (!(r->method & dlcf->methods)) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 return NGX_DECLINED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 }
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 switch (r->method) {
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 case NGX_HTTP_PUT:
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 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
161 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
162 "cannot PUT to a collection");
1813
d3f80e0be8fa change status code and add log message
Igor Sysoev <igor@sysoev.ru>
parents: 1804
diff changeset
163 return NGX_HTTP_CONFLICT;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 r->request_body_in_file_only = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 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
168 r->request_body_in_clean_file = 1;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 r->request_body_file_group_access = 1;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
170 r->request_body_file_log_level = 0;
633
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 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
173
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 return rc;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 }
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 return NGX_DONE;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 case NGX_HTTP_DELETE:
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
182 return ngx_http_dav_delete_handler(r);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
183
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
184 case NGX_HTTP_MKCOL:
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 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
187
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
188 case NGX_HTTP_COPY:
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 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
191
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
192 case NGX_HTTP_MOVE:
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
193
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
194 return ngx_http_dav_copy_move_handler(r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 }
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 return NGX_DECLINED;
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
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 static void
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 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
203 {
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
204 size_t root;
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
205 time_t date;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
206 ngx_str_t *temp, path;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
207 ngx_uint_t status;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
208 ngx_file_info_t fi;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
209 ngx_ext_rename_file_t ext;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
210 ngx_http_dav_loc_conf_t *dlcf;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211
4918
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
212 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
213 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
214 return;
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
215 }
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
216
773
c3ebeee31026 remove r->root_length
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
217 ngx_http_map_uri_to_path(r, &path, &root, 0);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
3032
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
219 path.len--;
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
220
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 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
222 "http put filename: \"%s\"", path.data);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 temp = &r->request_body->temp_file->file.name;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
2782
4bd7825fab80 uniform ngx_file_info() interface with ngx_fd_info()
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
226 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
227 status = NGX_HTTP_CREATED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 } else {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 status = NGX_HTTP_NO_CONTENT;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
231
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
232 if (ngx_is_dir(&fi)) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
233 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
234 "\"%s\" could not be created", path.data);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
236 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
237 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
238 ngx_delete_file_n " \"%s\" failed",
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
239 temp->data);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
240 }
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 ngx_http_finalize_request(r, NGX_HTTP_CONFLICT);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
243 return;
661
9079ee4735ae nginx-0.3.52-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
244 }
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
245 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
246
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
247 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
248
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
249 ext.access = dlcf->access;
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
250 ext.path_access = dlcf->access;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
251 ext.time = -1;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
252 ext.create_path = dlcf->create_full_put_path;
1909
cbd321d1e1b3 C++ compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1864
diff changeset
253 ext.delete_file = 1;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
254 ext.log = r->connection->log;
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
255
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
256 if (r->headers_in.date) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
257 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
258 r->headers_in.date->value.len);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
259
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
260 if (date != NGX_ERROR) {
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
261 ext.time = date;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
262 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
263 }
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
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
266 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
267 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
268 return;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
269 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
270
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271 if (status == NGX_HTTP_CREATED) {
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
272 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
273 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
274 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 }
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
276
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
277 r->headers_out.content_length_n = 0;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 }
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 r->headers_out.status = status;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 r->header_only = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 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
284 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 }
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
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
288 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
289 ngx_http_dav_delete_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
290 {
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
291 size_t root;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
292 ngx_err_t err;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
293 ngx_int_t rc, depth;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
294 ngx_uint_t i, d, dir;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
295 ngx_str_t path;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
296 ngx_file_info_t fi;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
297 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
298
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
299 if (r->headers_in.content_length_n > 0) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
300 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
301 "DELETE with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
302 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
303 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
304
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
305 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
306
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
307 if (dlcf->min_delete_depth) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
308 d = 0;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
309
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
310 for (i = 0; i < r->uri.len; /* void */) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
311 if (r->uri.data[i++] == '/') {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
312 if (++d >= dlcf->min_delete_depth && i < r->uri.len) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
313 goto ok;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
314 }
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
319 "insufficient URI depth:%i to DELETE", d);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
320 return NGX_HTTP_CONFLICT;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
321 }
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 ok:
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
324
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
325 ngx_http_map_uri_to_path(r, &path, &root, 0);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
326
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
327 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
328 "http delete filename: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
329
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
330 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
331 err = ngx_errno;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
332
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
333 rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
334
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
335 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
336 rc, ngx_link_info_n, path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
337 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
338
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
339 if (ngx_is_dir(&fi)) {
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 if (r->uri.data[r->uri.len - 1] != '/') {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
342 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
343 "DELETE \"%s\" failed", path.data);
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
344 return NGX_HTTP_CONFLICT;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
345 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
346
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
347 depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);
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 if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
350 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
351 "\"Depth\" header must be infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
352 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
353 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
354
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
355 path.len -= 2; /* omit "/\0" */
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 dir = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
358
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
359 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
360
1823
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
361 /*
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
362 * 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
363 * because ngx_link_info("/file/") returned NGX_ENOTDIR above
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
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
366 depth = ngx_http_dav_depth(r, 0);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
367
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
368 if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
369 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
370 "\"Depth\" header must be 0 or infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
371 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
372 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
373
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
374 dir = 0;
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 rc = ngx_http_dav_delete_path(r, &path, dir);
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 if (rc == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
380 return NGX_HTTP_NO_CONTENT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
383 return rc;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
387 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
388 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
389 {
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
390 char *failed;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
391 ngx_tree_ctx_t tree;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
392
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
393 if (dir) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
394
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
395 tree.init_handler = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
396 tree.file_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
397 tree.pre_tree_handler = ngx_http_dav_noop;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
398 tree.post_tree_handler = ngx_http_dav_delete_dir;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
399 tree.spec_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
400 tree.data = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
401 tree.alloc = 0;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
402 tree.log = r->connection->log;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
403
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
404 /* TODO: 207 */
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
405
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
406 if (ngx_walk_tree(&tree, path) != NGX_OK) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
407 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
410 if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
411 return NGX_OK;
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
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
414 failed = ngx_delete_dir_n;
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 } else {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
417
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
418 if (ngx_delete_file(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
419 return NGX_OK;
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
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
422 failed = ngx_delete_file_n;
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 return ngx_http_dav_error(r->connection->log, ngx_errno,
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
426 NGX_HTTP_NOT_FOUND, failed, path->data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
427 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
428
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
429
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
430 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
431 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
432 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
433 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
434 "http delete dir: \"%s\"", path->data);
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 if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
437
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
438 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
439
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
440 (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
441 path->data);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
444 return NGX_OK;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
448 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
449 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
450 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
451 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
452 "http delete file: \"%s\"", path->data);
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 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
455
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
456 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
457
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
458 (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
459 path->data);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
462 return NGX_OK;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
466 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
467 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
468 {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
469 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
470 }
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
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
473 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
474 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
475 {
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
476 u_char *p;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
477 size_t root;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
478 ngx_str_t path;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
479
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
480 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
481 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
482 "MKCOL with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
483 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
484 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
485
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
486 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
487 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
488 "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
489 return NGX_HTTP_CONFLICT;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
490 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
491
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
492 p = ngx_http_map_uri_to_path(r, &path, &root, 0);
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
493
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
494 *(p - 1) = '\0';
3182
6ddaac3e0bf7 omit '\0' from "Location" header on MKCOL request
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
495 r->uri.len--;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
496
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
497 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
498 "http mkcol path: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
499
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
500 if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
501 != NGX_FILE_ERROR)
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 if (ngx_http_dav_location(r, path.data) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
504 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
507 return NGX_HTTP_CREATED;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
510 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
511 NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);
1116
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
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 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
516 ngx_http_dav_copy_move_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
517 {
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
518 u_char *p, *host, *last, ch;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
519 size_t len, root;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
520 ngx_err_t err;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
521 ngx_int_t rc, depth;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
522 ngx_uint_t overwrite, slash, dir, flags;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
523 ngx_str_t path, uri, duri, args;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
524 ngx_tree_ctx_t tree;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
525 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
526 ngx_file_info_t fi;
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
527 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
528 ngx_ext_rename_file_t ext;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
529 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
530 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
531
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
532 if (r->headers_in.content_length_n > 0) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
533 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
534 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
535
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
536 dest = r->headers_in.destination;
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 (dest == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
539 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
540 "client sent no \"Destination\" header");
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
541 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
542 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
543
3612
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
544 p = dest->value.data;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
545 /* there is always '\0' even after empty header value */
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
546 if (p[0] == '/') {
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
547 last = p + dest->value.len;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
548 goto destination_done;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
549 }
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
550
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
551 len = r->headers_in.server.len;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
552
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
553 if (len == 0) {
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
554 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
555 "client sent no \"Host\" header");
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
556 return NGX_HTTP_BAD_REQUEST;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
557 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
558
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
559 #if (NGX_HTTP_SSL)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
560
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
561 if (r->connection->ssl) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
562 if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
563 != 0)
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 goto invalid_destination;
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
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
568 host = dest->value.data + sizeof("https://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
569
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
570 } else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
571 #endif
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 if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
574 != 0)
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 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
577 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
578
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
579 host = dest->value.data + sizeof("http://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
580 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
581
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
582 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
583 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
584 "\"Destination\" URI \"%V\" is handled by "
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
585 "different repository than the source URI",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
586 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
587 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
588 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
589
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
590 last = dest->value.data + dest->value.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
591
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
592 for (p = host + len; p < last; p++) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
593 if (*p == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
594 goto destination_done;
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 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
597
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
598 invalid_destination:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
599
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
600 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
601 "client sent invalid \"Destination\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
602 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
603 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
604
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
605 destination_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
606
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
607 duri.len = last - p;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
608 duri.data = p;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
609 flags = 0;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
610
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
611 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
612 goto invalid_destination;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
613 }
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
614
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
615 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
616 || (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
617 {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
618 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
619 "both URI \"%V\" and \"Destination\" URI \"%V\" "
1834
aa343f669f11 style fix: remove trailing space
Igor Sysoev <igor@sysoev.ru>
parents: 1831
diff changeset
620 "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
621 &r->uri, &dest->value);
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
622 return NGX_HTTP_CONFLICT;
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
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
625 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
626
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
627 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
628
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
629 if (r->method == NGX_HTTP_COPY) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
630 if (depth != 0) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
631 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
632 "\"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
633 return NGX_HTTP_BAD_REQUEST;
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
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
636 } else {
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 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 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
641 }
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
642
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
643 over = r->headers_in.overwrite;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
644
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
645 if (over) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
646 if (over->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
647 ch = over->value.data[0];
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
648
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
649 if (ch == 'T' || ch == 't') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
650 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
651 goto overwrite_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
652 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
653
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
654 if (ch == 'F' || ch == 'f') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
655 overwrite = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
656 goto overwrite_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
657 }
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
661 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
662 "client sent invalid \"Overwrite\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
663 &over->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
664 return NGX_HTTP_BAD_REQUEST;
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 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
668
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
669 overwrite_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
670
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
671 ngx_http_map_uri_to_path(r, &path, &root, 0);
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
674 "http copy from: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
675
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
676 uri = r->uri;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
677 r->uri = duri;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
678
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
679 ngx_http_map_uri_to_path(r, &copy.path, &root, 0);
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 r->uri = uri;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
682
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
683 copy.path.len--; /* omit "\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
684
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
685 if (copy.path.data[copy.path.len - 1] == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
686 slash = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
687 copy.path.len--;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
688 copy.path.data[copy.path.len] = '\0';
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
689
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
690 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
691 slash = 0;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
694 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
695 "http copy to: \"%s\"", copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
696
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
697 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
698 err = ngx_errno;
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 if (err != NGX_ENOENT) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
701 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
702 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
703 copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
704 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
705
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
706 /* destination does not exist */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
707
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
708 overwrite = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
709 dir = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
710
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
711 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
712
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
713 /* destination exists */
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 if (ngx_is_dir(&fi) && !slash) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
716 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
717 "\"%V\" could not be %Ved to collection \"%V\"",
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
718 &r->uri, &r->method_name, &dest->value);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
719 return NGX_HTTP_CONFLICT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
720 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
721
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
722 if (!overwrite) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
723 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
724 "\"%s\" could not be created", copy.path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
725 return NGX_HTTP_PRECONDITION_FAILED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
726 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
727
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
728 dir = ngx_is_dir(&fi);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
729 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
730
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
731 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
732 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
733 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
734 path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
735 }
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 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
738
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
739 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
740 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
741 "\"%V\" is collection", &r->uri);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
742 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
743 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
744
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
745 if (overwrite) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
746 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
747 "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
748
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
749 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
750
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
751 if (rc != NGX_OK) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
752 return rc;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
753 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
754 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
755 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
756
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
757 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
758
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
759 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
760
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
761 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
762 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
763 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
764 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
765 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
766
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
767 if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
768 == NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
769 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
770 return ngx_http_dav_error(r->connection->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
771 NGX_HTTP_NOT_FOUND,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
772 ngx_create_dir_n, copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
773 }
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 copy.len = path.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
776
1769
a35bc4007ec3 tree.init_handler is never called
Igor Sysoev <igor@sysoev.ru>
parents: 1749
diff changeset
777 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
778 tree.file_handler = ngx_http_dav_copy_tree_file;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
779 tree.pre_tree_handler = ngx_http_dav_copy_dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
780 tree.post_tree_handler = ngx_http_dav_copy_dir_time;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
781 tree.spec_handler = ngx_http_dav_noop;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
782 tree.data = &copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
783 tree.alloc = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
784 tree.log = r->connection->log;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
785
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
786 if (ngx_walk_tree(&tree, &path) == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
787
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
788 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
789 rc = ngx_http_dav_delete_path(r, &path, 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
790
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
791 if (rc != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
792 return rc;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
793 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
794 }
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 return NGX_HTTP_CREATED;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
799 } else {
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 (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
802
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
803 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
804
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
805 ext.access = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
806 ext.path_access = dlcf->access;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
807 ext.time = -1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
808 ext.create_path = 1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
809 ext.delete_file = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
810 ext.log = r->connection->log;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
811
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
812 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
813 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
814 }
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
815
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
816 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
817 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
818
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
819 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
820
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
821 cf.size = ngx_file_size(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
822 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
823 cf.access = dlcf->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
824 cf.time = ngx_file_mtime(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
825 cf.log = r->connection->log;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
826
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
827 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
828 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
829 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
830 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
831
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
832 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
833 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
834
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
835
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
836 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
837 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
838 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
839 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
840 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
841 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
842
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
843 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
844 "http copy dir: \"%s\"", path->data);
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 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
847
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
848 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
849
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
850 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
851 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
852 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
853 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
854
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
855 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
856 (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
857
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
858 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
859 "http copy dir to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
860
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
861 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
862 (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
863 dir);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
866 ngx_free(dir);
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 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
869 }
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
872 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
873 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
874 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
875 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
876 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
877 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
878
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
879 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
880 "http copy dir time: \"%s\"", path->data);
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 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
883
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
884 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
885
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
886 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
887 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
888 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
889 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
890
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
891 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
892 (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
893
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
894 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
895 "http copy dir time to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
896
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
897 #if (NGX_WIN32)
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
898 {
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
899 ngx_fd_t fd;
1116
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 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
902
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
903 if (fd == NGX_INVALID_FILE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
904 (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
905 goto failed;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
906 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
907
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
908 if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
909 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
910 ngx_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
911 }
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 (ngx_close_file(fd) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
914 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
915 ngx_close_file_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
916 }
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
917 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
918
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
919 failed:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
920
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
921 #else
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_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {
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_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
926 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
927
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
928 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
929
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
930 ngx_free(dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
931
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
932 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
933 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
934
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
935
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
936 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
937 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
938 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
939 u_char *p, *file;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
940 size_t len;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
941 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
942 ngx_http_dav_copy_ctx_t *copy;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
945 "http copy file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
946
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
947 copy = ctx->data;
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 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
950
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
951 file = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
952 if (file == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
953 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
954 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
955
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
956 p = ngx_cpymem(file, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
957 (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
958
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
959 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
960 "http copy file to: \"%s\"", file);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
961
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
962 cf.size = ctx->size;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
963 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
964 cf.access = ctx->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
965 cf.time = ctx->mtime;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
966 cf.log = ctx->log;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
967
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
968 (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
969
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
970 ngx_free(file);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
971
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
972 return NGX_OK;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
973 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
974
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
975
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
976 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
977 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
978 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
979 ngx_table_elt_t *depth;
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
980
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
981 depth = r->headers_in.depth;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
982
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
983 if (depth == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
984 return dflt;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
985 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
986
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
987 if (depth->value.len == 1) {
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 if (depth->value.data[0] == '0') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
990 return 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
991 }
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->value.data[0] == '1') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
994 return 1;
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 } else {
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.len == sizeof("infinity") - 1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1000 && ngx_strcmp(depth->value.data, "infinity") == 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 return NGX_HTTP_DAV_INFINITY_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1003 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1004 }
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1007 "client sent invalid \"Depth\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1008 &depth->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1009
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1010 return NGX_HTTP_DAV_INVALID_DEPTH;
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
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 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1015 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
1016 char *failed, u_char *path)
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1017 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1018 ngx_int_t rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1019 ngx_uint_t level;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1020
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1021 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
1022 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1023 rc = not_found;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1024
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1025 } else if (err == NGX_EACCES || err == NGX_EPERM) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1026 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1027 rc = NGX_HTTP_FORBIDDEN;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1028
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1029 } else if (err == NGX_EEXIST) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1030 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1031 rc = NGX_HTTP_NOT_ALLOWED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1032
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1033 } else if (err == NGX_ENOSPC) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1034 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1035 rc = NGX_HTTP_INSUFFICIENT_STORAGE;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1036
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1037 } else {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1038 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1039 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1040 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1041
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1042 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
1043
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1044 return rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1045 }
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
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1048 static ngx_int_t
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1049 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
1050 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051 u_char *location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1052 ngx_http_core_loc_conf_t *clcf;
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 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
1055 if (r->headers_out.location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056 return NGX_ERROR;
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
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1059 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
1060
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1061 if (!clcf->alias && clcf->root_lengths == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1062 location = path + clcf->root.len;
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 } else {
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2007
diff changeset
1065 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
1066 if (location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1067 return NGX_ERROR;
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
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1070 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
1071 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1072
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 * 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
1075 * r->headers_out.location->key fields
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1076 */
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1077
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1078 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
1079 r->headers_out.location->value.data = location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1080
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1081 return NGX_OK;
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
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1085 static void *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1086 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
1087 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1088 ngx_http_dav_loc_conf_t *conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1089
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1090 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
1091 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
1092 return NULL;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1093 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1094
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1095 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1096 * set by ngx_pcalloc():
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 * conf->methods = 0;
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
1864
524831ec3e69 fix building by msvc introduced in r1817
Igor Sysoev <igor@sysoev.ru>
parents: 1834
diff changeset
1101 conf->min_delete_depth = NGX_CONF_UNSET_UINT;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1102 conf->access = NGX_CONF_UNSET_UINT;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1103 conf->create_full_put_path = NGX_CONF_UNSET;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1104
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 return conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 }
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
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 static char *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110 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
1111 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112 ngx_http_dav_loc_conf_t *prev = parent;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113 ngx_http_dav_loc_conf_t *conf = child;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 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
1116 (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1117
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1118 ngx_conf_merge_uint_value(conf->min_delete_depth,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1119 prev->min_delete_depth, 0);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1121 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
1122
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1123 ngx_conf_merge_value(conf->create_full_put_path,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1124 prev->create_full_put_path, 0);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1125
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126 return NGX_CONF_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1127 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1128
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1131 ngx_http_dav_init(ngx_conf_t *cf)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 ngx_http_handler_pt *h;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134 ngx_http_core_main_conf_t *cmcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1136 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
1137
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138 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
1139 if (h == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141 }
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 *h = ngx_http_dav_handler;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1144
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1145 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1146 }