require 'openssl'

module Mongo

  # 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., TCPSocket#send and TCPSocket#read.
  class SSLSocket

    def initialize(host, port)
      @socket = ::TCPSocket.new(host, port)
      @ssl = OpenSSL::SSL::SSLSocket.new(@socket)
      @ssl.sync_close = true
      @ssl.connect
    end

    def setsockopt(key, value, n)
      @socket.setsockopt(key, value, n)
    end

    # Write to the SSL socket.
    #
    # @param buffer a buffer to send.
    # @param flags socket flags. Because Ruby's SSL
    def send(buffer, flags=0)
      @ssl.syswrite(buffer)
    end

    def read(length, buffer)
      @ssl.sysread(length, buffer)
    end

    def close
      @ssl.close
    end

  end
end