Class ActiveResource::Connection
In: activeresource/lib/active_resource/connection.rb
activeresource/lib/active_resource/http_mock.rb
Parent: Object

Class to handle connections to remote web services. This class is used by ActiveResource::Base to interface with REST services.

Methods

Attributes

format  [RW] 
site  [R] 

Public Class methods

The site parameter is required and will set the site attribute to the URI for the remote resource service.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 60
    def initialize(site, format = ActiveResource::Formats[:xml])
      raise ArgumentError, 'Missing site URI' unless site
      self.site = site
      self.format = format
    end

[Source]

# File activeresource/lib/active_resource/connection.rb, line 53
      def requests
        @@requests ||= []
      end

Public Instance methods

Execute a DELETE request (see HTTP protocol documentation if unfamiliar). Used to delete resources.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 79
    def delete(path, headers = {})
      request(:delete, path, build_request_headers(headers))
    end

Execute a GET request. Used to get (find) resources.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 73
    def get(path, headers = {})
      format.decode(request(:get, path, build_request_headers(headers)).body)
    end

Execute a POST request. Used to create new resources.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 91
    def post(path, body = '', headers = {})
      request(:post, path, body.to_s, build_request_headers(headers))
    end

Execute a PUT request (see HTTP protocol documentation if unfamiliar). Used to update resources.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 85
    def put(path, body = '', headers = {})
      request(:put, path, body.to_s, build_request_headers(headers))
    end

Set URI for remote service.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 67
    def site=(site)
      @site = site.is_a?(URI) ? site : URI.parse(site)
    end

Private Instance methods

Sets authorization header; authentication information is pulled from credentials provided with site URI.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 152
      def authorization_header
        (@site.user || @site.password ? { 'Authorization' => 'Basic ' + ["#{@site.user}:#{ @site.password}"].pack('m').delete("\r\n") } : {})
      end

Builds headers for request to remote service.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 147
      def build_request_headers(headers)
        authorization_header.update(default_header).update(headers)
      end

[Source]

# File activeresource/lib/active_resource/connection.rb, line 142
      def default_header
        @default_header ||= { 'Content-Type' => format.mime_type }
      end

Handles response and error codes from remote service.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 107
      def handle_response(response)
        case response.code.to_i
          when 301,302
            raise(Redirection.new(response))
          when 200...400
            response
          when 404
            raise(ResourceNotFound.new(response))
          when 405
            raise(MethodNotAllowed.new(response))
          when 409
            raise(ResourceConflict.new(response))
          when 422
            raise(ResourceInvalid.new(response))
          when 401...500
            raise(ClientError.new(response))
          when 500...600
            raise(ServerError.new(response))
          else
            raise(ConnectionError.new(response, "Unknown response code: #{response.code}"))
        end
      end

Creates new (or uses currently instantiated) Net::HTTP instance for communication with remote service and resources.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 132
      def http
        unless @http
          @http             = Net::HTTP.new(@site.host, @site.port)
          @http.use_ssl     = @site.is_a?(URI::HTTPS)
          @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @http.use_ssl
        end

        @http
      end

[Source]

# File activeresource/lib/active_resource/http_mock.rb, line 134
        def http
          @http ||= HttpMock.new(@site)
        end

Makes request to remote service.

[Source]

# File activeresource/lib/active_resource/connection.rb, line 98
      def request(method, path, *arguments)
        logger.info "#{method.to_s.upcase} #{site.scheme}://#{site.host}:#{site.port}#{path}" if logger
        result = nil
        time = Benchmark.realtime { result = http.send(method, path, *arguments) }
        logger.info "--> #{result.code} #{result.message} (#{result.body.length}b %.2fs)" % time if logger
        handle_response(result)
      end

[Validate]