class Typhoeus::Easy

def auth=(authinfo)

def auth=(authinfo)
  set_option(OPTION_VALUES[:CURLOPT_USERPWD], "#{authinfo[:username]}:#{authinfo[:password]}")
  set_option(OPTION_VALUES[:CURLOPT_HTTPAUTH], authinfo[:method]) if authinfo[:method]
end

def auth_methods

def auth_methods
  get_info_long(INFO_VALUES[:CURLINFO_HTTPAUTH_AVAIL])
end

def curl_version

def curl_version
  version
end

def failure

gets called when finished and response code is 300-599
def failure
  @failure.call(self) if @failure
end

def follow_location=(boolean)

def follow_location=(boolean)
  if boolean
    set_option(OPTION_VALUES[:CURLOPT_FOLLOWLOCATION], 1)
  else
    set_option(OPTION_VALUES[:CURLOPT_FOLLOWLOCATION], 0)
  end
end

def get_info_double(option)

def get_info_double(option)
  easy_getinfo_double(option)
end

def get_info_long(option)

def get_info_long(option)
  easy_getinfo_long(option)
end

def get_info_string(option)

def get_info_string(option)
  easy_getinfo_string(option)
end

def headers=(hash)

def headers=(hash)
  @headers = hash
end

def increment_retries

def increment_retries
  @retries ||= 0
  @retries += 1
end

def initialize

def initialize
  @method = :get
  @post_dat_set = nil
  @headers = {}
end

def max_redirects=(redirects)

def max_redirects=(redirects)
  set_option(OPTION_VALUES[:CURLOPT_MAXREDIRS], redirects)
end

def max_retries

def max_retries
  @max_retries ||= 40
end

def max_retries?

def max_retries?
  retries >= max_retries
end

def method=(method)

def method=(method)
  @method = method
  if method == :get
    set_option(OPTION_VALUES[:CURLOPT_HTTPGET], 1)
  elsif method == :post
    set_option(OPTION_VALUES[:CURLOPT_HTTPPOST], 1)
    self.post_data = ""
  elsif method == :put
    set_option(OPTION_VALUES[:CURLOPT_UPLOAD], 1)
    self.request_body = "" unless @request_body
  else
    set_option(OPTION_VALUES[:CURLOPT_CUSTOMREQUEST], "DELETE")
  end
end

def on_failure(&block)

def on_failure(&block)
  @failure = block
end

def on_failure=(block)

def on_failure=(block)
  @failure = block
end

def on_success(&block)

def on_success(&block)
  @success = block
end

def on_success=(block)

def on_success=(block)
  @success = block
end

def params=(params)

def params=(params)
  params_string = params.keys.collect do |k|
    value = params[k]
    if value.is_a? Hash
      value.keys.collect {|sk| Rack::Utils.escape("#{k}[#{sk}]") + "=" + Rack::Utils.escape(value[sk].to_s)}
    elsif value.is_a? Array
      key = Rack::Utils.escape(k.to_s)
      value.collect { |v| "#{key}=#{Rack::Utils.escape(v.to_s)}" }.join('&')
    else
      "#{Rack::Utils.escape(k.to_s)}=#{Rack::Utils.escape(params[k].to_s)}"
    end
  end.flatten.join("&")
  
  if method == :post
    self.post_data = params_string
  else
    self.url = "#{url}?#{params_string}"
  end
end

def perform

def perform
  set_headers()
  easy_perform()
  response_code()
end

def post_data=(data)

def post_data=(data)
  @post_data_set = true
  set_option(OPTION_VALUES[:CURLOPT_POSTFIELDS], data)
  set_option(OPTION_VALUES[:CURLOPT_POSTFIELDSIZE], data.length)
end

def request_body=(request_body)

def request_body=(request_body)
  @request_body = request_body
  if @method == :put
    easy_set_request_body(@request_body)
    headers["Transfer-Encoding"] = ""
    headers["Expect"] = ""
  else
    self.post_data = request_body
  end
end

def reset

def reset
  @retries = 0
  @response_code = 0
  @response_header = ""
  @response_body = ""
  easy_reset()
end

def response_code

def response_code
  get_info_long(INFO_VALUES[:CURLINFO_RESPONSE_CODE])
end

def retries

def retries
  @retries ||= 0
end

def set_headers

def set_headers
  headers.each_pair do |key, value|
    easy_add_header("#{key}: #{value}")
  end
  easy_set_headers() unless headers.empty?
end

def set_option(option, value)

def set_option(option, value)
  if value.class == String
    easy_setopt_string(option, value)
  else
    easy_setopt_long(option, value)
  end
end

def success

gets called when finished and response code is 200-299
def success
  @success.call(self) if @success
end

def timed_out?

def timed_out?
  @timeout && total_time_taken > @timeout && response_code == 0
end

def timeout=(milliseconds)

def timeout=(milliseconds)
  @timeout = milliseconds
  set_option(OPTION_VALUES[:CURLOPT_NOSIGNAL], 1)
  set_option(OPTION_VALUES[:CURLOPT_TIMEOUT_MS], milliseconds)
end

def total_time_taken

def total_time_taken
  get_info_double(INFO_VALUES[:CURLINFO_TOTAL_TIME])
end

def url=(url)

def url=(url)
  @url = url
  set_option(OPTION_VALUES[:CURLOPT_URL], url)
end

def user_agent=(user_agent)

def user_agent=(user_agent)
  set_option(OPTION_VALUES[:CURLOPT_USERAGENT], user_agent)
end

def verbose=(boolean)

def verbose=(boolean)
  set_option(OPTION_VALUES[:CURLOPT_VERBOSE], !!boolean ? 1 : 0)
end