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)
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