fix vary header handling to deal with capitalized, test the path

directly in store
This commit is contained in:
HoneyryderChuck 2022-05-25 23:15:30 +01:00
parent b6819de30c
commit 38152e8dee
3 changed files with 62 additions and 18 deletions

View File

@ -37,6 +37,7 @@ module HTTPX::Plugins
return unless request.headers.same_headers?(original_request.headers)
else
return unless vary.split(/ *, */).all? do |cache_field|
cache_field.downcase!
!original_request.headers.key?(cache_field) || request.headers[cache_field] == original_request.headers[cache_field]
end
end

View File

@ -0,0 +1,61 @@
# frozen_string_literal: true
require_relative "test_helper"
require "httpx/plugins/response_cache/store"
class ResponseCacheStoreTest < Minitest::Test
include HTTPX
def test_store_cache
request = Request.new(:get, "http://example.com/")
response = cached_response(request)
assert store.lookup(request.uri) == response
assert store.cached?(request.uri)
request2 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain" })
assert store.lookup(request2.uri) == response
end
def test_prepare_vary
request = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain" })
cached_response(request, { "vary" => "Accept" })
request2 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/html" })
store.prepare(request2)
assert !request2.headers.key?("if-none-match")
request3 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain" })
store.prepare(request3)
assert request3.headers.key?("if-none-match")
request4 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain", "user-agent" => "Linux Bowser" })
store.prepare(request4)
assert request4.headers.key?("if-none-match")
end
def test_prepare_vary_asterisk
request = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain" })
cached_response(request, { "vary" => "*" })
request2 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/html" })
store.prepare(request2)
assert !request2.headers.key?("if-none-match")
request3 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain" })
store.prepare(request3)
assert request3.headers.key?("if-none-match")
request4 = Request.new(:get, "http://example.com/", headers: { "accept" => "text/plain", "user-agent" => "Linux Bowser" })
store.prepare(request4)
assert !request4.headers.key?("if-none-match")
end
private
def store
@store ||= Plugins::ResponseCache::Store.new
end
def cached_response(request, extra_headers = {})
response = Response.new(request, 200, "2.0", { "etag" => "ETAG" }.merge(extra_headers))
store.cache(request.uri, response)
response
end
end

View File

@ -42,24 +42,6 @@ module Requests
# assert expired.body != uncached.body
end
def test_plugin_response_cache_vary
return unless origin.start_with?("https://")
vary_uri = "https://github.com/HoneyryderChuck/httpx"
HTTPX.plugin(:response_cache).wrap do |cache_client|
uncached = cache_client.get(vary_uri)
verify_status(uncached, 200)
cached = cache_client.get(vary_uri)
verify_status(cached, 304)
assert uncached.body == cached.body
uncached = cache_client.get(vary_uri, headers: { "accept" => "text/plain" })
verify_status(uncached, 200)
end
end
end
end
end