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

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_dataObject

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

#unbindObject

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