Module: ASIR::Transport::PayloadIO

Included in:
ConnectionOriented, File
Defined in:
lib/asir/transport/payload_io.rb

Overview

!SLIDE Payload IO for Transport

Framing

  • Header line containing the number of bytes in the payload.

  • The payload bytes.

  • Blank line.

  • Footer.

Defined Under Namespace

Classes: UnexpectedResponse

Constant Summary collapse

HEADER =
"# asir_payload_size: "
"\n# asir_payload_end"

Instance Method Summary collapse

Instance Method Details

#_read(stream, state) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/asir/transport/payload_io.rb', line 26

def _read stream, state
  size = /\d+$/.match(stream.readline.chomp)[0].to_i # HEADER (size)
  payload = stream.read(size)
  stream.readline # FOOTER
  stream.readline
  payload
end

#_read_line_and_expect!(stream, regexp) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/asir/transport/payload_io.rb', line 34

def _read_line_and_expect! stream, regexp
  line = stream.readline
  unless match = regexp.match(line)
    _log { "_read_line_and_expect! #{stream} #{regexp.inspect} !~ #{line.inspect}" }
    raise UnexpectedResponse, "expected #{regexp.inspect}, received #{line.inspect}"
  end
  match
end

#_write(payload, stream, state) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/asir/transport/payload_io.rb', line 17

def _write payload, stream, state
  stream.write HEADER
  stream.puts payload.size
  stream.write payload
  stream.puts FOOTER
  stream.flush
  stream
end

#closeObject

!SLIDE pause



44
45
46
47
48
49
50
51
# File 'lib/asir/transport/payload_io.rb', line 44

def close
  if @stream
    _before_close! stream if respond_to?(:_before_close!)
    @stream.close
  end
ensure
  @stream = nil unless Channel === @stream
end