Support Last-Event-ID header for eventsource changes feeds
COUCHDB-1852
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index e84bb15..6ffe9e4 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -1213,7 +1213,7 @@
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};
@@ -1242,7 +1242,21 @@
_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));