class Mongo::SSLSocket
A basic wrapper over Ruby's SSLSocket that initiates a TCP connection over SSL and then provides an basic interface mirroring Ruby's TCPSocket, vis., Mongo::TCPSocket#send and Mongo::TCPSocket#read.
Public Class Methods
new(host, port, op_timeout=nil, connect_timeout=nil, opts={})
click to toggle source
# File lib/mongo/connection/socket/ssl_socket.rb, line 25 def initialize(host, port, op_timeout=nil, connect_timeout=nil, opts={}) @op_timeout = op_timeout @connect_timeout = connect_timeout @pid = Process.pid @auths = Set.new @tcp_socket = ::TCPSocket.new(host, port) @tcp_socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) @context = OpenSSL::SSL::SSLContext.new if opts[:cert] @context.cert = OpenSSL::X509::Certificate.new(File.open(opts[:cert])) end if opts[:key] if opts[:key_pass_phrase] @context.key = OpenSSL::PKey::RSA.new(File.open(opts[:key]), opts[:key_pass_phrase]) else @context.key = OpenSSL::PKey::RSA.new(File.open(opts[:key])) end end if opts[:verify] @context.ca_file = opts[:ca_cert] @context.verify_mode = OpenSSL::SSL::VERIFY_PEER end begin @socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, @context) @socket.sync_close = true connect rescue OpenSSL::SSL::SSLError raise ConnectionFailure, "SSL handshake failed. MongoDB may " + "not be configured with SSL support." end if opts[:verify] unless OpenSSL::SSL.verify_certificate_identity(@socket.peer_cert, host) raise ConnectionFailure, "SSL handshake failed. Hostname mismatch." end end self end
Public Instance Methods
connect()
click to toggle source
# File lib/mongo/connection/socket/ssl_socket.rb, line 71 def connect if @connect_timeout Timeout::timeout(@connect_timeout, ConnectionTimeoutError) do @socket.connect end else @socket.connect end end
read(length, buffer)
click to toggle source
# File lib/mongo/connection/socket/ssl_socket.rb, line 85 def read(length, buffer) if @op_timeout Timeout::timeout(@op_timeout, OperationTimeout) do @socket.sysread(length, buffer) end else @socket.sysread(length, buffer) end end
send(data)
click to toggle source
# File lib/mongo/connection/socket/ssl_socket.rb, line 81 def send(data) @socket.syswrite(data) end