annotate src/http/modules/ngx_http_dav_module.c @ 6986:0cdee26605f3

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