You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2023/06/26 20:31:09 UTC
[couchdb] 02/02: support Websocket protocol for continuous response
This is an automated email from the ASF dual-hosted git repository.
rnewson pushed a commit to branch changes-websocket
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 63df98f8386db02137aed5a3e07394b6500fa971
Author: Robert Newson <rn...@apache.org>
AuthorDate: Mon Jun 26 21:29:08 2023 +0100
support Websocket protocol for continuous response
I currently send a data frame as the heartbeat but we should
tweak mochiweb_websocket so we can send pong messages which looks
like this;
diff --git a/src/mochiweb_websocket.erl b/src/mochiweb_websocket.erl
index 22ef924..396db82 100644
--- a/src/mochiweb_websocket.erl
+++ b/src/mochiweb_websocket.erl
@@ -74,6 +74,9 @@ call_body({M, F}, Payload, State, ReplyChannel) ->
call_body(Body, Payload, State, ReplyChannel) ->
Body(Payload, State, ReplyChannel).
+send(Socket, pong, hybi) ->
+ Payload = <<1:1, 0:3, 10:4, 1:4, 0:8>>,
+ mochiweb_socket:send(Socket, Payload);
send(Socket, Payload, hybi) ->
Prefix = <<1:1, 0:3, 1:4,
(payload_length(iolist_size(Payload)))/binary>>,
and then change;
ReplyChannel("\n"),
to
ReplyChannel(pong),
---
src/chttpd/src/chttpd_db.erl | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index 791ee86f3..05ca6d95a 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -166,7 +166,7 @@ handle_changes_req1(#httpd{} = Req, Db) ->
% websocket goop
changes_callback(start, #cacc{feed = continuous, websocket = true} = Acc) ->
{ReentryWs, ReplyChannel} = mochiweb_websocket:upgrade_connection(
- Acc#cacc.mochi, fun client_ws_loop/3),
+ Acc#cacc.mochi#httpd.mochi_req, fun client_ws_loop/3),
{ok, Acc#cacc{mochi = undefined, websocket = {ws, ReentryWs, ReplyChannel}}};
changes_callback({change, Change}, #cacc{websocket = {ws, _ReentryWs, ReplyChannel}} = Acc) ->
chttpd_stats:incr_rows(),
@@ -175,6 +175,8 @@ changes_callback({change, Change}, #cacc{websocket = {ws, _ReentryWs, ReplyChann
changes_callback(timeout, #cacc{websocket = {ws, _ReentryWs, ReplyChannel}} = Acc) ->
ReplyChannel("\n"),
{ok, Acc};
+changes_callback(waiting_for_updates, #cacc{websocket = {ws, _ReentryWs, ReplyChannel}} = Acc) ->
+ {ok, Acc};
changes_callback({stop, EndSeq, Pending}, #cacc{websocket = {ws, _ReentryWs, ReplyChannel}} = Acc) ->
Row =
{[
@@ -182,7 +184,7 @@ changes_callback({stop, EndSeq, Pending}, #cacc{websocket = {ws, _ReentryWs, Rep
{<<"pending">>, Pending}
]},
ReplyChannel(?JSON_ENCODE(Row)),
- {stop, Acc};
+ {ok, Acc};
% callbacks for continuous feed (newline-delimited JSON Objects)
changes_callback(start, #cacc{feed = continuous} = Acc) ->