Class: RedisClient::RubyConnection
- 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
- #close ⇒ Object
- #connected? ⇒ Boolean
-
#initialize(config, connect_timeout:, read_timeout:, write_timeout:) ⇒ RubyConnection
constructor
A new instance of RubyConnection.
- #read(timeout = nil) ⇒ Object
- #read_timeout=(timeout) ⇒ Object
- #write(command) ⇒ Object
- #write_multi(commands) ⇒ Object
- #write_timeout=(timeout) ⇒ Object
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., 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
#close ⇒ Object
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
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. rescue SystemCallError, IOError, OpenSSL::SSL::SSLError => error raise ConnectionError, error. 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. 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. 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 |