From e9b116b5b08085e7d7d476d7afda23d925bd3926 Mon Sep 17 00:00:00 2001 From: htwroclau Date: Wed, 25 Aug 2021 22:55:33 +0900 Subject: [PATCH] Don't validate response for status 304(Not Modified) --- lib/committee/middleware/response_validation.rb | 11 ++++++++++- .../hyper_schema/response_validator.rb | 2 +- .../middleware/response_validation_open_api_3_test.rb | 6 ++++++ test/middleware/response_validation_test.rb | 6 ++++++ .../hyper_schema/response_validator_test.rb | 10 ++++++++++ .../open_api_3/response_validator_test.rb | 5 +++++ 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/committee/middleware/response_validation.rb b/lib/committee/middleware/response_validation.rb index 2ffa7491..c155d1f4 100644 --- a/lib/committee/middleware/response_validation.rb +++ b/lib/committee/middleware/response_validation.rb @@ -38,7 +38,16 @@ def handle(request) class << self def validate?(status, validate_success_only) - status != 204 && (!validate_success_only || (200...300).include?(status)) + case status + when 204 + false + when 200..299 + true + when 304 + false + else + !validate_success_only + end end end diff --git a/lib/committee/schema_validator/hyper_schema/response_validator.rb b/lib/committee/schema_validator/hyper_schema/response_validator.rb index dc64ba79..c79eb3dc 100644 --- a/lib/committee/schema_validator/hyper_schema/response_validator.rb +++ b/lib/committee/schema_validator/hyper_schema/response_validator.rb @@ -14,7 +14,7 @@ def initialize(link, options = {}) end def call(status, headers, data) - unless status == 204 # 204 No Content + unless [204, 304].include?(status) # 204 No Content or 304 Not Modified response = Rack::Response.new(data, status, headers) check_content_type!(response) end diff --git a/test/middleware/response_validation_open_api_3_test.rb b/test/middleware/response_validation_open_api_3_test.rb index 896ce1a7..27c03c88 100644 --- a/test/middleware/response_validation_open_api_3_test.rb +++ b/test/middleware/response_validation_open_api_3_test.rb @@ -64,6 +64,12 @@ def app assert_equal 204, last_response.status end + it "passes through a 304 (not modified) response" do + @app = new_response_rack("", {}, {schema: open_api_3_schema}, {status: 304}) + post "/validate" + assert_equal 304, last_response.status + end + it "passes through a valid response with prefix" do @app = new_response_rack(JSON.generate(CHARACTERS_RESPONSE), {}, schema: open_api_3_schema, prefix: "/v1") get "/v1/characters" diff --git a/test/middleware/response_validation_test.rb b/test/middleware/response_validation_test.rb index eb460ff1..385bbc9d 100644 --- a/test/middleware/response_validation_test.rb +++ b/test/middleware/response_validation_test.rb @@ -85,6 +85,12 @@ def app assert_equal 204, last_response.status end + it "passes through a 304 (not modified) response" do + @app = new_rack_app("", {}, app_status: 304, schema: hyper_schema) + get "/apps" + assert_equal 304, last_response.status + end + it "skip validation when 4xx" do @app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, validate_success_only: true, app_status: 400) get "/apps" diff --git a/test/schema_validator/hyper_schema/response_validator_test.rb b/test/schema_validator/hyper_schema/response_validator_test.rb index bfd67fb3..dee312b7 100644 --- a/test/schema_validator/hyper_schema/response_validator_test.rb +++ b/test/schema_validator/hyper_schema/response_validator_test.rb @@ -38,6 +38,11 @@ call end + it "passes through a 304 Not Modified response" do + @status, @headers, @data = 304, {}, nil + call + end + it "passes through a valid list response for for rel instances links" do @link = @list_link @@ -91,6 +96,11 @@ call end + it "allows no Content-Type for 304 Not Modified" do + @status, @headers = 304, {} + call + end + it "raises errors generated by json_schema" do @data.merge!("name" => "%@!") e = assert_raises(Committee::InvalidResponse) { call } diff --git a/test/schema_validator/open_api_3/response_validator_test.rb b/test/schema_validator/open_api_3/response_validator_test.rb index 16591138..35ab1ca1 100644 --- a/test/schema_validator/open_api_3/response_validator_test.rb +++ b/test/schema_validator/open_api_3/response_validator_test.rb @@ -67,6 +67,11 @@ call_response_validator end + it "passes through a 304 Not Modified response" do + @status, @headers, @data = 304, {}, nil + call_response_validator + end + private def call_response_validator(strict = false)