c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | #include <roxen.h>
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | #ifdef DAV_DEBUG
#define DAV_WERROR(X...) werror(X)
#else /* !DAV_DEBUG */
#define DAV_WERROR(X...)
#endif /* DAV_DEBUG */
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | string path;
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | |
string abs_path;
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
RequestID id;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | static void create(string path, string abs_path, RequestID id)
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | {
global::path = path;
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | global::abs_path = abs_path;
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | global::id = id;
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | |
ASSERT_IF_DEBUG(has_prefix(abs_path, "/") && has_suffix(abs_path, path));
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | }
|
7c7636 | 2004-05-06 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
7c8387 | 2004-04-28 | Martin Stjernholm | |
Stat get_stat();
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
mapping(string:string) get_response_headers();
private constant all_properties_common = (<
"DAV:getcontentlength",
"DAV:getcontenttype",
"DAV:displayname",
"DAV:resourcetype",
"DAV:supportedlock",
"DAV:iscollection",
"DAV:isfolder",
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | | "DAV:lockdiscovery",
"DAV:supportedlock",
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | >);
private constant all_properties_file = all_properties_common + (<
"http://apache.org/dav/props/executable",
>);
private constant all_properties_dir = all_properties_common;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | multiset(string) query_all_properties()
{
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | multiset(string) props =
|
7c8387 | 2004-04-28 | Martin Stjernholm | | (get_stat()->isreg ? all_properties_file : all_properties_dir) + (<>);
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
mapping(string:string) hdrs = get_response_headers();
if (hdrs["Content-Language"]) props["DAV:getcontentlanguage"] = 1;
if (hdrs->ETag) props["DAV:getetag"] = 1;
if (hdrs["Last-Modified"]) props["DAV:getlastmodified"] = 1;
return props;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | }
string|array(Parser.XML.Tree.Node)|mapping(string:mixed)
query_property(string prop_name)
{
switch(prop_name) {
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | #if 0
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:creationdate":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | Stdio.Stat stat = get_stat();
int t = stat->ctime;
if (t > stat->atime) t = stat->atime;
if (t > stat->mtime) t = stat->mtime;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return Roxen.iso8601_date_time(t);
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | #endif
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:displayname":
|
a7ab61 | 2004-03-24 | Anders Johansson | | if ((path == "") || (path == "/")) return "/";
if (path[-1] == '/') return basename(path[..sizeof(path)-2]);
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return basename(path);
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:getcontentlanguage":
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return get_response_headers()["Content-Language"];
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:getcontentlength":
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return get_response_headers()["Content-Length"];
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:getcontenttype":
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return get_response_headers()["Content-Type"];
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:getetag":
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return get_response_headers()->ETag;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:getlastmodified":
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return get_response_headers()["Last-Modified"];
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | | case "DAV:lockdiscovery":
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | return indices(id->conf->find_locks(abs_path, 0, 0, id))->get_xml();
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:resourcetype":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | if (get_stat()->isdir) {
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return ({
Parser.XML.Tree.ElementNode("DAV:collection", ([])),
});
}
return 0;
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:supportedlock":
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | | {
array(Parser.XML.Tree.Node) res = ({
Parser.XML.Tree.ElementNode("DAV:lockentry", ([])),
Parser.XML.Tree.ElementNode("DAV:lockentry", ([])),
});
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | res[0]->add_child(Parser.XML.Tree.ElementNode("DAV:lockscope", ([])))->
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | | add_child(Parser.XML.Tree.ElementNode("DAV:exclusive", ([])));
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | res[1]->add_child(Parser.XML.Tree.ElementNode("DAV:lockscope", ([])))->
add_child(Parser.XML.Tree.ElementNode("DAV:shared", ([])));
res[0]->add_child(Parser.XML.Tree.ElementNode("DAV:locktype", ([])))->
add_child(Parser.XML.Tree.ElementNode("DAV:write", ([])));
res[1]->add_child(Parser.XML.Tree.ElementNode("DAV:locktype", ([])))->
|
b6f75a | 2004-05-03 | Henrik Grubbström (Grubba) | | add_child(Parser.XML.Tree.ElementNode("DAV:write", ([])));
return res;
}
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "http://apache.org/dav/props/executable":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | Stdio.Stat stat = get_stat();
if (stat->isreg) {
if (stat->mode & 0111) return "T";
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return "F";
}
break;
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | #if 0
case "DAV:defaultdocument":
return "";
case "DAV:ishidden":
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return "0";
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
case "DAV:isstructureddocument":
return "0";
#endif
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:iscollection":
case "DAV:isfolder":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | if (get_stat()->isdir) {
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return "1";
}
return "0";
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | #if 0
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | case "DAV:isreadonly":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | if (!(get_stat()->mode & 0222)) {
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | return "1";
}
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return "0";
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | case "DAV:isroot":
if (path == "") return "1";
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return "0";
case "DAV:lastaccessed":
|
7c8387 | 2004-04-28 | Martin Stjernholm | | return Roxen.iso8601_date_time(get_stat()->atime);
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:href":
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | return id->url_base() + abs_path[1..];
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:contentclass":
return "";
case "DAV:parentname":
return "";
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | | case "DAV:name":
|
92c5ae | 2004-05-06 | Henrik Grubbström (Grubba) | | return abs_path;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | default:
break;
}
|
c0b5b4 | 2004-04-20 | Martin Stjernholm | |
DAV_WERROR("query_property(): Unimplemented property:%O\n", prop_name);
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
return Roxen.http_status (Protocols.HTTP.HTTP_NOT_FOUND,
"No such property.");
}
mapping(string:mixed) start()
{
return 0;
}
void unroll()
{
}
void commit()
{
}
mapping(string:mixed) set_property(string prop_name,
string|array(Parser.XML.Tree.Node) value)
{
switch(prop_name) {
case "http://apache.org/dav/props/executable":
case "DAV:displayname":
case "DAV:getcontentlength":
case "DAV:getcontenttype":
case "DAV:getlastmodified":
return Roxen.http_status (Protocols.HTTP.HTTP_CONFLICT,
"Attempt to set read-only property.");
}
return set_dead_property(prop_name, value);
}
mapping(string:mixed) set_dead_property(string prop_name,
array(Parser.XML.Tree.Node) value)
{
return Roxen.http_status (Protocols.HTTP.HTTP_METHOD_INVALID,
"Setting of dead properties is not supported.");
}
mapping(string:mixed) remove_property(string prop_name)
{
switch(prop_name) {
case "http://apache.org/dav/props/executable":
case "DAV:displayname":
case "DAV:getcontentlength":
case "DAV:getcontenttype":
case "DAV:getlastmodified":
return Roxen.http_status (Protocols.HTTP.HTTP_CONFLICT,
"Attempt to remove a read-only property.");
}
return 0;
}
|
492d04 | 2004-05-05 | Martin Stjernholm | |
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | |
mapping(string:mixed) find_properties(string mode,
|
492d04 | 2004-05-05 | Martin Stjernholm | | MultiStatus.Prefixed result,
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | multiset(string)|void filt)
{
switch(mode) {
case "DAV:propname":
|
c53719 | 2004-04-29 | Martin Stjernholm | | filt = query_all_properties();
foreach(filt; string prop_name;) {
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | result->add_property(path, prop_name, "");
}
|
c53719 | 2004-04-29 | Martin Stjernholm | | break;
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | case "DAV:allprop":
if (filt) {
filt |= query_all_properties();
} else {
filt = query_all_properties();
}
case "DAV:prop":
|
c53719 | 2004-04-29 | Martin Stjernholm | | foreach(filt; string prop_name;) {
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | result->add_property(path, prop_name,
query_property(prop_name));
}
|
c53719 | 2004-04-29 | Martin Stjernholm | | break;
default:
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return 0;
}
|
c53719 | 2004-04-29 | Martin Stjernholm | |
if (filt["http://apache.org/dav/props/executable"])
result->add_namespace ("http://apache.org/dav/props/");
|
5811da | 2004-03-16 | Henrik Grubbström (Grubba) | | return 0;
}
|