class ObjectFramework::HTTP::Reader
Attributes
Public Class Methods
Source
# File lib/object_framework/http/io.rb, line 23 def initialize(io:, buffer: +"".b, waiter: nil) @io, @buffer = io, buffer @waiter = waiter || ->(mode, deadline) { Timing.wait(io, mode, deadline) } end
Public Instance Methods
Source
# File lib/object_framework/http/io.rb, line 51 def read_exact(count, deadline:) buffer << read_chunk(deadline:) while buffer.bytesize < count buffer.slice!(0, count) end
Source
# File lib/object_framework/http/io.rb, line 28 def read_head(parser, header_timeout:, idle_timeout:, idle: false) started = !idle || !buffer.empty? deadline = Timing.now + (started ? header_timeout : idle_timeout) loop do first_line = buffer.index("\r\n") raise URITooLong if (first_line || buffer.bytesize) > parser.line_limit if (finish = buffer.index("\r\n\r\n")) return parser.parse_head(buffer.slice!(0, finish + 4)) end raise HeadersTooLarge if first_line && buffer.bytesize - first_line - 2 > parser.header_limit buffer << read_chunk(deadline:) unless started started, deadline = true, Timing.now + header_timeout end end rescue RequestTimeout raise EOFError if idle && !started raise rescue EOFError raise BadRequest unless buffer.empty? raise end
Source
# File lib/object_framework/http/io.rb, line 56 def read_line(limit:, deadline:) loop do if (finish = buffer.index("\r\n")) raise HeadersTooLarge if finish > limit return buffer.slice!(0, finish + 2).delete_suffix("\r\n") end raise HeadersTooLarge if buffer.bytesize > limit buffer << read_chunk(deadline:) end end
Source
# File lib/object_framework/http/io.rb, line 67 def write(bytes, deadline:) offset = 0 while offset < bytes.bytesize raise RequestTimeout if Timing.now >= deadline result = io.write_nonblock(bytes.byteslice(offset..), exception: false) case result when :wait_readable then waiter.call(:read, deadline) when :wait_writable then waiter.call(:write, deadline) else offset += result yield result if block_given? end end end