Module: Dizby::ReadableStream
- Included in:
- Messenger
- Defined in:
- lib/dizby/stream/readable.rb
Instance Method Summary collapse
- #check_packet_size(sz) private
- #load_obj(marshalled_str) private
- #load_packet(sz) private
- #load_size private
- #read
Instance Method Details
#check_packet_size(sz) (private)
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/dizby/stream/readable.rb', line 56 def check_packet_size(sz) fail RemoteServerShutdown unless sz fail ConnectionError, 'premature header' if sz.size < 4 sz = sz.unpack('N')[0] # load_limit must be greater than the size of the packet # or the load_limit can be 0 or less to be considered "infinite" if @server.load_limit.between?(0, sz) fail ConnectionError, "too large packet for #{sz}" end sz end |
#load_obj(marshalled_str) (private)
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/dizby/stream/readable.rb', line 41 def load_obj(marshalled_str) @server.log.debug("loading data: #{marshalled_str.inspect}") obj = Marshal.load(marshalled_str) @server.log.debug("loaded: #{obj.inspect}") # get a local object or create the proxy using the current server # done here since marshalling doesn't know about the current server obj = obj.evaluate(@server) if obj.is_a?(SemiObjectProxy) obj rescue NameError, ArgumentError @server.log.debug("unknown: #{$!.inspect} #{$!.backtrace}") UnknownObject.new($!, marshalled_str) end |
#load_packet(sz) (private)
35 36 37 38 39 |
# File 'lib/dizby/stream/readable.rb', line 35 def load_packet(sz) @stream.read(sz) rescue raise ConnectionError, $!., $!.backtrace end |
#load_size (private)
29 30 31 32 33 |
# File 'lib/dizby/stream/readable.rb', line 29 def load_size @stream.read(4) rescue raise ConnectionError, $!., $!.backtrace end |
#read
12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/dizby/stream/readable.rb', line 12 def read sz = check_packet_size(load_size) str = load_packet(sz) fail ConnectionError, 'connection closed' unless str if str.size < sz fail ConnectionError, 'premature marshal format(can\'t read)' end load_obj(str) # TODO: un-tainting??? end |