annotate src/http/modules/ngx_http_dav_module.c @ 7401:a7ff19afbb14

Negative size buffers detection. In the past, there were several security issues which resulted in worker process memory disclosure due to buffers with negative size. It looks reasonable to check for such buffers in various places, much like we already check for zero size buffers. While here, removed "#if 1 / #endif" around zero size buffer checks. It looks highly unlikely that we'll disable these checks anytime soon.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 26 Nov 2018 18:29:56 +0300
parents bb40db0e380d
children c1a7d3672653
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
7198
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
216 if (r->request_body == NULL) {
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
217 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
218 "PUT request body is unavailable");
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
219 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
220 return;
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
221 }
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
222
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
223 if (r->request_body->temp_file == NULL) {
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
224 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
573f20116163 Dav: added error logging.
Roman Arutyunyan <arut@nginx.com>
parents: 6986
diff changeset
225 "PUT request body must be in a file");
4918
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
226 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
227 return;
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
228 }
e7467ae41626 Dav: fixed segfault on PUT if body was already read (ticket #238).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
229
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
230 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
231 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
232 return;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
233 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
3032
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
235 path.len--;
524ba56ba9f7 fix copy destination name length, introduced in r3025
Igor Sysoev <igor@sysoev.ru>
parents: 3024
diff changeset
236
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 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
238 "http put filename: \"%s\"", path.data);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 temp = &r->request_body->temp_file->file.name;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
2782
4bd7825fab80 uniform ngx_file_info() interface with ngx_fd_info()
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
242 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
243 status = NGX_HTTP_CREATED;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 } else {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 status = NGX_HTTP_NO_CONTENT;
663
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 if (ngx_is_dir(&fi)) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
249 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
250 "\"%s\" could not be created", path.data);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
252 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
253 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
254 ngx_delete_file_n " \"%s\" failed",
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
255 temp->data);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
256 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
257
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
258 ngx_http_finalize_request(r, NGX_HTTP_CONFLICT);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 661
diff changeset
259 return;
661
9079ee4735ae nginx-0.3.52-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 639
diff changeset
260 }
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
261 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
262
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
263 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
264
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
265 ext.access = dlcf->access;
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
266 ext.path_access = dlcf->access;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
267 ext.time = -1;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
268 ext.create_path = dlcf->create_full_put_path;
1909
cbd321d1e1b3 C++ compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1864
diff changeset
269 ext.delete_file = 1;
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
270 ext.log = r->connection->log;
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
271
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
272 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
273 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
274 r->headers_in.date->value.len);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
275
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
276 if (date != NGX_ERROR) {
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
277 ext.time = date;
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
278 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
279 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
280 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
281
1828
1f3c2b6607e0 use ngx_ext_rename_file() in PUT
Igor Sysoev <igor@sysoev.ru>
parents: 1825
diff changeset
282 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
283 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
284 return;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
285 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
286
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 if (status == NGX_HTTP_CREATED) {
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
288 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
289 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
290 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 }
639
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
292
715d24327080 nginx-0.3.41-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
293 r->headers_out.content_length_n = 0;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 r->headers_out.status = status;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 r->header_only = 1;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 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
300 return;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
304 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
305 ngx_http_dav_delete_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
306 {
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
307 size_t root;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
308 ngx_err_t err;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
309 ngx_int_t rc, depth;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
310 ngx_uint_t i, d, dir;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
311 ngx_str_t path;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
312 ngx_file_info_t fi;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
313 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
314
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
315 if (r->headers_in.content_length_n > 0) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
316 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
317 "DELETE with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
318 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
319 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
320
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
321 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
322
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
323 if (dlcf->min_delete_depth) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
324 d = 0;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
325
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
326 for (i = 0; i < r->uri.len; /* void */) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
327 if (r->uri.data[i++] == '/') {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
328 if (++d >= dlcf->min_delete_depth && i < r->uri.len) {
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
329 goto ok;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
330 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
331 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
332 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
333
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
334 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
335 "insufficient URI depth:%i to DELETE", d);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
336 return NGX_HTTP_CONFLICT;
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
337 }
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
338
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
339 ok:
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
340
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
341 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
342 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
343 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
344
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
345 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
346 "http delete filename: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
347
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
348 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
349 err = ngx_errno;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
350
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
351 rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
352
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
353 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
354 rc, ngx_link_info_n, path.data);
1116
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
357 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
358
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
359 if (r->uri.data[r->uri.len - 1] != '/') {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
360 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
361 "DELETE \"%s\" failed", path.data);
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
362 return NGX_HTTP_CONFLICT;
1116
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
365 depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
366
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
367 if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
368 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
369 "\"Depth\" header must be infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
370 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
371 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
372
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
373 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
374
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
375 dir = 1;
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 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
378
1823
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
379 /*
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
380 * 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
381 * because ngx_link_info("/file/") returned NGX_ENOTDIR above
1823
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
382 */
5ae4cace0727 add comment
Igor Sysoev <igor@sysoev.ru>
parents: 1822
diff changeset
383
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
384 depth = ngx_http_dav_depth(r, 0);
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 if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) {
1815
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
387 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1e2fb527f9c0 log DELETE errors
Igor Sysoev <igor@sysoev.ru>
parents: 1814
diff changeset
388 "\"Depth\" header must be 0 or infinity");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
389 return NGX_HTTP_BAD_REQUEST;
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 dir = 0;
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 rc = ngx_http_dav_delete_path(r, &path, dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
396
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
397 if (rc == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
398 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
399 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
400
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
401 return rc;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
402 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
403
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
404
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
405 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
406 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
407 {
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
408 char *failed;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
409 ngx_tree_ctx_t tree;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
410
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
411 if (dir) {
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 tree.init_handler = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
414 tree.file_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
415 tree.pre_tree_handler = ngx_http_dav_noop;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
416 tree.post_tree_handler = ngx_http_dav_delete_dir;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
417 tree.spec_handler = ngx_http_dav_delete_file;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
418 tree.data = NULL;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
419 tree.alloc = 0;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
420 tree.log = r->connection->log;
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 /* TODO: 207 */
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
423
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
424 if (ngx_walk_tree(&tree, path) != NGX_OK) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
425 return NGX_HTTP_INTERNAL_SERVER_ERROR;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
426 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
427
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
428 if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
429 return NGX_OK;
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
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
432 failed = ngx_delete_dir_n;
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 } else {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
435
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
436 if (ngx_delete_file(path->data) != NGX_FILE_ERROR) {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
437 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
438 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
439
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
440 failed = ngx_delete_file_n;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
441 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
442
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
443 return ngx_http_dav_error(r->connection->log, ngx_errno,
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
444 NGX_HTTP_NOT_FOUND, failed, path->data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
445 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
446
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
447
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
448 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
449 ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
450 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
451 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
452 "http delete dir: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
453
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
454 if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
455
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
456 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
457
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
458 (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_dir_n,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
459 path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
460 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
461
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
462 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
463 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
464
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
465
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
466 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
467 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
468 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
469 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
470 "http delete file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
471
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
472 if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {
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 /* TODO: add to 207 */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
475
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
476 (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
477 path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
478 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
479
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
480 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
481 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
482
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
483
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
484 static ngx_int_t
1820
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
485 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
486 {
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
487 return NGX_OK;
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
488 }
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
489
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
490
559fedc0c78a change order
Igor Sysoev <igor@sysoev.ru>
parents: 1819
diff changeset
491 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
492 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
493 {
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
494 u_char *p;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
495 size_t root;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
496 ngx_str_t path;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
497
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
498 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
499 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
500 "MKCOL with body is unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
501 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
502 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
503
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
504 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
505 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
506 "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
507 return NGX_HTTP_CONFLICT;
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
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
510 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
511 if (p == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
512 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
513 }
1819
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
514
0f907513dd3c change status code, add log message, and test collection URI
Igor Sysoev <igor@sysoev.ru>
parents: 1818
diff changeset
515 *(p - 1) = '\0';
3182
6ddaac3e0bf7 omit '\0' from "Location" header on MKCOL request
Igor Sysoev <igor@sysoev.ru>
parents: 3161
diff changeset
516 r->uri.len--;
1116
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
519 "http mkcol path: \"%s\"", path.data);
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 if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
522 != NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
523 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
524 if (ngx_http_dav_location(r, path.data) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
525 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
528 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
529 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
530
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
531 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
532 NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
533 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
534
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
535
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
536 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
537 ngx_http_dav_copy_move_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
538 {
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
539 u_char *p, *host, *last, ch;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
540 size_t len, root;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
541 ngx_err_t err;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
542 ngx_int_t rc, depth;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
543 ngx_uint_t overwrite, slash, dir, flags;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
544 ngx_str_t path, uri, duri, args;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
545 ngx_tree_ctx_t tree;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
546 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
547 ngx_file_info_t fi;
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
548 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
549 ngx_ext_rename_file_t ext;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
550 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
551 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
552
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
553 if (r->headers_in.content_length_n > 0) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
554 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
555 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
556
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
557 dest = r->headers_in.destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
558
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
559 if (dest == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
560 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
561 "client sent no \"Destination\" header");
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
562 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
563 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
564
3612
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
565 p = dest->value.data;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
566 /* there is always '\0' even after empty header value */
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
567 if (p[0] == '/') {
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
568 last = p + dest->value.len;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
569 goto destination_done;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
570 }
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
571
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
572 len = r->headers_in.server.len;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
573
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
574 if (len == 0) {
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
575 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
576 "client sent no \"Host\" header");
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
577 return NGX_HTTP_BAD_REQUEST;
1116
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
580 #if (NGX_HTTP_SSL)
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 if (r->connection->ssl) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
583 if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
584 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
585 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
586 goto invalid_destination;
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
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
589 host = dest->value.data + sizeof("https://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
590
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
591 } else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
592 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
593 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
594 if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
595 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
596 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
597 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
598 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
599
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
600 host = dest->value.data + sizeof("http://") - 1;
1116
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
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
603 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
604 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
605 "\"Destination\" URI \"%V\" is handled by "
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
606 "different repository than the source URI",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
607 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
608 return NGX_HTTP_BAD_REQUEST;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
611 last = dest->value.data + dest->value.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
612
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
613 for (p = host + len; p < last; p++) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
614 if (*p == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
615 goto destination_done;
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 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
618
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
619 invalid_destination:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
620
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
621 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
622 "client sent invalid \"Destination\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
623 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
624 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
625
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
626 destination_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
627
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
628 duri.len = last - p;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
629 duri.data = p;
5492
5c52ff68f380 Dav: emit a warning about unsafe URI.
Ruslan Ermilov <ru@nginx.com>
parents: 5409
diff changeset
630 flags = NGX_HTTP_LOG_UNSAFE;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
631
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
632 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
633 goto invalid_destination;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
634 }
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
635
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
636 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
637 || (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
638 {
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
639 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
640 "both URI \"%V\" and \"Destination\" URI \"%V\" "
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
641 "should be either collections or non-collections",
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
642 &r->uri, &dest->value);
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
643 return NGX_HTTP_CONFLICT;
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
644 }
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
645
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
646 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
647
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
648 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
649
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
650 if (r->method == NGX_HTTP_COPY) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
651 if (depth != 0) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
652 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
653 "\"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
654 return NGX_HTTP_BAD_REQUEST;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
655 }
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
656
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
657 } else {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
658 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
659 "\"Depth\" header must be infinity");
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
660 return NGX_HTTP_BAD_REQUEST;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
661 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
662 }
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
663
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
664 over = r->headers_in.overwrite;
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 (over) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
667 if (over->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
668 ch = over->value.data[0];
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 if (ch == 'T' || ch == 't') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
671 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
672 goto overwrite_done;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
673 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
674
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
675 if (ch == 'F' || ch == 'f') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
676 overwrite = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
677 goto overwrite_done;
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
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
682 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
683 "client sent invalid \"Overwrite\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
684 &over->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
685 return NGX_HTTP_BAD_REQUEST;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
688 overwrite = 1;
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 overwrite_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
691
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
692 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
693 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
694 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
695
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
696 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
697 "http copy from: \"%s\"", path.data);
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 uri = r->uri;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
700 r->uri = duri;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
701
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
702 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
703 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
704 }
1116
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 r->uri = uri;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
707
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
708 copy.path.len--; /* omit "\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
709
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
710 if (copy.path.data[copy.path.len - 1] == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
711 slash = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
712 copy.path.len--;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
713 copy.path.data[copy.path.len] = '\0';
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
714
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
715 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
716 slash = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
717 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
718
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
719 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
720 "http copy to: \"%s\"", copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
721
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
722 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
723 err = ngx_errno;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
724
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
725 if (err != NGX_ENOENT) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
726 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
727 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
728 copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
729 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
730
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
731 /* destination does not exist */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
732
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
733 overwrite = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
734 dir = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
735
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
736 } else {
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 /* destination exists */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
739
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
740 if (ngx_is_dir(&fi) && !slash) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
741 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
742 "\"%V\" could not be %Ved to collection \"%V\"",
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
743 &r->uri, &r->method_name, &dest->value);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
744 return NGX_HTTP_CONFLICT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
745 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
746
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
747 if (!overwrite) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
748 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
749 "\"%s\" could not be created", copy.path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
750 return NGX_HTTP_PRECONDITION_FAILED;
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
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
753 dir = ngx_is_dir(&fi);
1116
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
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
756 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
757 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
758 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
759 path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
760 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
761
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
762 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
763
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
764 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
765 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
766 "\"%V\" is collection", &r->uri);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
767 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
768 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
769
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
770 if (overwrite) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
771 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
772 "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
773
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
774 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
775
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
776 if (rc != NGX_OK) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
777 return rc;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
778 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
779 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
780 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
781
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
782 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
783
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
784 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
785
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
786 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
787 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
788 return NGX_HTTP_CREATED;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
792 if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
793 == NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
794 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
795 return ngx_http_dav_error(r->connection->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
796 NGX_HTTP_NOT_FOUND,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
797 ngx_create_dir_n, copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
798 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
799
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
800 copy.len = path.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
801
1769
a35bc4007ec3 tree.init_handler is never called
Igor Sysoev <igor@sysoev.ru>
parents: 1749
diff changeset
802 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
803 tree.file_handler = ngx_http_dav_copy_tree_file;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
804 tree.pre_tree_handler = ngx_http_dav_copy_dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
805 tree.post_tree_handler = ngx_http_dav_copy_dir_time;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
806 tree.spec_handler = ngx_http_dav_noop;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
807 tree.data = &copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
808 tree.alloc = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
809 tree.log = r->connection->log;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
810
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
811 if (ngx_walk_tree(&tree, &path) == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
812
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
813 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
814 rc = ngx_http_dav_delete_path(r, &path, 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
815
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
816 if (rc != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
817 return rc;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
818 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
819 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
820
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
821 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
822 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
823
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
824 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
825
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
826 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
827
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
828 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
829
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
830 ext.access = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
831 ext.path_access = dlcf->access;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
832 ext.time = -1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
833 ext.create_path = 1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
834 ext.delete_file = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
835 ext.log = r->connection->log;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
836
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
837 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
838 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
839 }
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
840
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
841 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
842 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
843
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
844 cf.size = ngx_file_size(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
845 cf.buf_size = 0;
7330
8e7a5de61664 Dav: changed COPY of a file to preserve access mask.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7198
diff changeset
846 cf.access = ngx_file_access(&fi);
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
847 cf.time = ngx_file_mtime(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
848 cf.log = r->connection->log;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
849
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
850 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
851 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
852 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
853 }
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 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
856 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
857
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
858
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
859 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
860 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
861 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
862 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
863 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
864 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
865
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
866 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
867 "http copy dir: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
868
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
869 copy = ctx->data;
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 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
872
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
873 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
874 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
875 return NGX_ABORT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
878 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
879 (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
880
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
881 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
882 "http copy dir to: \"%s\"", 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 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
885 (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
886 dir);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
889 ngx_free(dir);
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 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
892 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
893
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
894
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
895 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
896 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
897 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
898 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
899 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
900 ngx_http_dav_copy_ctx_t *copy;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
903 "http copy dir time: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
904
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
905 copy = ctx->data;
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 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
908
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
909 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
910 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
911 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
912 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
913
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
914 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
915 (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
916
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
917 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
918 "http copy dir time to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
919
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
920 #if (NGX_WIN32)
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
921 {
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
922 ngx_fd_t fd;
1116
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 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
925
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
926 if (fd == NGX_INVALID_FILE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
927 (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
928 goto failed;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
929 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
930
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
931 if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
932 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
933 ngx_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
934 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
935
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
936 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
937 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
938 ngx_close_file_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
939 }
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
940 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
941
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
942 failed:
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 #else
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 if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
947 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
948 ngx_set_file_time_n " \"%s\" failed", dir);
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 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
952
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
953 ngx_free(dir);
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 return NGX_OK;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
956 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
957
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
958
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
959 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
960 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
961 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
962 u_char *p, *file;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
963 size_t len;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
964 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
965 ngx_http_dav_copy_ctx_t *copy;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
968 "http copy file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
969
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
970 copy = ctx->data;
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 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
973
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
974 file = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
975 if (file == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
976 return NGX_ABORT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
977 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
978
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
979 p = ngx_cpymem(file, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
980 (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
981
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
982 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
983 "http copy file to: \"%s\"", file);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
984
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
985 cf.size = ctx->size;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
986 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
987 cf.access = ctx->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
988 cf.time = ctx->mtime;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
989 cf.log = ctx->log;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
990
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
991 (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
992
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
993 ngx_free(file);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
994
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
995 return NGX_OK;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
996 }
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
997
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
998
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
999 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1000 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
1001 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1002 ngx_table_elt_t *depth;
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
1003
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1004 depth = r->headers_in.depth;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1005
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1006 if (depth == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1007 return dflt;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1010 if (depth->value.len == 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 if (depth->value.data[0] == '0') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1013 return 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1014 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1015
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1016 if (depth->value.data[0] == '1') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1017 return 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1018 }
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 } else {
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 if (depth->value.len == sizeof("infinity") - 1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1023 && ngx_strcmp(depth->value.data, "infinity") == 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1024 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1025 return NGX_HTTP_DAV_INFINITY_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1026 }
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1030 "client sent invalid \"Depth\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1031 &depth->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1032
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1033 return NGX_HTTP_DAV_INVALID_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1034 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1035
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1036
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1037 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1038 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
1039 char *failed, u_char *path)
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 ngx_int_t rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1042 ngx_uint_t level;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1043
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1044 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
1045 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1046 rc = not_found;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1047
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1048 } else if (err == NGX_EACCES || err == NGX_EPERM) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1049 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1050 rc = NGX_HTTP_FORBIDDEN;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1052 } else if (err == NGX_EEXIST) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 rc = NGX_HTTP_NOT_ALLOWED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056 } else if (err == NGX_ENOSPC) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1057 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1058 rc = NGX_HTTP_INSUFFICIENT_STORAGE;
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 } else {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1061 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1062 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
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
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1065 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
1066
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1067 return rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1068 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1069
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1070
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1071 static ngx_int_t
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1072 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
1073 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1074 u_char *location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1075 ngx_http_core_loc_conf_t *clcf;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1076
6853
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1077 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
1078 if (r->headers_out.location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1079 return NGX_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1080 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1081
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1082 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
1083
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1084 if (!clcf->alias && clcf->root_lengths == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1085 location = path + clcf->root.len;
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 } else {
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 2007
diff changeset
1088 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
1089 if (location == NULL) {
6986
0cdee26605f3 Cleaned up r->headers_out.headers allocation error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6853
diff changeset
1090 ngx_http_clear_location(r);
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1091 return NGX_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1092 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1093
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1094 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
1095 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1096
6853
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1097 r->headers_out.location->hash = 1;
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1098 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
1099 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
1100 r->headers_out.location->value.data = location;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1101
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1102 return NGX_OK;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1103 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1104
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1105
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 static void *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107 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
1108 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 ngx_http_dav_loc_conf_t *conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1111 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
1112 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
1113 return NULL;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117 * set by ngx_pcalloc():
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1118 *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1119 * conf->methods = 0;
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
1864
524831ec3e69 fix building by msvc introduced in r1817
Igor Sysoev <igor@sysoev.ru>
parents: 1834
diff changeset
1122 conf->min_delete_depth = NGX_CONF_UNSET_UINT;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1123 conf->access = NGX_CONF_UNSET_UINT;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1124 conf->create_full_put_path = NGX_CONF_UNSET;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1125
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126 return conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1127 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1128
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130 static char *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1131 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
1132 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 ngx_http_dav_loc_conf_t *prev = parent;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134 ngx_http_dav_loc_conf_t *conf = child;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1136 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
1137 (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1138
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1139 ngx_conf_merge_uint_value(conf->min_delete_depth,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1140 prev->min_delete_depth, 0);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1142 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
1143
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1144 ngx_conf_merge_value(conf->create_full_put_path,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1145 prev->create_full_put_path, 0);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1146
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147 return NGX_CONF_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1148 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1152 ngx_http_dav_init(ngx_conf_t *cf)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154 ngx_http_handler_pt *h;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155 ngx_http_core_main_conf_t *cmcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1156
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1157 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
1158
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1159 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
1160 if (h == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1162 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1163
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1164 *h = ngx_http_dav_handler;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1165
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1166 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167 }