class FacebookCanvas::Middleware

Constants

ENV_INSIDE

Public Class Methods

inside!(env) click to toggle source

Check whether current request is marked as “inside Facebook Canvas”

# File lib/facebook_canvas/middleware.rb, line 39
def self.inside!(env)
  env[ENV_INSIDE] = true
end
inside?(env) click to toggle source

Mark current request as “inside Facebook Canvas”

# File lib/facebook_canvas/middleware.rb, line 44
def self.inside?(env)
  env[ENV_INSIDE]
end
new(app, request_host, custom_filter, inside_filter: nil) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 17
def initialize(app, request_host, custom_filter, inside_filter: nil)
  @app = app
  @request_host = proc_for_request_host(request_host)
  @custom_filter = custom_filter
  @inside_filter = inside_filter
end

Public Instance Methods

call(env) click to toggle source

Forces REQUEST_METHOD to GET if required.

# File lib/facebook_canvas/middleware.rb, line 25
def call(env)
  inside = match_inside?(env)

  if inside
    self.class.inside!(env)
  end

  if inside && matches_server_name?(env) && was_get_request?(env) && !was_xhr_request?(env) && custom_filter?(env)
    env["REQUEST_METHOD"] = "GET"
  end
  @app.call env
end

Private Instance Methods

custom_filter?(env) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 78
def custom_filter?(env)
  @custom_filter.call(env)
end
match_inside?(env) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 50
def match_inside?(env)
  @inside_filter.nil? || @inside_filter.call(env)
end
matches_server_name?(env) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 65
def matches_server_name?(env)
  @request_host.call(env)
end
proc_for_request_host(request_host) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 54
def proc_for_request_host(request_host)
  case request_host
  when Regexp
    proc { |env| request_host =~ env["SERVER_NAME"] }
  when Proc
    request_host
  else
    raise ArgumentError, "Expected Regexp or Proc for `request_host` but got: #{request_host.inspect}"
  end
end
was_get_request?(env) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 69
def was_get_request?(env)
  form_hash = env["rack.request.form_hash"] || {}
  !form_hash["utf8"]
end
was_xhr_request?(env) click to toggle source
# File lib/facebook_canvas/middleware.rb, line 74
def was_xhr_request?(env)
  env['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
end