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 ->