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