Module: EventMachine::Protocols::LineText2
- Included in:
- HeaderAndContentProtocol, HttpClient2, SmtpClient, SmtpServer, Stomp
- Defined in:
- lib/protocols/linetext2.rb
Constant Summary collapse
- MaxLineLength =
16*1024
- MaxBinaryLength =
32*1024*1024
Instance Method Summary collapse
-
#receive_binary_data(data) ⇒ Object
Stub.
-
#receive_data(data) ⇒ Object
– Will be called recursively until there’s no data to read.
-
#receive_end_of_binary_data ⇒ Object
Stub.
-
#receive_line(ln) ⇒ Object
Stub.
-
#set_binary_mode(size = nil) ⇒ Object
Alias for #set_text_mode, added for back-compatibility with LineAndTextProtocol.
- #set_delimiter(delim) ⇒ Object
-
#set_line_mode(data = "") ⇒ Object
Called internally but also exposed to user code, for the case in which processing of binary data creates a need to transition back to line mode.
- #set_text_mode(size = nil) ⇒ Object
-
#unbind ⇒ Object
In case of a dropped connection, we’ll send a partial buffer to user code when in sized text mode.
Instance Method Details
#receive_binary_data(data) ⇒ Object
Stub. Should be subclassed by user code.
149 150 151 |
# File 'lib/protocols/linetext2.rb', line 149 def receive_binary_data data # no-op end |
#receive_data(data) ⇒ Object
– Will be called recursively until there’s no data to read. That way the user-defined handlers we call can modify the handling characteristics on a per-token basis.
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/protocols/linetext2.rb', line 51 def receive_data data return unless (data and data.length > 0) # Do this stuff in lieu of a constructor. @lt2_mode ||= :lines @lt2_delimiter ||= "\n" @lt2_linebuffer ||= [] if @lt2_mode == :lines if ix = data.index( @lt2_delimiter ) @lt2_linebuffer << data[0...ix] ln = @lt2_linebuffer.join @lt2_linebuffer.clear if @lt2_delimiter == "\n" ln.chomp! end receive_line ln receive_data data[(ix+@lt2_delimiter.length)..-1] else @lt2_linebuffer << data end elsif @lt2_mode == :text if @lt2_textsize needed = @lt2_textsize - @lt2_textpos will_take = if data.length > needed needed else data.length end @lt2_textbuffer << data[0...will_take] tail = data[will_take..-1] @lt2_textpos += will_take if @lt2_textpos >= @lt2_textsize # Reset line mode (the default behavior) BEFORE calling the # receive_binary_data. This makes it possible for user code # to call set_text_mode, enabling chains of text blocks # (which can possibly be of different sizes). set_line_mode receive_binary_data @lt2_textbuffer.join receive_end_of_binary_data end receive_data tail else receive_binary_data data end end end |
#receive_end_of_binary_data ⇒ Object
Stub. Should be subclassed by user code. This is called when transitioning internally from text mode back to line mode. Useful when client code doesn’t want to keep track of how much data it’s received.
157 158 159 |
# File 'lib/protocols/linetext2.rb', line 157 def receive_end_of_binary_data # no-op end |
#receive_line(ln) ⇒ Object
Stub. Should be subclassed by user code.
144 145 146 |
# File 'lib/protocols/linetext2.rb', line 144 def receive_line ln # no-op end |
#set_binary_mode(size = nil) ⇒ Object
Alias for #set_text_mode, added for back-compatibility with LineAndTextProtocol.
130 131 132 |
# File 'lib/protocols/linetext2.rb', line 130 def set_binary_mode size=nil set_text_mode size end |
#set_delimiter(delim) ⇒ Object
103 104 105 |
# File 'lib/protocols/linetext2.rb', line 103 def set_delimiter delim @lt2_delimiter = delim.to_s end |
#set_line_mode(data = "") ⇒ Object
Called internally but also exposed to user code, for the case in which processing of binary data creates a need to transition back to line mode. We support an optional parameter to “throw back” some data, which might be an umprocessed chunk of the transmitted binary data, or something else entirely.
112 113 114 115 116 |
# File 'lib/protocols/linetext2.rb', line 112 def set_line_mode data="" @lt2_mode = :lines (@lt2_linebuffer ||= []).clear receive_data data.to_s end |
#set_text_mode(size = nil) ⇒ Object
118 119 120 121 122 123 124 125 126 127 |
# File 'lib/protocols/linetext2.rb', line 118 def set_text_mode size=nil if size == 0 set_line_mode else @lt2_mode = :text (@lt2_textbuffer ||= []).clear @lt2_textsize = size # which can be nil, signifying no limit @lt2_textpos = 0 end end |
#unbind ⇒ Object
In case of a dropped connection, we’ll send a partial buffer to user code when in sized text mode. User overrides of #receive_binary_data need to be aware that they may get a short buffer.
137 138 139 140 141 |
# File 'lib/protocols/linetext2.rb', line 137 def unbind if @lt2_mode == :text and @lt2_textpos > 0 receive_binary_data @lt2_textbuffer.join end end |