aboutsummaryrefslogtreecommitdiff
path: root/portal/tcp
diff options
context:
space:
mode:
Diffstat (limited to 'portal/tcp')
-rw-r--r--portal/tcp/portal.ml26
1 files changed, 21 insertions, 5 deletions
diff --git a/portal/tcp/portal.ml b/portal/tcp/portal.ml
index 89adb2d..35930e4 100644
--- a/portal/tcp/portal.ml
+++ b/portal/tcp/portal.ml
@@ -86,9 +86,24 @@ let socket_to_stream (sock : socket) =
in match len with
| 0 -> Lwt.return_none
| len -> Lwt.return_some (Bytes.sub_string recv_bytes 0 len))
- and send_char c =
- (* This is gross, but it doesn't matter because TCP does buffering. *)
- let+ _ = Lwt_unix.write_string sock (Char.escaped c) 0 1 in ()
+ in
+ let buffer = Buffer.create 1024 in
+ let flush_buffer () =
+ let content = Buffer.to_bytes buffer in
+ Buffer.clear buffer;
+ let* _ =
+ try%lwt Lwt_unix.write sock content 0 (Bytes.length content)
+ with
+ | Unix.Unix_error (Unix.ECONNRESET, _, _)
+ | Unix.Unix_error (Unix.EPIPE, _, _) -> Lwt.return 0
+ | exn -> Lwt.fail exn
+ in Lwt.return_unit
+ in
+ let chomp c =
+ Buffer.add_char buffer c;
+ if Buffer.length buffer >= 1024 || c = '>'
+ then flush_buffer ()
+ else Lwt.return_unit
and xml_stream, xml_push = Lwt_stream.create ()
in let push = function
| None -> xml_push None
@@ -101,8 +116,9 @@ let socket_to_stream (sock : socket) =
|> parse_xml ~report
|> signals
in Lwt.async (fun () ->
- let* _ = lwt_stream xml_stream |> Markup_lwt.write_xml |> iter send_char
- in Lwt_unix.close sock);
+ let* _ = lwt_stream xml_stream |> Markup_lwt.write_xml |> iter chomp
+ in let* _ = flush_buffer ()
+ in Lwt_unix.close sock);
(stream, push)
(** [connect domain] is a Portal.t communicating with the XMPP server located at