Sha256: 23d3f9e584902d46ee928a3ac6248bc6565c3f36a3e98b1c8881ff496f2a6a76

Contents?: true

Size: 1.28 KB

Versions: 2

Compression:

Stored size: 1.28 KB

Contents

# Copyright (C) 2014, all contributors <yahns-public@yhbt.net>
# License: GPLv3 or later (see COPYING for details)

require_relative 'sendfile_compat'

# this is to be included into a Kgio::Socket-derived class
# this requires Ruby 2.1 and later for "exception: false"
module Yahns::OpenSSLClient # :nodoc:
  include Yahns::SendfileCompat

  def yahns_init_ssl(ssl_ctx)
    @need_accept = true
    @ssl = OpenSSL::SSL::SSLSocket.new(self, ssl_ctx)
  end

  def kgio_trywrite(buf)
    rv = @ssl.write_nonblock(buf, exception: false)
    Integer === rv and
      rv = buf.bytesize == rv ? nil : buf.byteslice(rv, buf.bytesize)
    rv
  end

  def kgio_syssend(buf, flags)
    kgio_trywrite(buf)
  end

  def kgio_tryread(len, buf)
    if @need_accept
      # most protocols require read before write, so we start the negotiation
      # process here:
      begin
        @ssl.accept_nonblock
      rescue IO::WaitReadable
        return :wait_readable
      rescue IO::WaitWritable
        return :wait_writable
      rescue OpenSSL::SSL::SSLError
        return nil
      end
      @need_accept = false
    end
    @ssl.read_nonblock(len, buf, exception: false)
  end

  def shutdown(*args)
    @ssl.shutdown(*args)
    super # BasicSocket#shutdown
  end

  def close
    @ssl.close
    super # IO#close
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
yahns-1.6.0 lib/yahns/openssl_client.rb
yahns-1.5.0 lib/yahns/openssl_client.rb