class StackMob::Middleware::Proxy

Constants

EXCLUDED_HEADERS
HEADER_NAME
LEGACY_RACK_ENV_NAME
RACK_ENV_NAME
STACKMOB_FORWARDED_HOST_ENV
STACKMOB_FORWARDED_PORT_ENV
VALID_HEADER_VALUES

Public Class Methods

new(app) click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 31
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
Calls superclass method
# File lib/stackmob/middleware/proxy.rb, line 35
def call(env)
  if VALID_HEADER_VALUES.include?(env[RACK_ENV_NAME]) || env['PATH_INFO'] =~ /^\/?.*\/accessToken/
    super(env)
  elsif VALID_HEADER_VALUES.include?(env[LEGACY_RACK_ENV_NAME])  
    req = ::Rack::Request.new(env)
    method = http_method(env)          
    headers = http_headers(env)
    params = [:put,:post].include?(method) ? req.body : req.query_string

    response = client.request(method, :api, env['PATH_INFO'], params, true, headers)

    [response.code.to_i, response.to_hash, response.body]
  else
    @app.call(env)
  end
end
http_headers(env) click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 73
def http_headers(env)
  headers = {}
  for headerArr in env.select { |k, v| k.start_with? 'HTTP_' } 
    if !EXCLUDED_HEADERS.include?(headerArr[0])
      headers[normalize(headerArr[0])] = headerArr[1]
    end
  end
  headers["Accept"] = "application/json"
  headers
end
http_method(env) click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 69
def http_method(env)
  env['REQUEST_METHOD'].downcase.to_sym
end
normalize(key) click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 84
def normalize(key)
  key.sub('HTTP_', '').split('_').map! { |p| p.downcase }.join("-")
end
rewrite_env(env) click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 52
def rewrite_env(env)
  env[STACKMOB_FORWARDED_HOST_ENV] = "127.0.0.1"
  env[STACKMOB_FORWARDED_PORT_ENV] = env['SERVER_PORT']
  env['HTTP_HOST'] = StackMob.plain_proxy_host
  if StackMob.plain_proxy_host != ENV['STACKMOB_DEV_URL']
    # rewrite port for api.stackmob.com
    env['SERVER_PORT'] = 80 
  end

  env
end

Private Instance Methods

client() click to toggle source
# File lib/stackmob/middleware/proxy.rb, line 64
def client
  @client ||= StackMob::Client.new(StackMob.dev_url, StackMob.app_name, StackMob::SANDBOX, StackMob.key, StackMob.secret)
end