module OpenSSL::Buffering
def << (s)
def << (s) do_write(s) self end
def << (s)
def << (s) do_write(s) self end
def close
def close flush rescue nil sysclose end
def close
def close flush rescue nil sysclose end
def consume_rbuff(size=nil)
def consume_rbuff(size=nil) if @rbuffer.empty? nil else size = @rbuffer.size unless size ret = @rbuffer[0, size] @rbuffer[0, size] = "" ret end end
def consume_rbuff(size=nil)
def consume_rbuff(size=nil) if @rbuffer.empty? nil else size = @rbuffer.size unless size ret = @rbuffer[0, size] @rbuffer[0, size] = "" ret end end
def do_write(s)
def do_write(s) @wbuffer = "" unless defined? @wbuffer @wbuffer << s @sync ||= false if @sync or @wbuffer.size > BLOCK_SIZE or idx = @wbuffer.rindex($/) remain = idx ? idx + $/.size : @wbuffer.length nwritten = 0 while remain > 0 str = @wbuffer[nwritten,remain] begin nwrote = syswrite(str) rescue Errno::EAGAIN retry end remain -= nwrote nwritten += nwrote end @wbuffer[0,nwritten] = "" end end
def do_write(s)
def do_write(s) @wbuffer = "" unless defined? @wbuffer @wbuffer << s @wbuffer.force_encoding(Encoding::BINARY) @sync ||= false if @sync or @wbuffer.size > BLOCK_SIZE or idx = @wbuffer.rindex($/) remain = idx ? idx + $/.size : @wbuffer.length nwritten = 0 while remain > 0 str = @wbuffer[nwritten,remain] begin nwrote = syswrite(str) rescue Errno::EAGAIN retry end remain -= nwrote nwritten += nwrote end @wbuffer[0,nwritten] = "" end end
def each(eol=$/)
def each(eol=$/) while line = self.gets(eol) yield line end end
def each(eol=$/)
def each(eol=$/) while line = self.gets(eol) yield line end end
def each_byte
def each_byte while c = getc yield(c) end end
def each_byte # :yields: byte
def each_byte # :yields: byte while c = getc yield(c.ord) end end
def eof?
def eof? fill_rbuff if !@eof && @rbuffer.empty? @eof && @rbuffer.empty? end
def eof?
def eof? fill_rbuff if !@eof && @rbuffer.empty? @eof && @rbuffer.empty? end
def fill_rbuff
def fill_rbuff begin @rbuffer << self.sysread(BLOCK_SIZE) rescue Errno::EAGAIN retry rescue EOFError @eof = true end end
def fill_rbuff
def fill_rbuff begin @rbuffer << self.sysread(BLOCK_SIZE) rescue Errno::EAGAIN retry rescue EOFError @eof = true end end
def flush
def flush osync = @sync @sync = true do_write "" @sync = osync end
def flush
def flush osync = @sync @sync = true do_write "" return self ensure @sync = osync end
def getc
def getc c = read(1) c ? c[0] : nil end
def getc
def getc read(1) end
def gets(eol=$/)
def gets(eol=$/) idx = @rbuffer.index(eol) until @eof break if idx fill_rbuff idx = @rbuffer.index(eol) end if eol.is_a?(Regexp) size = idx ? idx+$&.size : nil else size = idx ? idx+eol.size : nil end consume_rbuff(size) end
def gets(eol=$/, limit=nil)
def gets(eol=$/, limit=nil) idx = @rbuffer.index(eol) until @eof break if idx fill_rbuff idx = @rbuffer.index(eol) end if eol.is_a?(Regexp) size = idx ? idx+$&.size : nil else size = idx ? idx+eol.size : nil end if limit and limit >= 0 size = [size, limit].min end consume_rbuff(size) end
def initialize(*args)
def initialize(*args) @eof = false @rbuffer = "" @sync = @io.sync end
def initialize(*args)
def initialize(*args) @eof = false @rbuffer = "" @sync = @io.sync end
def print(*args)
def print(*args) s = "" args.each{ |arg| s << arg.to_s } do_write(s) nil end
def print(*args)
def print(*args) s = "" args.each{ |arg| s << arg.to_s } do_write(s) nil end
def printf(s, *args)
def printf(s, *args) do_write(s % args) nil end
def printf(s, *args)
def printf(s, *args) do_write(s % args) nil end
def puts(*args)
def puts(*args) s = "" if args.empty? s << "\n" end args.each{|arg| s << arg.to_s if $/ && /\n\z/ !~ s s << "\n" end } do_write(s) nil end
def puts(*args)
def puts(*args) s = "" if args.empty? s << "\n" end args.each{|arg| s << arg.to_s if $/ && /\n\z/ !~ s s << "\n" end } do_write(s) nil end
def read(size=nil, buf=nil)
def read(size=nil, buf=nil) if size == 0 if buf buf.clear else buf = "" end return @eof ? nil : buf end until @eof break if size && size <= @rbuffer.size fill_rbuff end ret = consume_rbuff(size) || "" if buf buf.replace(ret) ret = buf end (size && ret.empty?) ? nil : ret end
def read(size=nil, buf=nil)
def read(size=nil, buf=nil) if size == 0 if buf buf.clear return buf else return "" end end until @eof break if size && size <= @rbuffer.size fill_rbuff end ret = consume_rbuff(size) || "" if buf buf.replace(ret) ret = buf end (size && ret.empty?) ? nil : ret end
def read_nonblock(maxlen, buf=nil)
def read_nonblock(maxlen, buf=nil) if maxlen == 0 if buf buf.clear return buf else return "" end end if @rbuffer.empty? return sysread_nonblock(maxlen, buf) end ret = consume_rbuff(maxlen) if buf buf.replace(ret) ret = buf end raise EOFError if ret.empty? ret end
def readchar
def readchar raise EOFError if eof? getc end
def readchar
def readchar raise EOFError if eof? getc end
def readline(eol=$/)
def readline(eol=$/) raise EOFError if eof? gets(eol) end
def readline(eol=$/)
def readline(eol=$/) raise EOFError if eof? gets(eol) end
def readlines(eol=$/)
def readlines(eol=$/) ary = [] while line = self.gets(eol) ary << line end ary end
def readlines(eol=$/)
def readlines(eol=$/) ary = [] while line = self.gets(eol) ary << line end ary end
def readpartial(maxlen, buf=nil)
def readpartial(maxlen, buf=nil) if maxlen == 0 if buf buf.clear else buf = "" end return @eof ? nil : buf end if @rbuffer.empty? begin return sysread(maxlen, buf) rescue Errno::EAGAIN retry end end ret = consume_rbuff(maxlen) if buf buf.replace(ret) ret = buf end raise EOFError if ret.empty? ret end
def readpartial(maxlen, buf=nil)
def readpartial(maxlen, buf=nil) if maxlen == 0 if buf buf.clear return buf else return "" end end if @rbuffer.empty? begin return sysread(maxlen, buf) rescue Errno::EAGAIN retry end end ret = consume_rbuff(maxlen) if buf buf.replace(ret) ret = buf end raise EOFError if ret.empty? ret end
def ungetc(c)
def ungetc(c) @rbuffer[0,0] = c.chr end
def ungetc(c)
def ungetc(c) @rbuffer[0,0] = c.chr end
def write(s)
def write(s) do_write(s) s.length end
def write(s)
def write(s) do_write(s) s.bytesize end
def write_nonblock(s)
def write_nonblock(s) flush syswrite_nonblock(s) end