Class: AMQP::Framing::String::Frame

Inherits:
AMQ::Protocol::Frame
  • Object
show all
Defined in:
lib/amqp/framing/string/frame.rb

Constant Summary collapse

ENCODINGS_SUPPORTED =
defined? Encoding
HEADER_SLICE =
(0..6).freeze
DATA_SLICE =
(7..-1).freeze
PAYLOAD_SLICE =
(0..-2).freeze

Class Method Summary collapse

Class Method Details

.decode(string) ⇒ Object

Raises:

  • (NoFinalOctetError)


14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/amqp/framing/string/frame.rb', line 14

def self.decode(string)
  header              = string[HEADER_SLICE]
  type, channel, size = self.decode_header(header)
  data                = string[DATA_SLICE]
  payload             = data[PAYLOAD_SLICE]
  frame_end           = data[-1, 1]

  frame_end.force_encoding(AMQ::Protocol::Frame::FINAL_OCTET.encoding) if ENCODINGS_SUPPORTED

  # 1) the size is miscalculated
  if payload.bytesize != size
    raise BadLengthError.new(size, payload.bytesize)
  end

  # 2) the size is OK, but the string doesn't end with FINAL_OCTET
  raise NoFinalOctetError.new if frame_end != AMQ::Protocol::Frame::FINAL_OCTET

  self.new(type, payload, channel)
end