| 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.
| format | [RW] | |
| site | [R] |
The site parameter is required and will set the site attribute to the URI for the remote resource service.
# 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
Execute a DELETE request (see HTTP protocol documentation if unfamiliar). Used to delete resources.
# 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.
# 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.
# 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.
# 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.
# File activeresource/lib/active_resource/connection.rb, line 67 def site=(site) @site = site.is_a?(URI) ? site : URI.parse(site) end
Sets authorization header; authentication information is pulled from credentials provided with site URI.
# 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.
# File activeresource/lib/active_resource/connection.rb, line 147 def build_request_headers(headers) authorization_header.update(default_header).update(headers) end
# 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.
# 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.
# 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
# File activeresource/lib/active_resource/http_mock.rb, line 134 def http @http ||= HttpMock.new(@site) end
Makes request to remote service.
# 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