Sun, 27 Nov 2022 13:33:30 +0100
improve daemon startup
parent will wait until daemon is started and returns error code if startup failed
daemon startup log messages will be printed by parent
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
4 | * Copyright 2020 Olaf Wintermann. All rights reserved. |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | #include "../daemon/session.h" |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
33 | #include "../daemon/protocol.h" |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
34 | #include "../util/platform.h" |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
35 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
36 | #include <cx/string.h> |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
37 | #include <cx/hash_map.h> |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
39 | #include "multistatus.h" |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
40 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
41 | #include "operation.h" |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
42 | #include "xml.h" |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | #define MULTISTATUS_BUFFER_LENGTH 2048 |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | Multistatus* multistatus_response(Session *sn, Request *rq) { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | Multistatus *ms = pool_malloc(sn->pool, sizeof(Multistatus)); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | if(!ms) { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | return NULL; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | ZERO(ms, sizeof(Multistatus)); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | ms->response.addresource = multistatus_addresource; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | ms->sn = sn; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | ms->rq = rq; |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
55 | ms->namespaces = cxHashMapCreate(pool_allocator(sn->pool), 8); |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
56 | ms->proppatch = FALSE; |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | if(!ms->namespaces) { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | return NULL; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
60 | if(cxMapPut(ms->namespaces, cx_hash_key_str("D"), webdav_dav_namespace())) { |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | return NULL; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | return ms; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
66 | static int send_xml_root(Multistatus *ms, Writer *out) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
67 | writer_put_lit(out, "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
68 | "<D:multistatus"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
69 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
70 | // write the namespaces definitions |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
71 | // key is the namespace prefix |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
72 | // the map always contains the "DAV:" namespace with the prefix "D" |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
73 | CxIterator i = cxMapIterator(ms->namespaces); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
74 | cx_foreach(CxMapEntry*, entry, i) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
75 | WSNamespace *ns = entry->value; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
76 | writer_put_lit(out, " xmlns:"); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
77 | writer_put (out, entry->key->data.str, entry->key->len); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
78 | writer_put_lit(out, "=\""); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
79 | writer_put_str(out, (char*)ns->href); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
80 | writer_put_lit(out, "\""); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
81 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
82 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
83 | writer_put_lit(out, ">\n"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
84 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
85 | return out->error; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
86 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
87 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
88 | static void send_nsdef(WSNamespace *ns, Writer *out) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
89 | writer_put_lit(out, " xmlns:"); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
90 | writer_put_str(out, (char*)ns->prefix); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
91 | writer_put_lit(out, "=\""); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
92 | writer_put_str(out, (char*)ns->href); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
93 | writer_putc (out, '\"'); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
94 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
95 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
96 | static void send_string_escaped(Writer *out, cxmutstr str) { |
349
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
97 | char *begin = str.ptr; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
98 | char *end = begin; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
99 | char *escape = NULL; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
100 | int esclen; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
101 | for(size_t i=0;i<str.length;i++) { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
102 | char c = str.ptr[i]; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
103 | end = str.ptr + i; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
104 | switch(c) { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
105 | case '"': { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
106 | escape = """; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
107 | esclen = 6; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
108 | break; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
109 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
110 | case '&': { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
111 | escape = "&"; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
112 | esclen = 5; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
113 | break; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
114 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
115 | case '\'': { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
116 | escape = "'"; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
117 | esclen = 6; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
118 | break; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
119 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
120 | case '<': { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
121 | escape = "<"; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
122 | esclen = 4; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
123 | break; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
124 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
125 | case '>': { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
126 | escape = ">"; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
127 | esclen = 4; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
128 | break; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
129 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
130 | default: continue; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
131 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
132 | ptrdiff_t len = end - begin; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
133 | if(len > 0) { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
134 | writer_put(out, begin, len); |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
135 | begin = end + 1; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
136 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
137 | writer_put(out, escape, esclen); |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
138 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
139 | ptrdiff_t len = end - begin; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
140 | if(len > 0) { |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
141 | writer_put(out, begin, len + 1); |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
142 | begin = end + 1; |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
143 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
144 | } |
7bf652914e9b
xml escape href value in propfind response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
309
diff
changeset
|
145 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
146 | static int send_property( |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
147 | Multistatus *ms, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
148 | WebdavProperty *property, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
149 | WebdavNSList *nsdef, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
150 | WSBool writeContent, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
151 | Writer *out) |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
152 | { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
153 | // write: "<prefix:name" |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
154 | writer_putc (out, '<'); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
155 | writer_put_str(out, (char*)property->namespace->prefix); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
156 | writer_putc (out, ':'); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
157 | writer_put_str(out, (char*)property->name); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
158 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
159 | // send additional namespace definitions required for the value |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
160 | WebdavNSList *def = nsdef; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
161 | while(def) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
162 | send_nsdef(def->namespace, out); |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
163 | def = def->next; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
164 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
165 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
166 | // send xml lang attribute |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
167 | if(property->lang) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
168 | writer_put_lit(out, " xml:lang=\""); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
169 | writer_put_str(out, (char*)property->lang); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
170 | writer_putc (out, '\"'); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
171 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
172 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
173 | // end property tag and write content |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
174 | if(writeContent) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
175 | writer_putc(out, '>'); |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
176 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
177 | // content |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
178 | switch(property->vtype) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
179 | case WS_VALUE_NO_TYPE: break; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
180 | case WS_VALUE_XML_NODE: { |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
181 | wsxml_write_nodes_without_nsdef( |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
182 | ms->sn->pool, |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
183 | out, |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
184 | property->value.node); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
185 | break; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
186 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
187 | case WS_VALUE_XML_DATA: { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
188 | // only write data, data->namespaces is already handled |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
189 | writer_put( |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
190 | out, |
376
61d481d3c2e4
Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
191 | property->value.data.data, |
61d481d3c2e4
Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
192 | property->value.data.length); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
193 | break; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
194 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
195 | case WS_VALUE_TEXT: { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
196 | // asume the text is already escaped |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
197 | writer_put( |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
198 | out, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
199 | property->value.text.str, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
200 | property->value.text.length); |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
201 | break; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
202 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
203 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
204 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
205 | // end tag |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
206 | writer_put_lit(out, "</"); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
207 | writer_put_str(out, (char*)property->namespace->prefix); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
208 | writer_putc (out, ':'); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
209 | writer_put_str(out, (char*)property->name); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
210 | writer_putc (out, '>'); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
211 | } else { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
212 | writer_put_lit(out, "/>"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
213 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
214 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
215 | return out->error; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
216 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
217 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
218 | static int send_response_tag(Multistatus *ms, MSResponse *rp, Writer *out) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
219 | writer_put_lit(out, " <D:response>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
220 | " <D:href>"); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
221 | send_string_escaped(out, cx_mutstr(rp->resource.href)); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
222 | writer_put_lit(out, "</D:href>\n"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
223 | |
242
c337a7ac82a8
implement webdav_proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
241
diff
changeset
|
224 | WSBool writeContent = ms->proppatch ? FALSE : TRUE; |
c337a7ac82a8
implement webdav_proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
241
diff
changeset
|
225 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
226 | if(rp->plist_begin) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
227 | writer_put_lit(out, " <D:propstat>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
228 | " <D:prop>\n"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
229 | // send properties |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
230 | PropertyOkList *p = rp->plist_begin; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
231 | while(p) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
232 | writer_put_lit(out, " "); |
242
c337a7ac82a8
implement webdav_proppatch
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
241
diff
changeset
|
233 | if(send_property(ms, p->property, p->nsdef, writeContent, out)) { |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
234 | return out->error; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
235 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
236 | writer_put_lit(out, "\n"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
237 | p = p->next; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
238 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
239 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
240 | writer_put_lit(out, " </D:prop>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
241 | " <D:status>HTTP/1.1 200 OK</D:status>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
242 | " </D:propstat>\n"); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
243 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
244 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
245 | // send error properties |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
246 | PropertyErrorList *error = rp->errors; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
247 | while(error) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
248 | writer_put_lit(out, " <D:propstat>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
249 | " <D:prop>\n"); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
250 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
251 | WebdavPList *errprop = error->begin; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
252 | while(errprop) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
253 | writer_put_lit(out, " "); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
254 | if(send_property(ms, errprop->property, NULL, FALSE, out)) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
255 | return out->error; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
256 | } |
238
e820d433f405
fix multistatus response and add propfind tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
237
diff
changeset
|
257 | writer_putc(out, '\n'); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
258 | errprop = errprop->next; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
259 | } |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
260 | |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
261 | char statuscode[8]; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
262 | int sclen = snprintf(statuscode, 8, "%d ", error->status); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
263 | if(sclen > 4) { |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
264 | statuscode[0] = '5'; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
265 | statuscode[1] = '0'; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
266 | statuscode[2] = '0'; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
267 | statuscode[3] = ' '; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
268 | sclen = 4; |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
269 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
270 | writer_put_lit(out, " </D:prop>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
271 | " <D:status>HTTP/1.1 "); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
272 | writer_put(out, statuscode, sclen); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
273 | const char *status_msg = protocol_status_message(error->status); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
274 | if(status_msg) { |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
275 | writer_put(out, status_msg, strlen(status_msg)); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
276 | } else { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
277 | writer_put_lit(out, "Server Error"); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
278 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
279 | writer_put_lit(out, "</D:status>\n" |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
280 | " </D:propstat>\n"); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
281 | |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
282 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
283 | error = error->next; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
284 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
285 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
286 | // end response tag |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
287 | writer_put_lit(out, " </D:response>\n"); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
288 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
289 | return out->error; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
290 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
291 | |
308
c3cad8f51a24
close last resource in multistatus_send
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
252
diff
changeset
|
292 | int multistatus_send(Multistatus *ms, SYS_NETFD net) { |
c3cad8f51a24
close last resource in multistatus_send
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
252
diff
changeset
|
293 | // make sure every resource is closed |
c3cad8f51a24
close last resource in multistatus_send
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
252
diff
changeset
|
294 | if(ms->current && !ms->current->resource.isclosed) { |
309
fc021bd576d4
implement pg getcontentlength property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
308
diff
changeset
|
295 | if(msresponse_close((WebdavResource*)ms->current)) { |
fc021bd576d4
implement pg getcontentlength property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
308
diff
changeset
|
296 | return 1; |
fc021bd576d4
implement pg getcontentlength property
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
308
diff
changeset
|
297 | } |
308
c3cad8f51a24
close last resource in multistatus_send
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
252
diff
changeset
|
298 | } |
c3cad8f51a24
close last resource in multistatus_send
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
252
diff
changeset
|
299 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
300 | // start http response |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
301 | protocol_status(ms->sn, ms->rq, 207, NULL); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
302 | protocol_start_response(ms->sn, ms->rq); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
303 | |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
304 | char buffer[MULTISTATUS_BUFFER_LENGTH]; |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
305 | // create a writer, that flushes the buffer when it is filled |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
306 | Writer writer; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
307 | Writer *out = &writer; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
308 | writer_init(out, net, buffer, MULTISTATUS_BUFFER_LENGTH); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
309 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
310 | // send the xml root element with namespace defs |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
311 | if(send_xml_root(ms, out)) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
312 | return 1; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
313 | } |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
314 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
315 | // send response tags |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
316 | MSResponse *response = ms->first; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
317 | while(response) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
318 | if(send_response_tag(ms, response, out)) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
319 | return 1; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
320 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
321 | response = response->next; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
322 | } |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
323 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
324 | // end multistatus |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
325 | writer_put_lit(out, "</D:multistatus>\n"); |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
326 | |
381
7d55d60e1fe2
fix resourcetype initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
376
diff
changeset
|
327 | //printf("\n\n"); |
376
61d481d3c2e4
Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
328 | //fflush(stdout); |
61d481d3c2e4
Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
329 | |
233
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
330 | writer_flush(out); |
c5985d2fc19a
add test for webdav_propfind() that checks if the response is valid xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
231
diff
changeset
|
331 | |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
332 | return 0; |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
335 | WebdavResource * multistatus_addresource( |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
336 | WebdavResponse *response, |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
337 | const char *path) |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
338 | { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | Multistatus *ms = (Multistatus*)response; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
340 | MSResponse *res = pool_malloc(ms->sn->pool, sizeof(MSResponse)); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
341 | if(!res) { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
342 | return NULL; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
343 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
344 | ZERO(res, sizeof(MSResponse)); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
345 | |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
346 | // set href |
223
bbaec8415c10
add xml tree iterator
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
222
diff
changeset
|
347 | res->resource.href = pool_strdup(ms->sn->pool, path); |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
348 | if(!res->resource.href) { |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
349 | return NULL; |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
350 | } |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
351 | |
241
4adad7faf452
add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
239
diff
changeset
|
352 | res->resource.err = 0; |
4adad7faf452
add proppatch op
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
239
diff
changeset
|
353 | |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
354 | // add resource funcs |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
355 | res->resource.addproperty = msresponse_addproperty; |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
356 | res->resource.close = msresponse_close; |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
357 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
358 | res->properties = cxHashMapCreate(pool_allocator(ms->sn->pool), 32); |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
359 | if(!res->properties) { |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
360 | return NULL; |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
361 | } |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
362 | |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
363 | res->multistatus = ms; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
364 | res->errors = NULL; |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
365 | res->resource.isclosed = 0; |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
366 | res->closing = 0; |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
367 | |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
368 | // add new resource to the resource list |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
369 | if(ms->current) { |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
370 | // before adding a new resource, the current resource must be closed |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
371 | if(!ms->current->resource.isclosed) { |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
372 | msresponse_close((WebdavResource*)ms->current); |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
373 | } |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
374 | ms->current->next = res; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
375 | } else { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
376 | ms->first = res; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
377 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
378 | ms->current = res; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
379 | |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
380 | return (WebdavResource*)res; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
381 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
382 | |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
383 | static int oklist_add( |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
384 | pool_handle_t *pool, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
385 | PropertyOkList **begin, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
386 | PropertyOkList **end, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
387 | WebdavProperty *property, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
388 | WebdavNSList *nsdef) |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
389 | { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
390 | PropertyOkList *newelm = pool_malloc(pool, sizeof(PropertyOkList)); |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
391 | if(!newelm) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
392 | return 1; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
393 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
394 | newelm->property = property; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
395 | newelm->nsdef = nsdef; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
396 | newelm->next = NULL; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
397 | if(*end) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
398 | (*end)->next = newelm; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
399 | } else { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
400 | *begin = newelm; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
401 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
402 | *end = newelm; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
403 | return 0; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
404 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
405 | |
403
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
406 | /* |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
407 | * should only be called from msresponse_addproperty |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
408 | * |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
409 | * Adds a property to the error list with the specified statuscode |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
410 | */ |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
411 | static int msresponse_addproperror( |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
412 | MSResponse *response, |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
413 | WebdavProperty *property, |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
414 | int statuscode) |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
415 | { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
416 | pool_handle_t *pool = response->multistatus->sn->pool; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
417 | |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
418 | response->resource.err++; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
419 | |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
420 | // MSResponse contains a list of properties for each status code |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
421 | // at first find the list for this status code |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
422 | PropertyErrorList *errlist = NULL; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
423 | PropertyErrorList *list = response->errors; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
424 | PropertyErrorList *last = NULL; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
425 | while(list) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
426 | if(list->status == statuscode) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
427 | errlist = list; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
428 | break; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
429 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
430 | last = list; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
431 | list = list->next; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
432 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
433 | |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
434 | if(!errlist) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
435 | // no list available for this statuscode |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
436 | PropertyErrorList *newelm = pool_malloc(pool, |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
437 | sizeof(PropertyErrorList)); |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
438 | if(!newelm) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
439 | return 1; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
440 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
441 | newelm->begin = NULL; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
442 | newelm->end = NULL; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
443 | newelm->next = NULL; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
444 | newelm->status = statuscode; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
445 | |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
446 | if(last) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
447 | last->next = newelm; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
448 | } else { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
449 | response->errors = newelm; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
450 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
451 | errlist = newelm; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
452 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
453 | |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
454 | // we have the list -> add the new element |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
455 | if(webdav_plist_add(pool, &errlist->begin, &errlist->end, property)) { |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
456 | return 1; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
457 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
458 | return 0; |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
459 | } |
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
460 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
461 | static CxHashKey ms_property_key( |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
462 | CxAllocator *a, |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
463 | const xmlChar *href, |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
464 | const char *property_name) |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
465 | { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
466 | cxmutstr key_data = cx_strcat_a(a, 3, cx_str((const char*)href), (cxstring){ "\0", 1 }, cx_str(property_name)); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
467 | return cx_hash_key_bytes((unsigned char*)key_data.ptr, key_data.length); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
468 | } |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
469 | |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
470 | int msresponse_addproperty( |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
471 | WebdavResource *res, |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
472 | WebdavProperty *property, |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
473 | int status) |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
474 | { |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
475 | MSResponse *response = (MSResponse*)res; |
227
3c23855f7b46
remove nsdef from WebdavProperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
226
diff
changeset
|
476 | Session *sn = response->multistatus->sn; |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
477 | if(response->resource.isclosed) { |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
478 | log_ereport( |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
479 | LOG_WARN, |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
480 | "%s", |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
481 | "webdav: cannot add property to closed response tag"); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
482 | return 0; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
483 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
484 | |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
485 | // some WebdavProperty checks to make sure nothing explodes |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
486 | if(!property->namespace || !property->namespace->href) { |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
487 | // error: namespace is required |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
488 | log_ereport( |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
489 | LOG_FAILURE, |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
490 | "%s", |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
491 | "webdav: property '%s' has no namespace", |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
492 | property->name); |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
493 | return 1; |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
494 | } |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
495 | |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
496 | // check if the property was already added to the resource |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
497 | CxAllocator *a = pool_allocator(sn->pool); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
498 | CxHashKey key = ms_property_key(a, property->namespace->href, property->name); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
499 | if(cxMapGet(response->properties, key)) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
500 | cxFree(a, key.data.bytes); |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
501 | return 0; |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
502 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
503 | if(cxMapPut(response->properties, key, property)) { |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
504 | return 1; // OOM |
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
505 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
506 | cxFree(a, key.data.bytes); |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
507 | |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
508 | // list of namespace definitions for this property |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
509 | WebdavNSList *nsdef_begin = NULL; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
510 | WebdavNSList *nsdef_end = NULL; |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
511 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
512 | // add namespace of this property to the namespace map |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
513 | // the namespace map will be used for global namespace definitions |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
514 | if(property->namespace->prefix) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
515 | WSNamespace *ns = cxMapGet( |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
516 | response->multistatus->namespaces, |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
517 | cx_hash_key_str((const char*)property->namespace->prefix)); |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
518 | if(!ns) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
519 | // prefix is not in use -> we can add the namespace to the ns map |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
520 | int err = cxMapPut( |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
521 | response->multistatus->namespaces, |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
522 | cx_hash_key_str((const char*)property->namespace->prefix), |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
523 | property->namespace); |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
524 | if(err) { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
525 | return 1; // OOM |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
526 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
527 | } else if( |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
528 | strcmp((const char*)property->namespace->href, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
529 | (const char*)ns->href)) |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
530 | { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
531 | // global namespace != local namespace |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
532 | // therefore we need a namespace definition in this element |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
533 | |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
534 | // ns-prefix != property-prefix -> add ns to nsdef |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
535 | if(webdav_nslist_add( |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
536 | sn->pool, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
537 | &nsdef_begin, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
538 | &nsdef_end, |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
539 | property->namespace)) |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
540 | { |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
541 | return 1; // OOM |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
542 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
543 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
544 | } |
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
545 | |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
546 | if(response->multistatus->proppatch && response->errors) { |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
547 | // in a proppatch request all operations must succeed |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
548 | // if we have an error, the property update status code must be |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
549 | // 424 Failed Dependency |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
550 | status = 424; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
551 | } |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
552 | |
222
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
553 | // error properties will be added to a separate list |
5f05e56cb8e2
create namespace definition lists when properties are added to a multistatus response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
217
diff
changeset
|
554 | if(status != 200) { |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
555 | return msresponse_addproperror(response, property, status); |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
556 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
557 | |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
558 | // add all namespaces used by this property to the nsdef list |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
559 | WebdavNSList *nslist = NULL; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
560 | if(property->vtype == WS_VALUE_XML_NODE) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
561 | // iterate over xml tree and collect all namespaces |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
562 | int err = 0; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
563 | nslist = wsxml_get_required_namespaces( |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
564 | response->multistatus->sn->pool, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
565 | property->value.node, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
566 | &err); |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
567 | if(err) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
568 | return 1; // OOM |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
569 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
570 | } else if(property->vtype == WS_VALUE_XML_DATA) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
571 | // xml data contains a list of all used namespaces |
376
61d481d3c2e4
Add support for extended properties in pg propfind
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
349
diff
changeset
|
572 | nslist = property->value.data.namespaces; |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
573 | } // other value types don't contain xml namespaces |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
574 | |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
575 | while(nslist) { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
576 | // only add the namespace to the definitions list, if it isn't a |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
577 | // property namespace, because the prop ns is already added |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
578 | // to the element's def list or global definitions list |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
579 | if(strcmp( |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
580 | (const char*)nslist->namespace->prefix, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
581 | (const char*)property->namespace->prefix)) |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
582 | { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
583 | // ns-prefix != property-prefix -> add ns to nsdef |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
584 | if(webdav_nslist_add( |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
585 | sn->pool, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
586 | &nsdef_begin, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
587 | &nsdef_end, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
588 | nslist->namespace)) |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
589 | { |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
590 | return 1; // OOM |
231
4714468b9b7e
implement multistatus writer
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
230
diff
changeset
|
591 | } |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
592 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
593 | nslist = nslist->next; |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
594 | } |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
595 | |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
596 | // add property to the list |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
597 | if(oklist_add( |
227
3c23855f7b46
remove nsdef from WebdavProperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
226
diff
changeset
|
598 | sn->pool, |
3c23855f7b46
remove nsdef from WebdavProperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
226
diff
changeset
|
599 | &response->plist_begin, |
3c23855f7b46
remove nsdef from WebdavProperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
226
diff
changeset
|
600 | &response->plist_end, |
230
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
601 | property, |
ca50e1ebdc4d
readd namespace handling to msresponse_addproperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
229
diff
changeset
|
602 | nsdef_begin)) |
227
3c23855f7b46
remove nsdef from WebdavProperty
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
226
diff
changeset
|
603 | { |
211
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
604 | return 1; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
605 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
606 | return 0; |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
607 | } |
2160585200ac
add propfind/proppatch parser and first iteration of the new webdav api
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
608 | |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
609 | int msresponse_close(WebdavResource *res) { |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
610 | MSResponse *response = (MSResponse*)res; |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
611 | if(response->closing) { |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
612 | return 0; // close already in progress |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
613 | } |
252
5653a9626cc0
prepare webdav copy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
251
diff
changeset
|
614 | response->closing = TRUE; |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
615 | Multistatus *ms = response->multistatus; |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
616 | |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
617 | int ret = REQ_PROCEED; |
252
5653a9626cc0
prepare webdav copy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
251
diff
changeset
|
618 | |
5653a9626cc0
prepare webdav copy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
251
diff
changeset
|
619 | // PROPFIND: |
5653a9626cc0
prepare webdav copy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
251
diff
changeset
|
620 | // response_close will execute propfind_do of all remaining backends |
5653a9626cc0
prepare webdav copy
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
251
diff
changeset
|
621 | // after that we will have all available properties |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
622 | WebdavOperation *op = ms->response.op; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
623 | if(op->response_close(op, res)) { |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
624 | ret = REQ_ABORTED; |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
625 | } |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
626 | |
237
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
627 | // add missing properties with status code 404 |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
628 | CxAllocator *a = pool_allocator(ms->sn->pool); |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
629 | WebdavPList *pl = ms->response.op->reqprops; |
237
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
630 | while(pl) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
631 | CxHashKey key = ms_property_key(a, pl->property->namespace->href, pl->property->name); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
632 | if(!cxMapGet(response->properties, key)) { |
237
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
633 | // property was not added to this response |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
634 | if(ms->proppatch) { |
403
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
635 | if(msresponse_addproperty(res, pl->property, 424)) { |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
636 | ret = REQ_ABORTED; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
637 | break; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
638 | } |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
639 | } else { |
403
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
640 | if(msresponse_addproperty(res, pl->property, 404)) { |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
641 | ret = REQ_ABORTED; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
642 | break; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
643 | } |
237
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
644 | } |
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
645 | } |
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
646 | |
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
647 | pl = pl->next; |
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
648 | } |
ee1680ef1ef2
handle missing properties in multistatus.c
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
233
diff
changeset
|
649 | |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
650 | if(ms->proppatch && response->errors) { |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
651 | // a proppatch response must succeed entirely |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
652 | // if we have a single error prop, move all props with status 200 |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
653 | // to the error list |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
654 | PropertyOkList *elm = response->plist_begin; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
655 | PropertyOkList *nextelm; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
656 | while(elm) { |
403
0f678595d497
fix multistatus response creating namespace definitions twice in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
381
diff
changeset
|
657 | if(msresponse_addproperty(res, elm->property, 424)) { |
239
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
658 | return 1; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
659 | } |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
660 | nextelm = elm->next; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
661 | pool_free(response->multistatus->sn->pool, elm); |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
662 | elm = nextelm; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
663 | } |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
664 | response->plist_begin = NULL; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
665 | response->plist_end = NULL; |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
666 | } |
d5031c30022c
make multistatus response ready for proppatch requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
238
diff
changeset
|
667 | |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
668 | // we don't need the properties anymore |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
403
diff
changeset
|
669 | cxMapDestroy(response->properties); |
226
49adcbd7d473
msresponse_addproperty: add support for xmlNode property values and add check to make sure, properties are only added once
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
223
diff
changeset
|
670 | |
217
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
671 | response->resource.isclosed = TRUE; |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
672 | return ret; |
8ed14d76db42
add backend chaining
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
211
diff
changeset
|
673 | } |