class Puma::MiniSSL::Socket

Public Class Methods

new(socket, engine) click to toggle source
# File lib/puma/minissl.rb, line 4
def initialize(socket, engine)
  @socket = socket
  @engine = engine
  @peercert = nil
end

Public Instance Methods

<<(data)
Alias for: write
close() click to toggle source
# File lib/puma/minissl.rb, line 84
def close
  begin
    # Try to setup (so that we can then close them) any
    # partially initialized sockets.
    while @engine.init?
      # Don't let this socket hold this loop forever.
      # If it can't send more packets within 1s, then
      # give up.
      return unless IO.select([@socket], nil, nil, 1)
      begin
        read_nonblock(1024)
      rescue Errno::EAGAIN
      end
    end

    done = @engine.shutdown

    while true
      enc = @engine.extract
      @socket.write enc

      notify = @socket.sysread(1024)

      @engine.inject notify
      done = @engine.shutdown

      break if done
    end
  rescue IOError, SystemCallError
    # nothing
  ensure
    @socket.close
  end
end
engine_read_all() click to toggle source
# File lib/puma/minissl.rb, line 31
def engine_read_all
  output = @engine.read
  while output and additional_output = @engine.read
    output << additional_output
  end
  output
end
flush() click to toggle source
# File lib/puma/minissl.rb, line 80
def flush
  @socket.flush
end
peeraddr() click to toggle source
# File lib/puma/minissl.rb, line 119
def peeraddr
  @socket.peeraddr
end
peercert() click to toggle source
# File lib/puma/minissl.rb, line 123
def peercert
  return @peercert if @peercert

  raw = @engine.peercert
  return nil unless raw

  @peercert = OpenSSL::X509::Certificate.new raw
end
read_nonblock(size) click to toggle source
# File lib/puma/minissl.rb, line 39
def read_nonblock(size)
  while true
    output = engine_read_all
    return output if output

    data = @socket.read_nonblock(size)

    @engine.inject(data)
    output = engine_read_all

    return output if output

    while neg_data = @engine.extract
      @socket.write neg_data
    end
  end
end
readpartial(size) click to toggle source
# File lib/puma/minissl.rb, line 14
def readpartial(size)
  while true
    output = @engine.read
    return output if output

    data = @socket.readpartial(size)
    @engine.inject(data)
    output = @engine.read

    return output if output

    while neg_data = @engine.extract
      @socket.write neg_data
    end
  end
end
syswrite(data)
Alias for: write
to_io() click to toggle source
# File lib/puma/minissl.rb, line 10
def to_io
  @socket
end
write(data) click to toggle source
# File lib/puma/minissl.rb, line 57
def write(data)
  need = data.bytesize

  while true
    wrote = @engine.write data
    enc = @engine.extract

    while enc
      @socket.write enc
      enc = @engine.extract
    end

    need -= wrote

    return data.bytesize if need == 0

    data = data[wrote..-1]
  end
end
Also aliased as: syswrite, <<