# class Chef::HTTP::BasicClient

### Constants

HTTPS

### Attributes

http_client[R]
ssl_policy[R]
url[R]

### Public Class Methods

new(url, opts={}) click to toggle source

Instantiate a BasicClient.

### Arguments:¶ ↑

url

  An URI for the remote server.

### Options:¶ ↑

#ssl_policy

  The SSL Policy to use, defaults to DefaultSSLPolicy

    # File lib/chef/http/basic_client.rb, line 43
    def initialize(url, opts={})
      @url = url
      @ssl_policy = opts[:ssl_policy] || DefaultSSLPolicy
      @http_client = build_http_client
    end

### Public Instance Methods

build_http_client() click to toggle source

    # File lib/chef/http/basic_client.rb, line 93
    def build_http_client
      http_client = http_client_builder.new(host, port)

      if url.scheme == HTTPS
        configure_ssl(http_client)
      end

      http_client.read_timeout = config[:rest_timeout]
      http_client
    end

config() click to toggle source

    # File lib/chef/http/basic_client.rb, line 104
    def config
      Chef::Config
    end

configure_ssl(http_client) click to toggle source

    # File lib/chef/http/basic_client.rb, line 120
    def configure_ssl(http_client)
      http_client.use_ssl = true
      ssl_policy.apply_to(http_client)
    end

host() click to toggle source

    # File lib/chef/http/basic_client.rb, line 49
    def host
      @url.hostname
    end

http_client_builder() click to toggle source

    # File lib/chef/http/basic_client.rb, line 108
    def http_client_builder
      http_proxy = proxy_uri
      if http_proxy.nil?
        Net::HTTP
      else
        Chef::Log.debug("Using #{http_proxy.host}:#{http_proxy.port} for proxy")
        user = Chef::Config["#{url.scheme}_proxy_user"]
        pass = Chef::Config["#{url.scheme}_proxy_pass"]
        Net::HTTP.Proxy(http_proxy.host, http_proxy.port, user, pass)
      end
    end

port() click to toggle source

    # File lib/chef/http/basic_client.rb, line 53
    def port
      @url.port
    end

proxy_uri() click to toggle source

adapted from buildr/lib/buildr/core/transports.rb

    # File lib/chef/http/basic_client.rb, line 85
    def proxy_uri
      proxy = Chef::Config["#{url.scheme}_proxy"]
      proxy = URI.parse(proxy) if String === proxy
      excludes = Chef::Config[:no_proxy].to_s.split(/\s*,\s*/).compact
      excludes = excludes.map { |exclude| exclude =~ /:\d+$/ ? exclude : "#{exclude}:*" }
      return proxy unless excludes.any? { |exclude| File.fnmatch(exclude, "#{host}:#{port}") }
    end

request(method, url, req_body, base_headers={}) { |response| ... } click to toggle source

    # File lib/chef/http/basic_client.rb, line 57
    def request(method, url, req_body, base_headers={})
      http_request = HTTPRequest.new(method, url, req_body, base_headers).http_request
      Chef::Log.debug("Initiating #{method} to #{url}")
      Chef::Log.debug("---- HTTP Request Header Data: ----")
      base_headers.each do |name, value|
        Chef::Log.debug("#{name}: #{value}")
      end
      Chef::Log.debug("---- End HTTP Request Header Data ----")
      http_client.request(http_request) do |response|
        Chef::Log.debug("---- HTTP Status and Header Data: ----")
        Chef::Log.debug("HTTP #{response.http_version} #{response.code} #{response.msg}")

        response.each do |header, value|
          Chef::Log.debug("#{header}: #{value}")
        end
        Chef::Log.debug("---- End HTTP Status/Header Data ----")

        yield response if block_given?
        # http_client.request may not have the return signature we want, so
        # force the issue:
        return [http_request, response]
      end
    rescue OpenSSL::SSL::SSLError => e
      Chef::Log.error("SSL Validation failure connecting to host: #{host} - #{e.message}")
      raise
    end