You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ch...@apache.org on 2014/05/28 01:02:26 UTC
[1/3] chttpd commit: updated
refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed to
17268d7
Repository: couchdb-chttpd
Updated Branches:
refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed 6a74f9b99 -> 17268d7bb (forced update)
Add support for eventsource changes feeds
Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/b743d755
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/b743d755
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/b743d755
Branch: refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed
Commit: b743d7552b8596eb2f540c3d02bd87efa0423cad
Parents: 644ca97
Author: Russell Branca <ch...@apache.org>
Authored: Wed May 21 17:22:39 2014 -0700
Committer: Russell Branca <ch...@apache.org>
Committed: Tue May 27 16:01:57 2014 -0700
----------------------------------------------------------------------
src/chttpd_db.erl | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/b743d755/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 0c08dd9..969da64 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -72,7 +72,7 @@ handle_changes_req(#httpd{method='GET'}=Req, Db) ->
ChangesArgs)
end);
Feed ->
- % "longpoll" or "continuous"
+ % "longpoll" or "continuous" or "eventsource"
fabric:changes(Db, fun changes_callback/2, {Feed, Req}, ChangesArgs)
end;
handle_changes_req(#httpd{path_parts=[_,<<"_changes">>]}=Req, _Db) ->
@@ -91,6 +91,26 @@ changes_callback({stop, EndSeq0}, {"continuous", Resp}) ->
[?JSON_ENCODE({[{<<"last_seq">>, EndSeq}]}) | "\n"]),
chttpd:end_delayed_json_response(Resp1);
+% callbacks for eventsource feed (newline-delimited eventsource Objects)
+changes_callback(start, {"eventsource", Req}) ->
+ Headers = [
+ {"Content-Type", "text/event-stream"},
+ {"Cache-Control", "no-cache"}
+ ],
+ {ok, Resp} = chttpd:start_delayed_json_response(Req, 200, Headers),
+ {ok, {"eventsource", Resp}};
+changes_callback({change, {ChangeProp}=Change}, {"eventsource", Resp}) ->
+ Seq = proplists:get_value(seq, ChangeProp),
+ Chunk = [
+ "data: ", ?JSON_ENCODE(Change),
+ "\n", "id: ", ?JSON_ENCODE(Seq),
+ "\n\n"
+ ],
+ {ok, Resp1} = chttpd:send_delayed_chunk(Resp, [Chunk]),
+ {ok, {"eventsource", Resp1}};
+changes_callback({stop, _EndSeq}, {"eventsource", Resp}) ->
+ chttpd:end_delayed_json_response(Resp);
+
% callbacks for longpoll and normal (single JSON Object)
changes_callback(start, {"normal", {"Etag", Etag}, Req}) ->
FirstChunk = "{\"results\":[\n",
@@ -1188,13 +1208,15 @@ parse_doc_query(Req) ->
parse_changes_query(Req) ->
lists:foldl(fun({Key, Value}, Args) ->
- case {Key, Value} of
+ case {string:to_lower(Key), Value} of
{"feed", _} ->
Args#changes_args{feed=Value};
{"descending", "true"} ->
Args#changes_args{dir=rev};
{"since", _} ->
Args#changes_args{since=Value};
+ {"last-event-id", _} ->
+ Args#changes_args{since=Value};
{"limit", _} ->
Args#changes_args{limit=list_to_integer(Value)};
{"style", _} ->
[2/3] chttpd commit: updated
refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed to
17268d7
Posted by ch...@apache.org.
Send eventsource heartbeat event
Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/b6882d1f
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/b6882d1f
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/b6882d1f
Branch: refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed
Commit: b6882d1fa8fbc1eac1739f9ec92b77d5ae93259c
Parents: b743d75
Author: Russell Branca <ch...@apache.org>
Authored: Tue May 27 15:47:05 2014 -0700
Committer: Russell Branca <ch...@apache.org>
Committed: Tue May 27 16:02:01 2014 -0700
----------------------------------------------------------------------
src/chttpd_db.erl | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/b6882d1f/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 969da64..5c1c24d 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -106,7 +106,11 @@ changes_callback({change, {ChangeProp}=Change}, {"eventsource", Resp}) ->
"\n", "id: ", ?JSON_ENCODE(Seq),
"\n\n"
],
- {ok, Resp1} = chttpd:send_delayed_chunk(Resp, [Chunk]),
+ {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Chunk),
+ {ok, {"eventsource", Resp1}};
+changes_callback(timeout, {"eventsource", Resp}) ->
+ Chunk = "event: heartbeat\ndata: \n\n",
+ {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Chunk),
{ok, {"eventsource", Resp1}};
changes_callback({stop, _EndSeq}, {"eventsource", Resp}) ->
chttpd:end_delayed_json_response(Resp);
[3/3] chttpd commit: updated
refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed to
17268d7
Posted by ch...@apache.org.
Support Last-Event-ID header for eventsource changes feeds
Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/17268d7b
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/17268d7b
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/17268d7b
Branch: refs/heads/1843-feature-bigcouch-clustered-eventsource-changes-feed
Commit: 17268d7bb33bdb634a4f23a28e215a4dd0b76e04
Parents: b6882d1
Author: Russell Branca <ch...@apache.org>
Authored: Tue May 27 15:57:32 2014 -0700
Committer: Russell Branca <ch...@apache.org>
Committed: Tue May 27 16:02:04 2014 -0700
----------------------------------------------------------------------
src/chttpd_db.erl | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/17268d7b/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 5c1c24d..dada7d8 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -1211,7 +1211,7 @@ parse_doc_query(Req) ->
end, #doc_query_args{}, chttpd:qs(Req)).
parse_changes_query(Req) ->
- lists:foldl(fun({Key, Value}, Args) ->
+ ChangesArgs = lists:foldl(fun({Key, Value}, Args) ->
case {string:to_lower(Key), Value} of
{"feed", _} ->
Args#changes_args{feed=Value};
@@ -1240,7 +1240,21 @@ parse_changes_query(Req) ->
_Else -> % unknown key value pair, ignore.
Args
end
- end, #changes_args{}, couch_httpd:qs(Req)).
+ end, #changes_args{}, couch_httpd:qs(Req)),
+ %% if it's an EventSource request with a Last-event-ID header
+ %% that should override the `since` query string, since it's
+ %% probably the browser reconnecting.
+ case ChangesArgs#changes_args.feed of
+ "eventsource" ->
+ case couch_httpd:header_value(Req, "last-event-id") of
+ undefined ->
+ ChangesArgs;
+ Value ->
+ ChangesArgs#changes_args{since=list_to_integer(Value)}
+ end;
+ _ ->
+ ChangesArgs
+ end.
extract_header_rev(Req, ExplicitRev) when is_binary(ExplicitRev) or is_list(ExplicitRev)->
extract_header_rev(Req, couch_doc:parse_rev(ExplicitRev));