aboutsummaryrefslogtreecommitdiff
path: root/src/jlib.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/jlib.erl')
-rw-r--r--src/jlib.erl72
1 files changed, 50 insertions, 22 deletions
diff --git a/src/jlib.erl b/src/jlib.erl
index 74369cf22..ac54c51a8 100644
--- a/src/jlib.erl
+++ b/src/jlib.erl
@@ -32,6 +32,7 @@
jid_replace_resource/2,
get_iq_namespace/1,
iq_query_info/1,
+ iq_query_or_response_info/1,
is_iq_request_type/1,
iq_to_xml/1,
parse_xdata_submit/1,
@@ -331,39 +332,66 @@ get_iq_namespace({xmlelement, Name, _Attrs, Els}) when Name == "iq" ->
get_iq_namespace(_) ->
"".
-iq_query_info({xmlelement, Name, Attrs, Els}) when Name == "iq" ->
+iq_query_info(El) ->
+ iq_info_internal(El, request).
+
+iq_query_or_response_info(El) ->
+ iq_info_internal(El, any).
+
+iq_info_internal({xmlelement, Name, Attrs, Els}, Filter) when Name == "iq" ->
+ %% Filter is either request or any. If it is request, any replies
+ %% are converted to the atom reply.
ID = xml:get_attr_s("id", Attrs),
Type = xml:get_attr_s("type", Attrs),
Lang = xml:get_attr_s("xml:lang", Attrs),
- Type1 = case Type of
- "set" -> set;
- "get" -> get;
- "result" -> reply;
- "error" -> reply;
- _ -> invalid
+ {Type1, Class} = case Type of
+ "set" -> {set, request};
+ "get" -> {get, request};
+ "result" -> {result, reply};
+ "error" -> {error, reply};
+ _ -> {invalid, invalid}
end,
if
- (Type1 /= invalid) and (Type1 /= reply) ->
- case xml:remove_cdata(Els) of
- [{xmlelement, Name2, Attrs2, Els2}] ->
- XMLNS = xml:get_attr_s("xmlns", Attrs2),
- if
- XMLNS /= "" ->
+ Type1 == invalid ->
+ invalid;
+ Class == request; Filter == any ->
+ %% The iq record is a bit strange. The sub_el field is an
+ %% XML tuple for requests, but a list of XML tuples for
+ %% responses.
+ FilteredEls = xml:remove_cdata(Els),
+ {XMLNS, SubEl} =
+ case {Class, FilteredEls} of
+ {request, [{xmlelement, _Name2, Attrs2, _Els2}]} ->
+ {xml:get_attr_s("xmlns", Attrs2),
+ hd(FilteredEls)};
+ {reply, _} ->
+ %% Find the namespace of the first non-error
+ %% element, if there is one.
+ NonErrorEls = [El ||
+ {xmlelement, SubName, _, _} = El
+ <- FilteredEls,
+ SubName /= "error"],
+ {case NonErrorEls of
+ [NonErrorEl] -> xml:get_tag_attr_s("xmlns", NonErrorEl);
+ _ -> invalid
+ end,
+ FilteredEls};
+ _ ->
+ {invalid, invalid}
+ end,
+ if XMLNS == "", Class == request ->
+ invalid;
+ true ->
#iq{id = ID,
type = Type1,
xmlns = XMLNS,
lang = Lang,
- sub_el = {xmlelement, Name2, Attrs2, Els2}};
- true ->
- invalid
+ sub_el = SubEl}
end;
- _ ->
- invalid
- end;
- true ->
- Type1
+ Class == reply, Filter /= any ->
+ reply
end;
-iq_query_info(_) ->
+iq_info_internal(_, _) ->
not_iq.
is_iq_request_type(set) -> true;