aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sasl.ml4
-rw-r--r--lib/stream.ml21
-rw-r--r--lib/xml.ml19
3 files changed, 21 insertions, 23 deletions
diff --git a/lib/sasl.ml b/lib/sasl.ml
index 4404f74..ff6436a 100644
--- a/lib/sasl.ml
+++ b/lib/sasl.ml
@@ -53,7 +53,7 @@ let send_auth_stanza (stream, push) localpart pass mechanism =
`Text [gen_auth mechanism];
`End_element]
in Some (Markup.of_list stanza_list) |> push;
- try get stream >|= parse_sasl_response
+ try Xml.get stream >|= parse_sasl_response
with exn -> Lwt.fail exn
let authenticate (portal : Portal.t) ({jid; password; preferred_mechanisms} : auth_config) =
@@ -63,7 +63,7 @@ let authenticate (portal : Portal.t) ({jid; password; preferred_mechanisms} : au
| [localpart; _domain] -> localpart
| _ -> failwith "Invalid JID"
in
- let* {sasl_mechanisms; _} = Stream.get (fst portal) >|= Stream.parse_features
+ let* {sasl_mechanisms; _} = Xml.get (fst portal) >|= Stream.parse_features
in let preferred, not_preferred =
List.partition (fun f -> List.exists ((=) f) preferred_mechanisms) sasl_mechanisms
in
diff --git a/lib/stream.ml b/lib/stream.ml
index cc15c4b..83587cd 100644
--- a/lib/stream.ml
+++ b/lib/stream.ml
@@ -1,6 +1,3 @@
-open Lwt.Syntax
-open Markup
-
exception ClosedStream
type auth_mechanism =
@@ -17,24 +14,6 @@ type stream_features = {
unknown_features : Xml.element list;
}
-(** [next stream] is a promise containing a full stanza of the fragments of
- [stream]. *)
-let next (stream : (signal, async) stream) : (signal, sync) stream Lwt.t =
- let traverse_stanza depth fragment =
- let depth = match fragment with
- | `Start_element _ -> depth + 1
- | `End_element -> depth - 1
- | _ -> depth
- in ([fragment], if depth = 0 then None else Some depth)
- in transform traverse_stanza 0 stream |> Markup_lwt.load
-
-(** [get stream] is a promise containing a single Xml element of [stream]. *)
-let get (stream : (signal, async) stream) : Xml.element Lwt.t =
- let* signal = next stream
- in match Xml.tree signal with
- | Some xml -> Lwt.return xml
- | None -> Lwt.fail (Xml.InvalidStanza (signal |> write_xml |> to_string))
-
(** [parse_features el] is a [stream_features] record with all the features of the
[<stream:features>] stanza contained in [el]. *)
let parse_features (el : Xml.element) : stream_features =
diff --git a/lib/xml.ml b/lib/xml.ml
index 99a388f..25332a5 100644
--- a/lib/xml.ml
+++ b/lib/xml.ml
@@ -1,3 +1,4 @@
+open Lwt.Syntax
open Markup
exception InvalidStanza of string
@@ -56,3 +57,21 @@ let element_to_string ?(indent = 2) (el : element) =
|> tab)
^ "\n</" ^ local_name ^ ">"
in element_to_string "" el |> String.trim
+
+(** [next stream] is a promise containing a full stanza of the fragments of
+ [stream]. *)
+let next (stream : (signal, async) stream) : (signal, sync) stream Lwt.t =
+ let traverse_stanza depth fragment =
+ let depth = match fragment with
+ | `Start_element _ -> depth + 1
+ | `End_element -> depth - 1
+ | _ -> depth
+ in ([fragment], if depth = 0 then None else Some depth)
+ in transform traverse_stanza 0 stream |> Markup_lwt.load
+
+(** [get stream] is a promise containing a single Xml element of [stream]. *)
+let get (stream : (signal, async) stream) : element Lwt.t =
+ let* signal = next stream
+ in match tree signal with
+ | Some xml -> Lwt.return xml
+ | None -> Lwt.fail (InvalidStanza (signal |> write_xml |> to_string))