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 2019/03/06 15:01:44 UTC
[couchdb] 01/01: Ignore weak ETag part
This is an automated email from the ASF dual-hosted git repository.
rnewson pushed a commit to branch weak-etag-comparison
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit f95a539508062143c4dd194ceda5a81a8344a126
Author: Robert Newson <rn...@apache.org>
AuthorDate: Wed Mar 6 14:58:23 2019 +0000
Ignore weak ETag part
Some load balancer configurations (HAproxy with compression enabled is
the motivating example) will add W/ to our response ETags if they
modify the response before sending it to the client.
as per rfc7232 section 3.2;
"A recipient MUST use the weak comparison function when comparing
entity-tags for If-None-Match (Section 2.3.2), since weak entity-tags
can be used for cache validation even if there have been changes to
the representation data."
This change improves our ETag checking toward RFC compliance.
---
src/chttpd/src/chttpd.erl | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl
index ac371a2..1e1d638 100644
--- a/src/chttpd/src/chttpd.erl
+++ b/src/chttpd/src/chttpd.erl
@@ -693,10 +693,16 @@ etag_match(Req, CurrentEtag) when is_binary(CurrentEtag) ->
etag_match(Req, binary_to_list(CurrentEtag));
etag_match(Req, CurrentEtag) ->
- EtagsToMatch = string:tokens(
+ EtagsToMatch0 = string:tokens(
chttpd:header_value(Req, "If-None-Match", ""), ", "),
+ EtagsToMatch = lists:map(fun strip_weak_prefix/1, EtagsToMatch0),
lists:member(CurrentEtag, EtagsToMatch).
+strip_weak_prefix([$W, $/ | Etag]) ->
+ Etag;
+strip_weak_prefix(Etag) ->
+ Etag.
+
etag_respond(Req, CurrentEtag, RespFun) ->
case etag_match(Req, CurrentEtag) of
true ->