class OpenapiFirst::ResponseValidation
Public Class Methods
new(app)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 12 def initialize(app) @app = app end
Public Instance Methods
call(env)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 16 def call(env) operation = env[OPERATION] return @app.call(env) unless operation response = @app.call(env) validate(response, operation) response end
validate(response, operation)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 25 def validate(response, operation) status, headers, body = response.to_a return validate_status_only(operation, status) if status == 204 content_type = headers[Rack::CONTENT_TYPE] response_schema = operation.response_schema_for(status, content_type) validate_response_body(response_schema, body) if response_schema end
Private Instance Methods
error_message_for(error)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 57 def error_message_for(error) err = ValidationFormat.error_details(error) [err[:title], error['data_pointer'], err[:detail]].compact.join(' ') end
load_json(string)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 51 def load_json(string) MultiJson.load(string) rescue MultiJson::ParseError string end
validate_response_body(schema, response)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 40 def validate_response_body(schema, response) full_body = +'' response.each { |chunk| full_body << chunk } data = full_body.empty? ? {} : load_json(full_body) errors = schema.validate(data) errors = errors.to_a.map! do |error| error_message_for(error) end raise ResponseBodyInvalidError, errors.join(', ') if errors.any? end
validate_status_only(operation, status)
click to toggle source
# File lib/openapi_first/response_validation.rb, line 36 def validate_status_only(operation, status) operation.response_for(status) end