annotate src/http/modules/ngx_http_dav_module.c @ 8031:d26db4f82d7d

All known output headers can be linked lists now. The h->next pointer properly provided as NULL in all cases where known output headers are added. Note that there are 3rd party modules which might not do this, and it might be risky to rely on this for arbitrary headers.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 30 May 2022 21:25:45 +0300
parents 1bde031b59ff
children
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);
7602
b399246ea45d Saved some memory allocations.
Ruslan Ermilov <ru@nginx.com>
parents: 7601
diff changeset
59 static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r);
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) {
7602
b399246ea45d Saved some memory allocations.
Ruslan Ermilov <ru@nginx.com>
parents: 7601
diff changeset
288 if (ngx_http_dav_location(r) != 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
7609
f609c0ac2972 Dav: added checks for chunked to body presence conditions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7602
diff changeset
315 if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
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
7609
f609c0ac2972 Dav: added checks for chunked to body presence conditions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7602
diff changeset
498 if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
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';
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
516
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
517 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
518 "http mkcol path: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
519
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
520 if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
521 != NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
522 {
7602
b399246ea45d Saved some memory allocations.
Ruslan Ermilov <ru@nginx.com>
parents: 7601
diff changeset
523 if (ngx_http_dav_location(r) != NGX_OK) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
524 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
525 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
526
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
527 return NGX_HTTP_CREATED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
528 }
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 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
531 NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
532 }
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 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
536 ngx_http_dav_copy_move_handler(ngx_http_request_t *r)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
537 {
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
538 u_char *p, *host, *last, ch;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
539 size_t len, root;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
540 ngx_err_t err;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
541 ngx_int_t rc, depth;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
542 ngx_uint_t overwrite, slash, dir, flags;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
543 ngx_str_t path, uri, duri, args;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
544 ngx_tree_ctx_t tree;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
545 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
546 ngx_file_info_t fi;
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
547 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
548 ngx_ext_rename_file_t ext;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
549 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
550 ngx_http_dav_loc_conf_t *dlcf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
551
7609
f609c0ac2972 Dav: added checks for chunked to body presence conditions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7602
diff changeset
552 if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
f609c0ac2972 Dav: added checks for chunked to body presence conditions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7602
diff changeset
553 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
f609c0ac2972 Dav: added checks for chunked to body presence conditions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7602
diff changeset
554 "COPY and MOVE with body are unsupported");
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
555 return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
558 dest = r->headers_in.destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
559
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
560 if (dest == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
561 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
562 "client sent no \"Destination\" header");
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
563 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
564 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
565
3612
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
566 p = dest->value.data;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
567 /* there is always '\0' even after empty header value */
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
568 if (p[0] == '/') {
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
569 last = p + dest->value.len;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
570 goto destination_done;
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
571 }
f9a96545fee7 allow Destination URL without host
Igor Sysoev <igor@sysoev.ru>
parents: 3527
diff changeset
572
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
573 len = r->headers_in.server.len;
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
574
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
575 if (len == 0) {
1804
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
576 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
577 "client sent no \"Host\" header");
d457a1576532 several changes in server_name:
Igor Sysoev <igor@sysoev.ru>
parents: 1803
diff changeset
578 return NGX_HTTP_BAD_REQUEST;
1116
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
581 #if (NGX_HTTP_SSL)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
582
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
583 if (r->connection->ssl) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
584 if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
585 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
586 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
587 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
588 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
589
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
590 host = dest->value.data + sizeof("https://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
591
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
592 } else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
593 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
594 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
595 if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
596 != 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
597 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
598 goto invalid_destination;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
599 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
600
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
601 host = dest->value.data + sizeof("http://") - 1;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
602 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
603
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
604 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
605 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
606 "\"Destination\" URI \"%V\" is handled by "
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
607 "different repository than the source URI",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
608 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
609 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
610 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
611
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
612 last = dest->value.data + dest->value.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
613
2007
b9de93d804ea *) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents: 1909
diff changeset
614 for (p = host + len; p < last; p++) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
615 if (*p == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
616 goto destination_done;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
620 invalid_destination:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
621
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
622 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
623 "client sent invalid \"Destination\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
624 &dest->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
625 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
626
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
627 destination_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
628
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
629 duri.len = last - p;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
630 duri.data = p;
5492
5c52ff68f380 Dav: emit a warning about unsafe URI.
Ruslan Ermilov <ru@nginx.com>
parents: 5409
diff changeset
631 flags = NGX_HTTP_LOG_UNSAFE;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
632
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
633 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
634 goto invalid_destination;
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
635 }
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
636
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
637 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
638 || (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
639 {
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
640 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
641 "both URI \"%V\" and \"Destination\" URI \"%V\" "
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
642 "should be either collections or non-collections",
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
643 &r->uri, &dest->value);
Ruslan Ermilov <ru@nginx.com>
parents: 6180
diff changeset
644 return NGX_HTTP_CONFLICT;
1822
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
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
647 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
648
1822
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
649 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
650
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
651 if (r->method == NGX_HTTP_COPY) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
652 if (depth != 0) {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
653 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
654 "\"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
655 return NGX_HTTP_BAD_REQUEST;
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
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
658 } else {
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
659 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
660 "\"Depth\" header must be infinity");
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
661 return NGX_HTTP_BAD_REQUEST;
935427c55e04 test URI/Destination collection/non-collection and Depth
Igor Sysoev <igor@sysoev.ru>
parents: 1821
diff changeset
662 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
663 }
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
664
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
665 over = r->headers_in.overwrite;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
666
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
667 if (over) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
668 if (over->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
669 ch = over->value.data[0];
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
670
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
671 if (ch == 'T' || ch == 't') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
672 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
673 goto overwrite_done;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
676 if (ch == 'F' || ch == 'f') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
677 overwrite = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
678 goto overwrite_done;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
683 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
684 "client sent invalid \"Overwrite\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
685 &over->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
686 return NGX_HTTP_BAD_REQUEST;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
689 overwrite = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
690
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
691 overwrite_done:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
692
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
693 if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
694 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
695 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
696
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
697 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
698 "http copy from: \"%s\"", path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
699
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
700 uri = r->uri;
3161
d430c6ab1c99 check unsafe Destination
Igor Sysoev <igor@sysoev.ru>
parents: 3032
diff changeset
701 r->uri = duri;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
702
5781
1f70fe0d9576 Dav: ngx_http_map_uri_to_path() errors were not checked.
FengGu <flygoast@126.com>
parents: 5492
diff changeset
703 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
704 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
705 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
706
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
707 r->uri = uri;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
708
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
709 copy.path.len--; /* omit "\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
710
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
711 if (copy.path.data[copy.path.len - 1] == '/') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
712 slash = 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
713 copy.path.len--;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
714 copy.path.data[copy.path.len] = '\0';
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
715
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
716 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
717 slash = 0;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
720 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
721 "http copy to: \"%s\"", copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
722
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
723 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
724 err = ngx_errno;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
725
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
726 if (err != NGX_ENOENT) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
727 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
728 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
729 copy.path.data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
730 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
731
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
732 /* destination does not exist */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
733
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
734 overwrite = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
735 dir = 0;
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
736
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
737 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
738
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
739 /* destination exists */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
740
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
741 if (ngx_is_dir(&fi) && !slash) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
742 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
743 "\"%V\" could not be %Ved to collection \"%V\"",
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
744 &r->uri, &r->method_name, &dest->value);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
745 return NGX_HTTP_CONFLICT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
748 if (!overwrite) {
1824
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
749 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,
8299cd253745 add log
Igor Sysoev <igor@sysoev.ru>
parents: 1823
diff changeset
750 "\"%s\" could not be created", copy.path.data);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
751 return NGX_HTTP_PRECONDITION_FAILED;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
752 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
753
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
754 dir = ngx_is_dir(&fi);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
755 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
756
3501
423ff11e3018 use lstat() for WebDAV DELETE, COPY, and MOVE to handle symlinks
Igor Sysoev <igor@sysoev.ru>
parents: 3182
diff changeset
757 if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
758 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
759 NGX_HTTP_NOT_FOUND, ngx_link_info_n,
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
760 path.data);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
763 if (ngx_is_dir(&fi)) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
764
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
765 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
766 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
767 "\"%V\" is collection", &r->uri);
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
768 return NGX_HTTP_BAD_REQUEST;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
769 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
770
1825
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
771 if (overwrite) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
772 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
773 "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
774
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
775 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
776
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
777 if (rc != NGX_OK) {
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
778 return rc;
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
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
783 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
784
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
785 path.len -= 2; /* omit "/\0" */
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
786
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
787 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
788 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
789 return NGX_HTTP_CREATED;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
793 if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
794 == NGX_FILE_ERROR)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
795 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
796 return ngx_http_dav_error(r->connection->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
797 NGX_HTTP_NOT_FOUND,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
798 ngx_create_dir_n, copy.path.data);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
801 copy.len = path.len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
802
1769
a35bc4007ec3 tree.init_handler is never called
Igor Sysoev <igor@sysoev.ru>
parents: 1749
diff changeset
803 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
804 tree.file_handler = ngx_http_dav_copy_tree_file;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
805 tree.pre_tree_handler = ngx_http_dav_copy_dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
806 tree.post_tree_handler = ngx_http_dav_copy_dir_time;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
807 tree.spec_handler = ngx_http_dav_noop;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
808 tree.data = &copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
809 tree.alloc = 0;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
810 tree.log = r->connection->log;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
811
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
812 if (ngx_walk_tree(&tree, &path) == NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
813
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
814 if (r->method == NGX_HTTP_MOVE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
815 rc = ngx_http_dav_delete_path(r, &path, 1);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
816
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
817 if (rc != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
818 return rc;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
822 return NGX_HTTP_CREATED;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
825 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
826
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
827 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
828
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
829 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
830
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
831 ext.access = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
832 ext.path_access = dlcf->access;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
833 ext.time = -1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
834 ext.create_path = 1;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
835 ext.delete_file = 0;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
836 ext.log = r->connection->log;
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
837
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
838 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
839 return NGX_HTTP_NO_CONTENT;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
840 }
2394
dbe746851b31 use ngx_ext_rename_file() for single file MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
841
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
842 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
843 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
844
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
845 cf.size = ngx_file_size(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
846 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
847 cf.access = ngx_file_access(&fi);
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
848 cf.time = ngx_file_mtime(&fi);
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
849 cf.log = r->connection->log;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
850
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
851 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
852 return NGX_HTTP_NO_CONTENT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
856 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
860 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
861 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
862 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
863 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
864 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
865 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
866
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
867 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
868 "http copy dir: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
869
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
870 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
871
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
872 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
873
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
874 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
875 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
876 return NGX_ABORT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
879 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
880 (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
881
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
882 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
883 "http copy dir to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
884
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
885 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
886 (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
887 dir);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
890 ngx_free(dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
891
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
892 return NGX_OK;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
896 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
897 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
898 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
899 u_char *p, *dir;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
900 size_t len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
901 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
902
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
903 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
904 "http copy dir time: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
905
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
906 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
907
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
908 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
909
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
910 dir = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
911 if (dir == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
912 return NGX_ABORT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
915 p = ngx_cpymem(dir, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
916 (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
917
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
918 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
919 "http copy dir time to: \"%s\"", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
920
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
921 #if (NGX_WIN32)
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
922 {
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
923 ngx_fd_t fd;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
924
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
925 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
926
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
927 if (fd == NGX_INVALID_FILE) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
928 (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
929 goto failed;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
930 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
931
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
932 if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
933 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
934 ngx_set_file_time_n " \"%s\" failed", dir);
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
937 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
938 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
939 ngx_close_file_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
940 }
1803
7405719e4848 condition declarations inside blocks update missed in r1705
Igor Sysoev <igor@sysoev.ru>
parents: 1769
diff changeset
941 }
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
942
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
943 failed:
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
944
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
945 #else
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
946
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
947 if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
948 ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
949 ngx_set_file_time_n " \"%s\" failed", dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
950 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
951
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
952 #endif
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
953
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
954 ngx_free(dir);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
955
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
956 return NGX_OK;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
960 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
961 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
962 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
963 u_char *p, *file;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
964 size_t len;
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
965 ngx_copy_file_t cf;
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
966 ngx_http_dav_copy_ctx_t *copy;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
967
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
968 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
969 "http copy file: \"%s\"", path->data);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
970
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
971 copy = ctx->data;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
972
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
973 len = copy->path.len + path->len;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
974
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
975 file = ngx_alloc(len + 1, ctx->log);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
976 if (file == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
977 return NGX_ABORT;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
980 p = ngx_cpymem(file, copy->path.data, copy->path.len);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
981 (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
982
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
983 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
984 "http copy file to: \"%s\"", file);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
985
3024
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
986 cf.size = ctx->size;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
987 cf.buf_size = 0;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
988 cf.access = ctx->access;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
989 cf.time = ctx->mtime;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
990 cf.log = ctx->log;
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
991
8101d9101ed8 allow cross device temporary files atomic copying:
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
992 (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
993
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
994 ngx_free(file);
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
995
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
996 return NGX_OK;
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
2e0fbfef56d4 do not delete target until all tests will be done,
Igor Sysoev <igor@sysoev.ru>
parents: 1824
diff changeset
1000 static ngx_int_t
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1001 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
1002 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1003 ngx_table_elt_t *depth;
1174
6be5ee17d80b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1116
diff changeset
1004
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1005 depth = r->headers_in.depth;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1006
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1007 if (depth == NULL) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1008 return dflt;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1011 if (depth->value.len == 1) {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1012
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1013 if (depth->value.data[0] == '0') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1014 return 0;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1017 if (depth->value.data[0] == '1') {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1018 return 1;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1019 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1020
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1021 } else {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1022
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1023 if (depth->value.len == sizeof("infinity") - 1
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1024 && ngx_strcmp(depth->value.data, "infinity") == 0)
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1025 {
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1026 return NGX_HTTP_DAV_INFINITY_DEPTH;
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1027 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1028 }
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1029
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1030 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1031 "client sent invalid \"Depth\" header: \"%V\"",
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1032 &depth->value);
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1033
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1034 return NGX_HTTP_DAV_INVALID_DEPTH;
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
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1038 static ngx_int_t
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1039 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
1040 char *failed, u_char *path)
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1041 {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1042 ngx_int_t rc;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1043 ngx_uint_t level;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1044
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1045 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
1046 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1047 rc = not_found;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1048
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1049 } else if (err == NGX_EACCES || err == NGX_EPERM) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1050 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1051 rc = NGX_HTTP_FORBIDDEN;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1052
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1053 } else if (err == NGX_EEXIST) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1054 level = NGX_LOG_ERR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1055 rc = NGX_HTTP_NOT_ALLOWED;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1056
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1057 } else if (err == NGX_ENOSPC) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1058 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1059 rc = NGX_HTTP_INSUFFICIENT_STORAGE;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1060
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1061 } else {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1062 level = NGX_LOG_CRIT;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1063 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1064 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1065
1116
6fcce6c4019a COPY and MOVE
Igor Sysoev <igor@sysoev.ru>
parents: 1089
diff changeset
1066 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
1067
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1068 return rc;
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
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1072 static ngx_int_t
7602
b399246ea45d Saved some memory allocations.
Ruslan Ermilov <ru@nginx.com>
parents: 7601
diff changeset
1073 ngx_http_dav_location(ngx_http_request_t *r)
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1074 {
7848
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1075 u_char *p;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1076 size_t len;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1077 uintptr_t escape;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1078
6853
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1079 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
1080 if (r->headers_out.location == NULL) {
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1081 return NGX_ERROR;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1082 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1083
6853
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1084 r->headers_out.location->hash = 1;
8031
d26db4f82d7d All known output headers can be linked lists now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7848
diff changeset
1085 r->headers_out.location->next = NULL;
6853
c85dfd99a2dd Fixed missing "Location" field with some relative redirects.
Ruslan Ermilov <ru@nginx.com>
parents: 6538
diff changeset
1086 ngx_str_set(&r->headers_out.location->key, "Location");
7848
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1087
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1088 escape = 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len, NGX_ESCAPE_URI);
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1089
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1090 if (escape) {
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1091 len = r->uri.len + escape;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1092
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1093 p = ngx_pnalloc(r->pool, len);
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1094 if (p == NULL) {
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1095 ngx_http_clear_location(r);
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1096 return NGX_ERROR;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1097 }
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1098
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1099 r->headers_out.location->value.len = len;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1100 r->headers_out.location->value.data = p;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1101
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1102 ngx_escape_uri(p, r->uri.data, r->uri.len, NGX_ESCAPE_URI);
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1103
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1104 } else {
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1105 r->headers_out.location->value = r->uri;
1bde031b59ff Location header escaping in redirects (ticket #882).
Ruslan Ermilov <ru@nginx.com>
parents: 7609
diff changeset
1106 }
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1107
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1108 return NGX_OK;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1109 }
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1110
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1111
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112 static void *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113 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
1114 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 ngx_http_dav_loc_conf_t *conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117 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
1118 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
1119 return NULL;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 * set by ngx_pcalloc():
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1124 *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1125 * conf->methods = 0;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126 */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1127
1864
524831ec3e69 fix building by msvc introduced in r1817
Igor Sysoev <igor@sysoev.ru>
parents: 1834
diff changeset
1128 conf->min_delete_depth = NGX_CONF_UNSET_UINT;
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1129 conf->access = NGX_CONF_UNSET_UINT;
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1130 conf->create_full_put_path = NGX_CONF_UNSET;
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1131
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 return conf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134
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 static char *
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137 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
1138 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139 ngx_http_dav_loc_conf_t *prev = parent;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 ngx_http_dav_loc_conf_t *conf = child;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1142 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
1143 (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
1144
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1145 ngx_conf_merge_uint_value(conf->min_delete_depth,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1146 prev->min_delete_depth, 0);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147
669
562806624c4a nginx-0.3.56-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
1148 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
1149
1816
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1150 ngx_conf_merge_value(conf->create_full_put_path,
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1151 prev->create_full_put_path, 0);
20a2512aacc4 min_delete_depth
Igor Sysoev <igor@sysoev.ru>
parents: 1815
diff changeset
1152
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 return NGX_CONF_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1156
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1157 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1158 ngx_http_dav_init(ngx_conf_t *cf)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1159 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160 ngx_http_handler_pt *h;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161 ngx_http_core_main_conf_t *cmcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1162
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 675
diff changeset
1163 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
1164
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1165 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
1166 if (h == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1168 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1169
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1170 *h = ngx_http_dav_handler;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1171
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1172 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1173 }