/
yaws_dav.erl
80 lines (62 loc) · 2.44 KB
/
yaws_dav.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
-module(yaws_dav).
%%%-------------------------------------------------------------------
%%% Created : 15 May 2005 by Tobbet <tobbe@tornkvist.org>
%%% Desc. : WebDav specifics.
%%%-------------------------------------------------------------------
-export([parse_xml/1, xml_expand/1, xml_expand/2]).
-include("yaws_dav.hrl").
-include("xmerl.hrl").
-define(elog(X,Y), error_logger:info_msg("*elog ~p:~p: " X,
[?MODULE, ?LINE | Y])).
xml_expand(L) ->
xml_expand(L, "utf-8").
xml_expand(L, Cset) ->
Prolog = ["<?xml version=\"1.0\" encoding=\""++Cset++"\" ?>"],
xmerl:export_simple(L,xmerl_xml,[{prolog,Prolog}]).
parse_xml([]) -> [];
parse_xml(L) when list(L) ->
case catch xmerl_scan:string(L, [{namespace_conformant, true}]) of
{X,_} when record(X, xmlElement) ->
parse_dav(X);
_Z ->
?elog("to_xml: error ~p~n", [_Z]),
{error, "xml scanner failed"}
end.
-define(CONTENT(X), X#xmlElement.content).
-define(IS_PROPFIND(X), #xmlElement{expanded_name = {'DAV:',propfind}} = X).
-define(IS_PROP(X), #xmlElement{expanded_name = {'DAV:',prop}} = X).
-define(IS_NAME(X), #xmlElement{expanded_name = {'DAV:',name}} = X).
-define(IS_PARENTNAME(X), #xmlElement{expanded_name = {'DAV:',parentname}} = X).
-define(IS_HREF(X), #xmlElement{expanded_name = {'DAV:',href}} = X).
-define(IS_ISHIDDEN(X), #xmlElement{expanded_name = {'DAV:',ishidden}} = X).
-define(IS_ISCOLLECTION(X), #xmlElement{expanded_name = {'DAV:',iscollection}} = X).
parse_dav(?IS_PROPFIND(X)) ->
parse_propfind(?CONTENT(X), #propfind{});
parse_dav(X) ->
%%?elog("parse_dav: GOT ~p~n", [X]),
{error, "parse_dav"}. % FIXME , webdav (tobbe)
parse_propfind([?IS_PROP(H)|T], R) ->
Prop = parse_prop(?CONTENT(H)),
parse_propfind(T, R#propfind{prop = Prop});
parse_propfind([H|T], R) ->
%%?elog("parse_propfind: ~p~n",[H]),
parse_propfind(T, R);
parse_propfind([], R) ->
R.
parse_prop(L) ->
parse_prop(L, []).
parse_prop([?IS_NAME(_H)|T], L) ->
parse_prop(T, [name | L]);
parse_prop([?IS_PARENTNAME(_H)|T], L) ->
parse_prop(T, [parentname | L]);
parse_prop([?IS_HREF(_H)|T], L) ->
parse_prop(T, [href | L]);
parse_prop([?IS_ISHIDDEN(_H)|T], L) ->
parse_prop(T, [ishidden | L]);
parse_prop([?IS_ISCOLLECTION(_H)|T], L) ->
parse_prop(T, [iscollection | L]);
parse_prop([H|T], L) ->
%%?elog("parse_propfind: ~p~n",[H]), % FIXME , webdav
parse_prop(T, L);
parse_prop([], L) ->
lists:reverse(L). % preserve order!