class Stubby::Extensions::HTTP::HTTPApp

Public Class Methods

adapter(*names, &block) click to toggle source
# File lib/stubby/extensions/http.rb, line 30
def adapter(*names, &block)
  names.each do |name|
    adapters[name] = block
  end
end
adapters() click to toggle source
# File lib/stubby/extensions/http.rb, line 36
def adapters
  @@adapters ||= {}
end
port() click to toggle source
# File lib/stubby/extensions/http.rb, line 15
def port
  80
end
run!(session, server_settings={}) click to toggle source
Calls superclass method
# File lib/stubby/extensions/http.rb, line 19
def run!(session, server_settings={})
  puts self.inspect + ": " + port.to_s
  
  set :bind, STUBBY_MASTER
  set :port, port
  set :stubby_session, session
  set :server, 'thin'

  super(:server_settings => server_settings)
end

Private Instance Methods

forbidden() click to toggle source
# File lib/stubby/extensions/http.rb, line 137
def forbidden
  [403, "Forbidden"]
end
instruction() click to toggle source
# File lib/stubby/extensions/http.rb, line 145
def instruction
  @instruction ||= MultiJson.load(HTTPI.post("http://#{STUBBY_MASTER}:9000/rules/search.json", 
    trigger: "#{request.scheme}://#{request.host}").body)
end
instruction_params() click to toggle source
# File lib/stubby/extensions/http.rb, line 150
def instruction_params
  Rack::Utils.parse_nested_query url.query
end
not_found(resource="*unknown*") click to toggle source
# File lib/stubby/extensions/http.rb, line 141
def not_found(resource="*unknown*")
  [404, "Not Found:\n #{resource}"]
end
run_handler() click to toggle source
# File lib/stubby/extensions/http.rb, line 89
def run_handler
  if instruction.nil?
    not_found
  elsif adapter=self.class.adapters[url.scheme]
    instance_eval &adapter
  else
    instance_eval &self.class.adapters["default"]
  end
end
run_proxy(scheme) click to toggle source
# File lib/stubby/extensions/http.rb, line 99
def run_proxy(scheme)
  to = url.dup
  to.scheme = scheme
  to.path = request.path if to.path.empty?
  to.query = request.query_string

  puts "#{to.to_s} scheme: #{request.scheme}"

  r = HTTPI::Request.new
  r.url = to.to_s

  # TODO: this is a hack, should support streaming the bodies
  # and handling the headers more systematically (allow
  # keep-alives and transfer encoding)
  r.headers.merge! Hash[(env.select { |k,v| v.is_a? String }.collect { |k,v| [k.gsub("HTTP_", "").gsub("_", "-"), v] })]
  r.headers["HOST"] = request.host
  r.headers["STUBBY-ENV"] = settings.stubby_session.environment
  r.headers["STUBBY-KEY"] = settings.stubby_session.key(instruction)
  r.headers["STUBBY-USER"] = settings.stubby_session.user_key
  r.headers["X-FORWARDED-PROTO"] = request.scheme
  r.headers["X-FORWARDED-FOR"] = request.ip
  r.headers["CONNECTION"] = "close"
  r.headers.delete "ACCEPT-ENCODING"

  request.body.rewind
  r.body = request.body.read

  response = HTTPI.request(request.request_method.downcase.to_sym, r)
  
  response.headers.delete "TRANSFER-ENCODING"

  status(response.code)
  puts "response: #{response.headers}"

  headers(response.headers)
  body(response.body)
end
url() click to toggle source
# File lib/stubby/extensions/http.rb, line 154
def url
  @url ||= URI.parse(instruction)
end