Class: StompServer::StompFrameRecognizer

Inherits:
Object
  • Object
show all
Defined in:
lib/stomp_server/stomp_frame.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeStompFrameRecognizer

Returns a new instance of StompFrameRecognizer.



32
33
34
35
36
37
# File 'lib/stomp_server/stomp_frame.rb', line 32

def initialize
  @buffer = ''
  @body_length = nil
  @frame = StompServer::StompFrame.new
  @frames = []
end

Instance Attribute Details

#framesObject

Returns the value of attribute frames.



30
31
32
# File 'lib/stomp_server/stomp_frame.rb', line 30

def frames
  @frames
end

Instance Method Details

#<<(buf) ⇒ Object



91
92
93
94
# File 'lib/stomp_server/stomp_frame.rb', line 91

def<< (buf)
  @buffer << buf
  parse
end

#parseObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/stomp_server/stomp_frame.rb', line 74

def parse
  count = @frames.size
  
  parse_header unless @frame.command
  if @frame.command
    if @body_length
      parse_binary_body
    else
      parse_text_body
    end
  end
  
  # parse_XXX_body return the frame if they succeed and nil if they fail
  # the result will fall through
  parse if count != @frames.size
end

#parse_binary_bodyObject



47
48
49
50
51
# File 'lib/stomp_server/stomp_frame.rb', line 47

def parse_binary_body
  if @buffer.length > @body_length
    parse_body(@body_length)
  end
end

#parse_body(len) ⇒ Object

Raises:

  • (RuntimeError)


39
40
41
42
43
44
45
# File 'lib/stomp_server/stomp_frame.rb', line 39

def parse_body(len)
  raise RuntimeError.new("Invalid stompframe (missing null term)") unless @buffer[len] == 0
  @frame.body = @buffer[0...len]
  @buffer = @buffer[len+1..-1]
  @frames << @frame
  @frame = StompServer::StompFrame.new
end

#parse_headerObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/stomp_server/stomp_frame.rb', line 59

def parse_header
  if match = @buffer.match(/^\s*(\S+)$\r?\n((?:[ \t]*.*?[ \t]*:[ \t]*.*?[ \t]*$\r?\n)*)\r?\n/)
    @frame.command, headers = match.captures
    @buffer = match.post_match
    headers.split(/\n/).each do |data|
      if data =~ /^\s*(\S+)\s*:\s*(.*?)\s*$/
        @frame.headers[$1] = $2
      end
    end
    
    # body_length is nil, if there is no content-length, otherwise it is the length (as in integer)
    @body_length = @frame.headers['content-length'] && @frame.headers['content-length'].to_i
  end
end

#parse_text_bodyObject



53
54
55
56
57
# File 'lib/stomp_server/stomp_frame.rb', line 53

def parse_text_body
  if pos = @buffer.index(0)
    parse_body(pos)
  end
end