class Docker::Connection

This class represents a Connection to a Docker server. The Connection is immutable in that once the url and options is set they cannot be changed.

Attributes

options[R]
url[R]

Public Class Methods

new(url, opts) click to toggle source

Create a new Connection. This method takes a url (String) and options (Hash). These are passed to Excon, so any options valid for `Excon.new` can be passed here.

# File lib/docker/connection.rb, line 11
def initialize(url, opts)
  case
  when !url.is_a?(String)
    raise ArgumentError, "Expected a String, got: '#{url}'"
  when !opts.is_a?(Hash)
    raise ArgumentError, "Expected a Hash, got: '#{opts}'"
  else
    uri = URI.parse(url)
    if uri.scheme == "unix"
      @url, @options = 'unix:///', {:socket => uri.path}.merge(opts)
    elsif uri.scheme =~ /^(https?|tcp)$/
      @url, @options = url, opts
    else
      @url, @options = "http://#{uri}", opts
    end
  end
end

Public Instance Methods

log_request(request) click to toggle source
# File lib/docker/connection.rb, line 55
def log_request(request)
  if Docker.logger
    Docker.logger.debug(
      [request[:method], request[:path], request[:query], request[:body]]
    )
  end
end
request(*args, &block) click to toggle source

Send a request to the server with the `

# File lib/docker/connection.rb, line 37
def request(*args, &block)
  request = compile_request_params(*args, &block)
  log_request(request)
  resource.request(request).body
rescue Excon::Errors::BadRequest => ex
  raise ClientError, ex.response.body
rescue Excon::Errors::Unauthorized => ex
  raise UnauthorizedError, ex.response.body
rescue Excon::Errors::NotFound => ex
  raise NotFoundError, ex.response.body
rescue Excon::Errors::Conflict => ex
  raise ConflictError, ex.response.body
rescue Excon::Errors::InternalServerError => ex
  raise ServerError, ex.response.body
rescue Excon::Errors::Timeout => ex
  raise TimeoutError, ex.message
end
to_s() click to toggle source
# File lib/docker/connection.rb, line 68
def to_s
  "Docker::Connection { :url => #{url}, :options => #{options} }"
end

Private Instance Methods

compile_request_params(http_method, path, query = nil, opts = nil, &block) click to toggle source

Given an HTTP method, path, optional query, extra options, and block, compiles a request.

# File lib/docker/connection.rb, line 75
def compile_request_params(http_method, path, query = nil, opts = nil, &block)
  query ||= {}
  opts ||= {}
  headers = opts.delete(:headers) || {}
  content_type = opts[:body].nil? ?  'text/plain' : 'application/json'
  user_agent = "Swipely/Docker-API #{Docker::VERSION}"
  {
    :method        => http_method,
    :path          => "/v#{Docker::API_VERSION}#{path}",
    :query         => query,
    :headers       => { 'Content-Type' => content_type,
                        'User-Agent'   => user_agent,
                      }.merge(headers),
    :expects       => (200..204).to_a << 304,
    :idempotent    => http_method == :get,
    :request_block => block
  }.merge(opts).reject { |_, v| v.nil? }
end
resource() click to toggle source

The actual client that sends HTTP methods to the Docker server. This value is not cached, since doing so may cause socket errors after bad requests.

# File lib/docker/connection.rb, line 31
def resource
  Excon.new(url, options)
end