fluke/devops-service/sinatra/methods_with_headers.rb
Tim Lianov 03dc3d8d99 v3
2018-04-04 22:44:39 +03:00

133 lines
3.1 KiB
Ruby

require "sinatra/base"
require 'rack/accept_media_types'
require 'db/mongo/models/policy'
module Sinatra
class Base
class << self
@@policies = {}
# options:
# dependencies - array
def define_policy name, description, options={}
options[:description] = description
@@policies[name.to_sym] = Devops::Model::Policy.new(name, options)
end
def policies
@@policies
end
def get_with_headers path, opt={}, &block
before path do
check_headers :accept
protect!
end
get path, opt, &block
end
def post_with_headers path, opt={}, &block
route_with_headers "POST", path, opt, [:accept, :content_type], &block
end
def post_with_statistic path, opt={}, &block
post path, opt, &block
after path do
insert_statistic
end
end
def put_with_headers path, opt={}, &block
route_with_headers "PUT", path, opt, [:accept, :content_type], &block
end
def patch_with_headers path, opt={}, &block
route_with_headers "PATCH", path, opt, [:accept, :content_type], &block
end
def delete_with_headers path, opt={}, &block
route_with_headers "DELETE", path, opt, [:accept], &block
end
def route_with_headers method, path, opt={}, headers, &block
before path do
check_headers *headers
protect!
end
route(method, path, opt, &block)
after path do
insert_statistic
end
end
def multi_routes path, hash={}
before path do
if request.get? or request.delete?
check_headers :accept
else
check_headers :accept, :content_type
end
protect!
end
hash.each do |method, block|
route(method, path, {}, &block)
end
after path do
insert_statistic unless request.get?
end
end
def routes
@routes
end
def routes_list
routes.each do |verb, signature|
signature.each do |s|
puts "#{verb}\t#{s[0]}"
end
end
end
end
# Check request headers
def check_headers *headers
ha = (headers.empty? ? [:accept, :content_type] : headers)
ha.each do |h|
case h
when :accept, "accept"
accept_json
when :content_type, "content_type"
request_json
end
end
end
# Check Accept header
#
# Can client works with JSON?
def accept_json
types = request.accept_media_types
unless types.include?('application/json') or types.include?("*/*")
response.headers['Accept'] = 'application/json'
halt_response("Accept header should contains 'application/json' type", 406)
end
end
# Check Content-Type header
def request_json
halt_response("Content-Type should be 'application/json'", 415) if request.media_type.nil? or request.media_type != 'application/json'
end
end
end