Skip to content

Commit b32b675

Browse files
committed
♻️ Save ResponseReader ivars: @buff & @literal_size
This avoids the need to pass these to every method that uses them. That's not a big deal now, but it simplifies the next few changes. Also added a missing test for empty literals: "{0}\r\n"
1 parent d28879e commit b32b675

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

lib/net/imap/response_reader.rb

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,34 @@ def initialize(client, sock)
1111
end
1212

1313
def read_response_buffer
14-
buff = String.new
14+
@buff = String.new
1515
catch :eof do
1616
while true
17-
read_line(buff)
18-
break unless /\{(\d+)\}\r\n\z/n =~ buff
19-
read_literal(buff, $1.to_i)
17+
read_line
18+
break unless (@literal_size = get_literal_size)
19+
read_literal
2020
end
2121
end
2222
buff
23+
ensure
24+
@buff = nil
2325
end
2426

2527
private
2628

27-
def read_line(buff)
29+
attr_reader :buff, :literal_size
30+
31+
def get_literal_size = /\{(\d+)\}\r\n\z/n =~ buff && $1.to_i
32+
33+
def read_line
2834
buff << (@sock.gets(CRLF) or throw :eof)
2935
end
3036

31-
def read_literal(buff, literal_size)
37+
def read_literal
3238
literal = String.new(capacity: literal_size)
3339
buff << (@sock.read(literal_size, literal) or throw :eof)
40+
ensure
41+
@literal_size = nil
3442
end
3543

3644
end

test/net/imap/test_response_reader.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ def literal(str) = "{#{str.bytesize}}\r\n#{str}"
2424
long_line = "tag ok #{aaaaaaaaa} #{aaaaaaaaa}\r\n"
2525
literal_aaaa = "* fake #{literal aaaaaaaaa}\r\n"
2626
literal_crlf = "tag ok #{literal many_crlfs} #{literal many_crlfs}\r\n"
27+
zero_literal = "tag ok #{literal ""} #{literal ""}\r\n"
2728
illegal_crs = "tag ok #{many_crs} #{many_crs}\r\n"
2829
illegal_lfs = "tag ok #{literal "\r"}\n#{literal "\r"}\n\r\n"
2930
io = StringIO.new([
3031
simple,
3132
long_line,
3233
literal_aaaa,
3334
literal_crlf,
35+
zero_literal,
3436
illegal_crs,
3537
illegal_lfs,
3638
simple,
@@ -40,6 +42,7 @@ def literal(str) = "{#{str.bytesize}}\r\n#{str}"
4042
assert_equal long_line, rcvr.read_response_buffer.to_str
4143
assert_equal literal_aaaa, rcvr.read_response_buffer.to_str
4244
assert_equal literal_crlf, rcvr.read_response_buffer.to_str
45+
assert_equal zero_literal, rcvr.read_response_buffer.to_str
4346
assert_equal illegal_crs, rcvr.read_response_buffer.to_str
4447
assert_equal illegal_lfs, rcvr.read_response_buffer.to_str
4548
assert_equal simple, rcvr.read_response_buffer.to_str

0 commit comments

Comments
 (0)