Allow for weak ETAGs with leading quote

The remoteStorage client currently surrounds all ETAGs with quotes, so
instead of W\"etag" it looks like "W\"etag".
This commit is contained in:
Garret Alfert 2018-01-03 22:06:03 +01:00
parent 91e687d318
commit 24ae9ad893
2 changed files with 20 additions and 4 deletions

View File

@ -52,7 +52,7 @@ module RemoteStorage
set_response_headers(res) set_response_headers(res)
none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").gsub(/^W\//, "").split(",").map(&:strip) none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").gsub(/^"?W\//, "").split(",").map(&:strip)
server.halt 304 if none_match.include? %Q("#{res.headers[:etag]}") server.halt 304 if none_match.include? %Q("#{res.headers[:etag]}")
return res.body return res.body
@ -71,7 +71,7 @@ module RemoteStorage
server.headers["Content-Type"] = "application/ld+json" server.headers["Content-Type"] = "application/ld+json"
none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").gsub(/^W\//, "").split(",").map(&:strip) none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").gsub(/^"?W\//, "").split(",").map(&:strip)
if etag if etag
server.halt 304 if none_match.include? %Q("#{etag}") server.halt 304 if none_match.include? %Q("#{etag}")
@ -139,7 +139,7 @@ module RemoteStorage
url = url_for_key(user, directory, key) url = url_for_key(user, directory, key)
if required_match = server.env["HTTP_IF_MATCH"] if required_match = server.env["HTTP_IF_MATCH"]
unless required_match.gsub(/^W\//, "") == %Q("#{existing_metadata["e"]}") unless required_match.gsub(/^"?W\//, "") == %Q("#{existing_metadata["e"]}")
server.halt 412, "Precondition Failed" server.halt 412, "Precondition Failed"
end end
end end
@ -187,7 +187,7 @@ module RemoteStorage
existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}" existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}"
if required_match = server.env["HTTP_IF_MATCH"] if required_match = server.env["HTTP_IF_MATCH"]
unless required_match.gsub(/^W\//, "") == %Q("#{existing_metadata["e"]}") unless required_match.gsub(/^"?W\//, "") == %Q("#{existing_metadata["e"]}")
server.halt 412, "Precondition Failed" server.halt 412, "Precondition Failed"
end end
end end

View File

@ -265,6 +265,22 @@ describe "App" do
last_response.headers["Etag"].must_equal "\"newetag\"" last_response.headers["Etag"].must_equal "\"newetag\""
end end
it "allows the request if the header contains a weak ETAG with leading quote matching the current ETag" do
header "If-Match", "\"W/\"oldetag\""
put_stub = OpenStruct.new(headers: {
etag: "newetag",
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
})
RestClient.stub :put, put_stub do
put "/phil/food/aguacate", "aye"
end
last_response.status.must_equal 200
last_response.headers["Etag"].must_equal "\"newetag\""
end
it "fails the request if the header does not match the current ETag" do it "fails the request if the header does not match the current ETag" do
header "If-Match", "someotheretag" header "If-Match", "someotheretag"