# File lib/rbot/core/utils/httputil.rb, line 407
  def handle_response(uri, resp, opts, &block) # :yields: resp
    if Net::HTTPRedirection === resp && opts[:max_redir] >= 0
      if resp.key?('location')
        raise 'Too many redirections' if opts[:max_redir] <= 0
        yield resp if opts[:yield] == :all && block_given?
        loc = resp['location']
        new_loc = URI.join(uri.to_s, loc) rescue URI.parse(loc)
        new_opts = opts.dup
        new_opts[:max_redir] -= 1
        case opts[:method].to_s.downcase.intern
        when :post, "net::http::post""net::http::post"
          new_opts[:method] = :get
        end
        if resp['set-cookie']
          debug "setting cookie #{resp['set-cookie']}"
          new_opts[:headers] ||= Hash.new
          new_opts[:headers]['Cookie'] = resp['set-cookie']
        end
        debug "following the redirect to #{new_loc}"
        return get_response(new_loc, new_opts, &block)
      else
        warning ":| redirect w/o location?"
      end
    end
    class << resp
      undef_method :body
      alias :body :cooked_body
    end
    unless resp['content-type']
      debug "No content type, guessing"
      resp['content-type'] =
        case resp['x-rbot-location']
        when /.html?$/i
          'text/html'
        when /.xml$/i
          'application/xml'
        when /.xhtml$/i
          'application/xml+xhtml'
        when /.(gif|png|jpe?g|jp2|tiff?)$/i
          "image/#{$1.sub(/^jpg$/,'jpeg').sub(/^tif$/,'tiff')}"
        else
          'application/octetstream'
        end
    end
    if block_given?
      yield(resp)
    else
      # Net::HTTP wants us to read the whole body here
      resp.raw_body
    end
    return resp
  end