1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
require 'socket'
module Celluloid
module IO
# SSLServer wraps a TCPServer to provide immediate SSL accept
class SSLServer
extend Forwardable
def_delegators :@tcp_server, :listen, :shutdown, :close, :closed?, :to_io
attr_accessor :start_immediately
attr_reader :tcp_server
def initialize(server, ctx)
if server.is_a?(::TCPServer)
server = Celluloid::IO::TCPServer.from_ruby_server(server)
end
@tcp_server = server
@ctx = ctx
@start_immediately = true
end
def accept
sock = @tcp_server.accept
begin
ssl = Celluloid::IO::SSLSocket.new(sock, @ctx)
ssl.accept if @start_immediately
ssl
rescue OpenSSL::SSL::SSLError
sock.close
raise
end
end
end
end
end
|