\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/httpclient-2.8.3/lib/httpclient/

Viewing File: include_client.rb

# It is useful to re-use a HTTPClient instance for multiple requests, to
# re-use HTTP 1.1 persistent connections. 
#
# To do that, you sometimes want to store an HTTPClient instance in a global/
# class variable location, so it can be accessed and re-used. 
#
# This mix-in makes it easy to create class-level access to one or more
# HTTPClient instances. The HTTPClient instances are lazily initialized
# on first use (to, for instance, avoid interfering with WebMock/VCR),
# and are initialized in a thread-safe manner. Note that a 
# HTTPClient, once initialized, is safe for use in multiple threads.
#
# Note that you `extend` HTTPClient::IncludeClient, not `include. 
#
#    require 'httpclient/include_client'
#    class Widget
#       extend HTTPClient::IncludeClient
#
#       include_http_client
#       # and/or, specify more stuff
#       include_http_client('http://myproxy:8080', :method_name => :my_client) do |client|
#          # any init you want
#          client.set_cookie_store nil
#          client.
#       end
#    end
#
# That creates two HTTPClient instances available at the class level.
# The first will be available from Widget.http_client (default method
# name for `include_http_client`), with default initialization. 
#
# The second will be available at Widget.my_client, with the init arguments
# provided, further initialized by the block provided. 
#
# In addition to a class-level method, for convenience instance-level methods
# are also provided. Widget.http_client is identical to Widget.new.http_client
#
#
require 'httpclient'

class HTTPClient
  module IncludeClient
        

    def include_http_client(*args, &block)
      # We're going to dynamically define a class
      # to hold our state, namespaced, as well as possibly dynamic
      # name of cover method. 
      method_name = (args.last.delete(:method_name) if args.last.kind_of? Hash) || :http_client
      args.pop if args.last == {} # if last arg was named methods now empty, remove it.       
      
      # By the amazingness of closures, we can create these things
      # in local vars here and use em in our method, we don't even
      # need iVars for state. 
      client_instance = nil
      client_mutex = Mutex.new
      client_args = args
      client_block = block

      # to define a _class method_ on the specific class that's currently
      # `self`, we have to use this bit of metaprogramming, sorry. 
      (class << self; self ; end).instance_eval do      
        define_method(method_name) do                            
          # implementation copied from ruby stdlib singleton
          # to create this global obj thread-safely.
          return client_instance if client_instance
          client_mutex.synchronize do
            return client_instance if client_instance
            # init HTTPClient with specified args/block  
            client_instance = HTTPClient.new(*client_args)
            client_block.call(client_instance) if client_block
          end
          return client_instance
        end
      end
      
      # And for convenience, an  _instance method_ on the class that just
      # delegates to the class method. 
      define_method(method_name) do
        self.class.send(method_name)
      end
          
    end
  end
end