class HTTPClient::SessionManager

Manages sessions for a HTTPClient instance.

def add_cached_session(sess)

def add_cached_session(sess)
  @sess_pool_mutex.synchronize do
    @sess_pool << sess
  end
end

def close(dest)

This method might not work as you expected...
def close(dest)
  if cached = get_cached_session(dest)
    cached.close
    true
  else
    false
  end
end

def close_all

def close_all
  @sess_pool_mutex.synchronize do
    @sess_pool.each do |sess|
      sess.close
    end
  end
  @sess_pool.clear
end

def get_cached_session(uri)

def get_cached_session(uri)
  cached = nil
  @sess_pool_mutex.synchronize do
    new_pool = []
    @sess_pool.each do |s|
      if s.invalidated?
        s.close # close & remove from the pool
      elsif !cached && s.dest.match(uri)
        cached = s
      else
        new_pool << s
      end
    end
    @sess_pool = new_pool
  end
  cached
end

def initialize(client)

def initialize(client)
  @client = client
  @proxy = client.proxy
  @agent_name = nil
  @from = nil
  @protocol_version = nil
  @debug_dev = client.debug_dev
  @socket_sync = true
  @chunk_size = ::HTTP::Message::Body::DEFAULT_CHUNK_SIZE
  @connect_timeout = 60
  @connect_retry = 1
  @send_timeout = 120
  @receive_timeout = 60       # For each read_block_size bytes
  @read_block_size = 1024 * 16 # follows net/http change in 1.8.7
  @protocol_retry_count = 5
  @ssl_config = nil
  @test_loopback_http_response = []
  @transparent_gzip_decompression = false
  @socket_local = Site.new
  @sess_pool = []
  @sess_pool_mutex = Mutex.new
end

def invalidate(site)

def invalidate(site)
  @sess_pool_mutex.synchronize do
    @sess_pool.each do |sess|
      if sess.dest == site
        sess.invalidate
      end
    end
  end
end

def keep(sess)

def keep(sess)
  add_cached_session(sess)
end

def open(uri, via_proxy = false)

def open(uri, via_proxy = false)
  sess = nil
  if cached = get_cached_session(uri)
    sess = cached
  else
    sess = Session.new(@client, Site.new(uri), @agent_name, @from)
    sess.proxy = via_proxy ? @proxy : nil
    sess.socket_sync = @socket_sync
    sess.requested_version = @protocol_version if @protocol_version
    sess.connect_timeout = @connect_timeout
    sess.connect_retry = @connect_retry
    sess.send_timeout = @send_timeout
    sess.receive_timeout = @receive_timeout
    sess.read_block_size = @read_block_size
    sess.protocol_retry_count = @protocol_retry_count
    sess.ssl_config = @ssl_config
    sess.debug_dev = @debug_dev
    sess.socket_local = @socket_local
    sess.test_loopback_http_response = @test_loopback_http_response
    sess.transparent_gzip_decompression = @transparent_gzip_decompression
  end
  sess
end

def proxy=(proxy)

def proxy=(proxy)
  if proxy.nil?
    @proxy = nil
  else
    @proxy = Site.new(proxy)
  end
end

def query(req, via_proxy)

def query(req, via_proxy)
  req.http_body.chunk_size = @chunk_size
  sess = open(req.header.request_uri, via_proxy)
  begin
    sess.query(req)
  rescue
    sess.close
    raise
  end
  sess
end

def reset(uri)

def reset(uri)
  site = Site.new(uri)
  close(site)
end

def reset_all

def reset_all
  close_all
end