diff options
-rw-r--r-- | lib/net/imap.rb | 14 | ||||
-rw-r--r-- | test/net/imap/test_imap.rb | 37 |
2 files changed, 44 insertions, 7 deletions
diff --git a/lib/net/imap.rb b/lib/net/imap.rb index b42186dce0..61ce520177 100644 --- a/lib/net/imap.rb +++ b/lib/net/imap.rb @@ -1325,11 +1325,11 @@ module Net when nil put_string("NIL") when String - send_string_data(data) + send_string_data(data, tag) when Integer send_number_data(data) when Array - send_list_data(data) + send_list_data(data, tag) when Time send_time_data(data) when Symbol @@ -1339,13 +1339,13 @@ module Net end end - def send_string_data(str) + def send_string_data(str, tag = nil) case str when "" put_string('""') when /[\x80-\xff\r\n]/n # literal - send_literal(str) + send_literal(str, tag) when /[(){ \x00-\x1f\x7f%*"\\]/n # quoted string send_quoted_string(str) @@ -1358,7 +1358,7 @@ module Net put_string('"' + str.gsub(/["\\]/n, "\\\\\\&") + '"') end - def send_literal(str, tag) + def send_literal(str, tag = nil) synchronize do put_string("{" + str.bytesize.to_s + "}" + CRLF) @continued_command_tag = tag @@ -1379,7 +1379,7 @@ module Net put_string(num.to_s) end - def send_list_data(list) + def send_list_data(list, tag = nil) put_string("(") first = true list.each do |i| @@ -1388,7 +1388,7 @@ module Net else put_string(" ") end - send_data(i) + send_data(i, tag) end put_string(")") end diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb index 38ea84cc21..41f25fe1c7 100644 --- a/test/net/imap/test_imap.rb +++ b/test/net/imap/test_imap.rb @@ -530,6 +530,43 @@ class IMAPTest < Test::Unit::TestCase end end + def test_send_literal + server = create_tcp_server + port = server.addr[1] + requests = [] + literal = nil + @threads << Thread.start do + sock = server.accept + begin + sock.print("* OK test server\r\n") + line = sock.gets + requests.push(line) + size = line.slice(/{(\d+)}\r\n/, 1).to_i + sock.print("+ Ready for literal data\r\n") + literal = sock.read(size) + requests.push(sock.gets) + sock.print("RUBY0001 OK TEST completed\r\n") + sock.gets + sock.print("* BYE terminating connection\r\n") + sock.print("RUBY0002 OK LOGOUT completed\r\n") + ensure + sock.close + server.close + end + end + begin + imap = Net::IMAP.new(server_addr, :port => port) + imap.send(:send_command, "TEST", ["\xDE\xAD\xBE\xEF".b]) + assert_equal(2, requests.length) + assert_equal("RUBY0001 TEST ({4}\r\n", requests[0]) + assert_equal("\xDE\xAD\xBE\xEF".b, literal) + assert_equal(")\r\n", requests[1]) + imap.logout + ensure + imap.disconnect + end + end + def test_disconnect server = create_tcp_server port = server.addr[1] |