module EventStore::HTTP::Session

Public Class Methods

build(settings=nil, namespace: nil, type: nil) click to toggle source
# File lib/event_store/http/session.rb, line 16
def self.build(settings=nil, namespace: nil, type: nil)
  Factory.(settings, namespace: namespace, type: type)
end
configure(receiver, settings=nil, attr_name: nil, session: nil, **arguments) click to toggle source
# File lib/event_store/http/session.rb, line 20
def self.configure(receiver, settings=nil, attr_name: nil, session: nil, **arguments)
  attr_name ||= :session

  if session.nil?
    session = build settings, **arguments
  end

  receiver.public_send "#{attr_name}=", session
  session
end
included(cls) click to toggle source
# File lib/event_store/http/session.rb, line 4
def self.included(cls)
  cls.class_exec do
    include Log::Dependency

    dependency :connect, Connect
    dependency :data_logger, Log::Data
    dependency :retry, Retry

    attr_writer :net_http
  end
end

Public Instance Methods

configure_retry(request) click to toggle source
# File lib/event_store/http/session.rb, line 108
def configure_retry(request)
  request.retry = self.retry
end
establish_connection(ip_address=nil) click to toggle source
# File lib/event_store/http/session.rb, line 94
def establish_connection(ip_address=nil)
  data_logger.trace { "Establishing connection (IPAddress: #{ip_address || '(none)'})" }

  net_http = self.retry.() do
    connect.(ip_address).tap &:start
  end

  self.net_http = net_http

  data_logger.debug { "Connection established (IPAddress: #{net_http.ip_address}, Host: #{net_http.address}, Port: #{net_http.port})" }

  net_http
end
net_http() click to toggle source
# File lib/event_store/http/session.rb, line 84
def net_http
  @net_http ||= establish_connection
end
reconnect(ip_address=nil) click to toggle source
# File lib/event_store/http/session.rb, line 88
def reconnect(ip_address=nil)
  net_http.finish if net_http.active?

  establish_connection ip_address
end
request(request) click to toggle source
# File lib/event_store/http/session.rb, line 33
      def request(request)
        logger.trace { "Issuing request (#{LogText.request request})" }

        data_logger.trace {
          <<~TEXT
          Issuing request
          
          #{request.method} #{request.path}
          #{LogText.header_data request}

          #{LogText.body_data request}
          TEXT
        }

        self.retry.() do |_retry|
          begin
            response = net_http.request request
          rescue SystemCallError, IOError => error
            logger.warn "Connection error during request; reconnecting (ErrorClass: #{error.class}, ErrorMessage: #{error.message})"
            reconnect

            reset_request request

            _retry.failed error
          end

          logger.debug { "Request completed (#{LogText.request request, response})" }

          data_logger.debug {
            <<~TEXT
            Request completed
            
            #{request.method} #{request.path}
            #{LogText.header_data request}
            #{LogText.body_data request}

            HTTP/#{response.http_version} #{response.code} #{response.message}
            #{LogText.header_data response}
            #{LogText.body_data response}
            TEXT
          }

          if Net::HTTPServerError === response
            logger.warn { "Server error (#{LogText.request request, response})" }
            _retry.failed
          end

          response
        end
      end
reset_request(request) click to toggle source
# File lib/event_store/http/session.rb, line 112
def reset_request(request)
  request['host'] = nil
  request['connection'] = nil
end