Skip to content

Commit 10db63c

Browse files
committed
✨ Add greeting code data to responses
This simplifies caching of the server capabilities, as many servers will send their capabilities inside the greeting. Needed for #31.
1 parent 89ae479 commit 10db63c

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

lib/net/imap.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,7 @@ def initialize(host, port_or_options = {},
21342134
else
21352135
@usessl = false
21362136
end
2137-
@responses = Hash.new([].freeze)
2137+
@responses = Hash.new {|h, k| h[k] = [] }
21382138
@tagged_responses = {}
21392139
@response_handlers = []
21402140
@tagged_response_arrival = new_cond
@@ -2150,6 +2150,7 @@ def initialize(host, port_or_options = {},
21502150
if @greeting.nil?
21512151
raise Error, "connection closed"
21522152
end
2153+
record_untagged_response_code(@greeting)
21532154
if @greeting.name == "BYE"
21542155
raise ByeResponseError, @greeting
21552156
end
@@ -2214,10 +2215,7 @@ def receive_responses
22142215
end
22152216
when UntaggedResponse
22162217
record_response(resp.name, resp.data)
2217-
if resp.data.instance_of?(ResponseText) &&
2218-
(code = resp.data.code)
2219-
record_response(code.name, code.data)
2220-
end
2218+
record_untagged_response_code(resp)
22212219
if resp.name == "BYE" && @logout_command_tag.nil?
22222220
@sock.close
22232221
@exception = ByeResponseError.new(resp)
@@ -2295,6 +2293,13 @@ def get_response
22952293
return @parser.parse(buff)
22962294
end
22972295

2296+
def record_untagged_response_code(resp)
2297+
if resp.data.instance_of?(ResponseText) &&
2298+
(code = resp.data.code)
2299+
record_response(code.name, code.data)
2300+
end
2301+
end
2302+
22982303
def record_response(name, data)
22992304
unless @responses.has_key?(name)
23002305
@responses[name] = []

test/net/imap/test_imap.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,12 @@ def test_responses
928928
end
929929
begin
930930
imap = Net::IMAP.new(server_addr, port: port)
931+
# responses available before SELECT/EXAMINE
932+
assert_equal(%w[IMAP4REV1 AUTH=PLAIN STARTTLS],
933+
imap.responses("CAPABILITY", &:last))
931934
resp = imap.select "INBOX"
935+
# responses are cleared after SELECT/EXAMINE
936+
assert_equal(nil, imap.responses("CAPABILITY", &:last))
932937
assert_equal([Net::IMAP::TaggedResponse, "RUBY0001", "OK"],
933938
[resp.class, resp.tag, resp.name])
934939
assert_equal([172], imap.responses { _1["EXISTS"] })

0 commit comments

Comments
 (0)