Class: RedisClient::RubyConnection

Inherits:
Object
  • Object
show all
Includes:
ConnectionMixin
Defined in:
lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb,
lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection/buffered_io.rb

Defined Under Namespace

Classes: BufferedIO

Constant Summary collapse

SUPPORTS_RESOLV_TIMEOUT =
Socket.method(:tcp).parameters.any? { |p| p.last == :resolv_timeout }

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ConnectionMixin

#call, #call_pipelined, #revalidate

Constructor Details

#initialize(config, connect_timeout:, read_timeout:, write_timeout:) ⇒ RubyConnection

Returns a new instance of RubyConnection.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 43

def initialize(config, connect_timeout:, read_timeout:, write_timeout:)
  super()
  socket = if config.path
    UNIXSocket.new(config.path)
  else
    sock = if SUPPORTS_RESOLV_TIMEOUT
      Socket.tcp(config.host, config.port, connect_timeout: connect_timeout, resolv_timeout: connect_timeout)
    else
      Socket.tcp(config.host, config.port, connect_timeout: connect_timeout)
    end
    # disables Nagle's Algorithm, prevents multiple round trips with MULTI
    sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
    sock
  end

  if config.ssl
    socket = OpenSSL::SSL::SSLSocket.new(socket, config.ssl_context)
    socket.hostname = config.host
    loop do
      case status = socket.connect_nonblock(exception: false)
      when :wait_readable
        socket.to_io.wait_readable(connect_timeout) or raise CannotConnectError
      when :wait_writable
        socket.to_io.wait_writable(connect_timeout) or raise CannotConnectError
      when socket
        break
      else
        raise "Unexpected `connect_nonblock` return: #{status.inspect}"
      end
    end
  end

  @io = BufferedIO.new(
    socket,
    read_timeout: read_timeout,
    write_timeout: write_timeout,
  )
rescue SystemCallError, OpenSSL::SSL::SSLError, SocketError => error
  raise CannotConnectError, error.message, error.backtrace
end

Class Method Details

.ssl_context(ssl_params) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 14

def ssl_context(ssl_params)
  params = ssl_params.dup || {}

  cert = params[:cert]
  if cert.is_a?(String)
    cert = File.read(cert) if File.exist?(cert)
    params[:cert] = OpenSSL::X509::Certificate.new(cert)
  end

  key = params[:key]
  if key.is_a?(String)
    key = File.read(key) if File.exist?(key)
    params[:key] = OpenSSL::PKey.read(key)
  end

  context = OpenSSL::SSL::SSLContext.new
  context.set_params(params)
  if context.verify_mode != OpenSSL::SSL::VERIFY_NONE
    if context.respond_to?(:verify_hostname) # Missing on JRuby
      context.verify_hostname
    end
  end

  context
end

Instance Method Details

#closeObject



88
89
90
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 88

def close
  @io.close
end

#connected?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 84

def connected?
  !@io.closed?
end

#read(timeout = nil) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 121

def read(timeout = nil)
  if timeout.nil?
    RESP3.load(@io)
  else
    @io.with_timeout(timeout) { RESP3.load(@io) }
  end
rescue RedisClient::RESP3::UnknownType => error
  raise RedisClient::ProtocolError, error.message
rescue SystemCallError, IOError, OpenSSL::SSL::SSLError => error
  raise ConnectionError, error.message
end

#read_timeout=(timeout) ⇒ Object



92
93
94
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 92

def read_timeout=(timeout)
  @io.read_timeout = timeout if @io
end

#write(command) ⇒ Object



100
101
102
103
104
105
106
107
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 100

def write(command)
  buffer = RESP3.dump(command)
  begin
    @io.write(buffer)
  rescue SystemCallError, IOError => error
    raise ConnectionError, error.message
  end
end

#write_multi(commands) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 109

def write_multi(commands)
  buffer = nil
  commands.each do |command|
    buffer = RESP3.dump(command, buffer)
  end
  begin
    @io.write(buffer)
  rescue SystemCallError, IOError => error
    raise ConnectionError, error.message
  end
end

#write_timeout=(timeout) ⇒ Object



96
97
98
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/redis-client-0.12.0/lib/redis_client/ruby_connection.rb', line 96

def write_timeout=(timeout)
  @io.write_timeout = timeout if @io
end