class Rack::Cors
Constants
- ENV_KEY
- ORIGIN_HEADER_KEY
- PATH_INFO_HEADER_KEY
- VERSION
Public Class Methods
new(app, opts={}, &block)
click to toggle source
# File lib/rack/cors.rb, line 10 def initialize(app, opts={}, &block) @app = app @debug_mode = !!opts[:debug] if logger = opts[:logger] if logger.respond_to? :call @logger_proc = opts[:logger] else @logger = logger end end if block_given? if block.arity == 1 block.call(self) else instance_eval(&block) end end end
Public Instance Methods
allow(&block)
click to toggle source
# File lib/rack/cors.rb, line 35 def allow(&block) all_resources << (resources = Resources.new) if block.arity == 1 block.call(resources) else resources.instance_eval(&block) end end
call(env)
click to toggle source
# File lib/rack/cors.rb, line 45 def call(env) env[ORIGIN_HEADER_KEY] ||= env['HTTP_X_ORIGIN'] add_headers = nil if env[ORIGIN_HEADER_KEY] debug(env) do [ 'Incoming Headers:', " Origin: #{env[ORIGIN_HEADER_KEY]}", " Access-Control-Request-Method: #{env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']}", " Access-Control-Request-Headers: #{env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}" ].join("\n") end if env['REQUEST_METHOD'] == 'OPTIONS' and env['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] if headers = process_preflight(env) debug(env) do "Preflight Headers:\n" + headers.collect{|kv| " #{kv.join(': ')}"}.join("\n") end return [200, headers, []] end else add_headers = process_cors(env) end else Result.miss(env, Result::MISS_NO_ORIGIN) end status, headers, body = @app.call env if add_headers headers = headers.merge(add_headers) # http://www.w3.org/TR/cors/#resource-implementation unless headers['Access-Control-Allow-Origin'] == '*' vary = headers['Vary'] headers['Vary'] = ((vary ? vary.split(/,\s*/) : []) + ['Origin']).uniq.join(', ') end end if debug? && result = env[ENV_KEY] result.append_header(headers) end [status, headers, body] end
debug?()
click to toggle source
# File lib/rack/cors.rb, line 31 def debug? @debug_mode end
Protected Instance Methods
all_resources()
click to toggle source
# File lib/rack/cors.rb, line 113 def all_resources @all_resources ||= [] end
debug(env, message = nil, &block)
click to toggle source
# File lib/rack/cors.rb, line 92 def debug(env, message = nil, &block) (@logger || select_logger(env)).debug(message, &block) if debug? end
find_resource(env)
click to toggle source
# File lib/rack/cors.rb, line 143 def find_resource(env) path = env[PATH_INFO_HEADER_KEY] origin = env[ORIGIN_HEADER_KEY] origin_matched = false all_resources.each do |r| if r.allow_origin?(origin, env) origin_matched = true if found = r.find_resource(path) return [found, nil] end end end [nil, origin_matched ? Result::MISS_NO_PATH : Result::MISS_NO_ORIGIN] end
process_cors(env)
click to toggle source
# File lib/rack/cors.rb, line 130 def process_cors(env) resource, error = find_resource(env) if resource Result.hit(env) cors = resource.to_headers(env) cors else Result.miss(env, error) nil end end
process_preflight(env)
click to toggle source
# File lib/rack/cors.rb, line 117 def process_preflight(env) resource, error = find_resource(env) if resource Result.preflight_hit(env) preflight = resource.process_preflight(env) preflight else Result.preflight_miss(env, error) nil end end
select_logger(env)
click to toggle source
# File lib/rack/cors.rb, line 96 def select_logger(env) @logger = if @logger_proc logger_proc = @logger_proc @logger_proc = nil logger_proc.call elsif defined?(Rails) && Rails.logger Rails.logger elsif env['rack.logger'] env['rack.logger'] else ::Logger.new(STDOUT).tap { |logger| logger.level = ::Logger::Severity::DEBUG } end end