Module: LocalDevelopmentGateway::DatabaseRouter::Wire
- Defined in:
- lib/local_development_gateway/database_router/wire.rb
Constant Summary collapse
- HANDSHAKE_TIMEOUT =
5
Class Method Summary collapse
- .accept_tls(socket, deadline:) ⇒ Object
- .deadline ⇒ Object
- .read_exactly(io, length, deadline:) ⇒ Object
- .read_until_eof(io, max_bytes:, deadline:) ⇒ Object
- .wait(io, readable:, deadline:) ⇒ Object
Class Method Details
.accept_tls(socket, deadline:) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/local_development_gateway/database_router/wire.rb', line 33 def accept_tls(socket, deadline:) loop do case socket.accept_nonblock(exception: false) when :wait_readable wait(socket, readable: true, deadline: deadline) when :wait_writable wait(socket, readable: false, deadline: deadline) else return socket end end rescue OpenSSL::SSL::SSLError => error raise Error, "PostgreSQL TLS handshake failed: #{error.}" end |
.deadline ⇒ Object
9 10 11 |
# File 'lib/local_development_gateway/database_router/wire.rb', line 9 def deadline Process.clock_gettime(Process::CLOCK_MONOTONIC) + HANDSHAKE_TIMEOUT end |
.read_exactly(io, length, deadline:) ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/local_development_gateway/database_router/wire.rb', line 13 def read_exactly(io, length, deadline:) bytes = +"" while bytes.bytesize < length wait(io, readable: true, deadline: deadline) bytes << io.readpartial(length - bytes.bytesize) end bytes end |
.read_until_eof(io, max_bytes:, deadline:) ⇒ Object
22 23 24 25 26 27 28 29 30 31 |
# File 'lib/local_development_gateway/database_router/wire.rb', line 22 def read_until_eof(io, max_bytes:, deadline:) bytes = +"" loop do wait(io, readable: true, deadline: deadline) bytes << io.readpartial(16 * 1024) raise Error, "Response is too large" if bytes.bytesize > max_bytes end rescue EOFError bytes end |
.wait(io, readable:, deadline:) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/local_development_gateway/database_router/wire.rb', line 48 def wait(io, readable:, deadline:) remaining = deadline - Process.clock_gettime(Process::CLOCK_MONOTONIC) ready = remaining.positive? && IO.select( readable ? [io] : nil, readable ? nil : [io], nil, remaining ) raise Error, "Database handshake timed out" unless ready end |