diff options
Diffstat (limited to 'ext/openssl/lib/openssl')
-rw-r--r-- | ext/openssl/lib/openssl/buffering.rb | 13 | ||||
-rw-r--r-- | ext/openssl/lib/openssl/ssl.rb | 53 |
2 files changed, 52 insertions, 14 deletions
diff --git a/ext/openssl/lib/openssl/buffering.rb b/ext/openssl/lib/openssl/buffering.rb index 6ddec099bf..031af4baa3 100644 --- a/ext/openssl/lib/openssl/buffering.rb +++ b/ext/openssl/lib/openssl/buffering.rb @@ -16,7 +16,7 @@ module Buffering include Enumerable - attr_accessor :sync, :sync_close + attr_accessor :sync BLOCK_SIZE = 1024*16 # @@ -158,7 +158,12 @@ module Buffering def puts(*args) s = "" - args.each{ |arg| s << arg.to_s + $/ } + args.each{|arg| + s << arg.to_s + unless /#{$/}\Z/o =~ s + s << $/ + end + } do_write(s) nil end @@ -183,9 +188,7 @@ module Buffering end def close - flush + flush rescue nil sysclose - @sync_close ||= false - @io.close if @sync_close end end diff --git a/ext/openssl/lib/openssl/ssl.rb b/ext/openssl/lib/openssl/ssl.rb index 39d975b1c8..6e6bdfe942 100644 --- a/ext/openssl/lib/openssl/ssl.rb +++ b/ext/openssl/lib/openssl/ssl.rb @@ -18,31 +18,66 @@ require 'openssl/buffering' module OpenSSL module SSL - class SSLSocket - include Buffering - + module SocketForwarder def addr - @io.addr + to_io.addr end def peeraddr - @io.peeraddr + to_io.peeraddr end def getsockopt(level, optname, optval) - @io.setsockopt(level, optname, optval) + to_io.setsockopt(level, optname, optval) end def setsockopt(level, optname) - @io.setsockopt(level, optname) + to_io.setsockopt(level, optname) end def fcntl(*args) - @io.fcntl(*args) + to_io.fcntl(*args) end def closed? - @io.closed? + to_io.closed? + end + end + + class SSLSocket + include Buffering + include SocketForwarder + end + + class SSLServer + include SocketForwarder + attr_accessor :start_immediately + + def initialize(svr, ctx) + @svr = svr + @ctx = ctx + @start_immediately = true + end + + def to_io + @svr + end + + def listen(basklog=5) + @svr.listen(backlog) + end + + def accept + sock = @svr.accept + ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx) + ssl.sync = true + ssl.sync_close = true + ssl.accept if @start_immediately + ssl + end + + def close + @svr.close end end end |