class Mallory::Proxy

Constants

MAX_ATTEMPTS

Public Class Methods

new(ct, it, backend, response_builder, logger, certificate_authority) click to toggle source
# File lib/mallory/proxy.rb, line 10
def initialize(ct, it, backend, response_builder, logger, certificate_authority)
  @connect_timeout = ct
  @inactivity_timeout = it
  @backend = backend
  @response_builder = response_builder
  @logger = logger
  @certificate_authority = certificate_authority
  @retries = 0
  @response = ''
end

Public Instance Methods

options() click to toggle source
# File lib/mallory/proxy.rb, line 42
def options
  options = {
    :connect_timeout => @connect_timeout,
    :inactivity_timeout => @inactivity_timeout,
  }
  if not @proxy.nil?
    options[:proxy] = {
      :host => @proxy.split(':')[0],
      :port => @proxy.split(':')[1]
    }
  end
  return options
end
perform(request) click to toggle source
# File lib/mallory/proxy.rb, line 26
def perform request
  @method = request.method.to_s
  @uri = request.uri
  @request_headers = request.headers
  @body = request.body || ''
  resubmit
end
response() click to toggle source
# File lib/mallory/proxy.rb, line 38
def response
  @response
end
resubmit() click to toggle source
# File lib/mallory/proxy.rb, line 21
def resubmit
  @proxy = @backend.any
  submit
end
send_data(data) click to toggle source
# File lib/mallory/proxy.rb, line 34
def send_data data
  @response << data
end
submit() click to toggle source
# File lib/mallory/proxy.rb, line 56
def submit
  @retries+=1
  if @retries > MAX_ATTEMPTS
    fail
    return
  end
  @logger.debug "Attempt #{@retries} - #{@method.upcase} #{@uri} via #{@proxy}"
  if [:post, :put].include?(@method)
    request_params = {:head => @headers, :body => @body}
  else
    request_params = {:head => @headers}
  end
  http = EventMachine::HttpRequest.new(@uri, options).send(@method, request_params)
  http.errback {
    @logger.debug "Attempt #{@retries} - Failed"
    resubmit
  }
  http.callback {
    @logger.debug "Attempt #{@retries} - Success"
    response = @response_builder.build(http)
    @logger.request response.body
    if response.status > 400
      @logger.debug "#{response.status} > 400"
      resubmit
    else
      send_data "HTTP/1.1 #{response.status} #{response.description}\n"
      send_data response.headers
      send_data "\r\n\r\n"
      send_data response.body
      @logger.debug "Send content #{response.body.length} bytes"
      @logger.info "Success (#{Time.now-Time.now}s, #{@retries} attempts)"
    end
    self.succeed
  }
end