# File lib/deltacloud.rb, line 346
    def request(*args, &block)
      conf = {
        :method => (args[0] || 'get').to_sym,
        :path => (args[1]=~/^http/) ? args[1] : "#{api_uri.to_s}#{args[1]}",
        :query_args => args[2] || {},
        :form_data => args[3] || {},
        :timeout => args[4] || 45,
        :open_timeout => args[5] || 10
      }
      if conf[:query_args] != {}
        conf[:path] += '?' + URI.escape(conf[:query_args].collect{ |key, value| "#{key}=#{value}" }.join('&')).to_s
      end

      if conf[:method].eql?(:post)
        resource = RestClient::Resource.new(conf[:path], :open_timeout => conf[:open_timeout], :timeout => conf[:timeout])
        resource.send(:post, conf[:form_data], default_headers.merge(extended_headers)) do |response, request, block|
          handle_backend_error(response) if [500, 502].include? response.code
          if response.respond_to?('body')
            yield response.body if block_given?
          else
            yield response.to_s if block_given?
          end
        end
      else
        resource = RestClient::Resource.new(conf[:path], :open_timeout => conf[:open_timeout], :timeout => conf[:timeout])
        resource.send(conf[:method], default_headers.merge(extended_headers)) do |response, request, block|
          handle_backend_error(response) if [500, 502].include? response.code
          if conf[:method].eql?(:get) and [301, 302, 307].include? response.code
            response.follow_redirection(request) do |response, request, block|
              if response.respond_to?('body')
                yield response.body if block_given?
              else
                yield response.to_s if block_given?
              end
            end
          else
            if response.respond_to?('body')
              yield response.body if block_given?
            else
              yield response.to_s if block_given?
            end
          end
        end
      end
    end