lib/ethon/curl.rb



require 'ethon/curls/codes'
require 'ethon/curls/options'
require 'ethon/curls/infos'
require 'ethon/curls/form_options'
require 'ethon/curls/auth_types'
require 'ethon/curls/proxy_types'
require 'ethon/curls/ssl_versions'
require 'ethon/curls/messages'
require 'ethon/curls/functions'

module Ethon

  # FFI Wrapper module for Curl. Holds constants and required initializers.
  module Curl
    extend ::FFI::Library
    extend Ethon::Curls::Codes
    extend Ethon::Curls::Options
    extend Ethon::Curls::Infos
    extend Ethon::Curls::FormOptions
    extend Ethon::Curls::AuthTypes
    extend Ethon::Curls::ProxyTypes
    extend Ethon::Curls::SslVersions
    extend Ethon::Curls::Messages


    require 'ethon/curls/constants'
    require 'ethon/curls/settings'
    require 'ethon/curls/classes'
    extend Ethon::Curls::Functions

    if windows?
      ffi_lib 'ws2_32'
    else
      ffi_lib ::FFI::Library::LIBC
    end

    @blocking = true

    @@initialized = false
    @@init_mutex = Mutex.new

    class << self
      # This function sets up the program environment that libcurl needs.
      # Think of it as an extension of the library loader.
      #
      # This function must be called at least once within a program (a program is all the
      # code that shares a memory space) before the program calls any other function in libcurl.
      # The environment it sets up is constant for the life of the program and is the same for
      # every program, so multiple calls have the same effect as one call.
      #
      # The flags option is a bit pattern that tells libcurl exactly what features to init,
      # as described below. Set the desired bits by ORing the values together. In normal
      # operation, you must specify CURL_GLOBAL_ALL. Don't use any other value unless
      # you are familiar with it and mean to control internal operations of libcurl.
      #
      # This function is not thread safe. You must not call it when any other thread in
      # the program (i.e. a thread sharing the same memory) is running. This doesn't just
      # mean no other thread that is using libcurl. Because curl_global_init() calls
      # functions of other libraries that are similarly thread unsafe, it could conflict with
      # any other thread that uses these other libraries.
      def init
        @@init_mutex.synchronize {
          if not @@initialized
            raise Errors::GlobalInit.new if Curl.global_init(GLOBAL_ALL) != 0
            @@initialized = true
            Ethon.logger.debug("ETHON: Libcurl initialized") if Ethon.logger
          end
        }
      end
    end
  end
end