[前][次][番号順一覧][スレッド一覧]

ruby-changes:46729

From: shugo <ko1@a...>
Date: Mon, 22 May 2017 15:13:17 +0900 (JST)
Subject: [ruby-changes:46729] shugo:r58844 (trunk): net/imap: separate @continuation_request_exception from @exception

shugo	2017-05-22 15:13:11 +0900 (Mon, 22 May 2017)

  New Revision: 58844

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58844

  Log:
    net/imap: separate @continuation_request_exception from @exception
    
    Otherwise literal data will be sent even if NO response is returned
    because @exception is set to nil in receive_responses.

  Modified files:
    trunk/lib/net/imap.rb
    trunk/test/net/imap/test_imap.rb
Index: lib/net/imap.rb
===================================================================
--- lib/net/imap.rb	(revision 58843)
+++ lib/net/imap.rb	(revision 58844)
@@ -1100,6 +1100,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1100
         @tagged_response_arrival = new_cond
         @continued_command_tag = nil
         @continuation_request_arrival = new_cond
+        @continuation_request_exception = nil
         @idle_done_cond = nil
         @logout_command_tag = nil
         @debug_output_bol = true
@@ -1165,7 +1166,8 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1166
               when @logout_command_tag
                 return
               when @continued_command_tag
-                @exception = RESPONSE_ERRORS[resp.name].new(resp)
+                @continuation_request_exception =
+                  RESPONSE_ERRORS[resp.name].new(resp)
                 @continuation_request_arrival.signal
               end
             when UntaggedResponse
@@ -1351,14 +1353,19 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1353
     end
 
     def send_literal(str, tag)
-      put_string("{" + str.bytesize.to_s + "}" + CRLF)
-      @continued_command_tag = tag
-      begin
-        @continuation_request_arrival.wait
-        raise @exception if @exception
-        put_string(str)
-      ensure
-        @continued_command_tag = nil
+      synchronize do
+        put_string("{" + str.bytesize.to_s + "}" + CRLF)
+        @continued_command_tag = tag
+        @continuation_request_exception = nil
+        begin
+          @continuation_request_arrival.wait
+          e = @continuation_request_exception || @exception
+          raise e if e
+          put_string(str)
+        ensure
+          @continued_command_tag = nil
+          @continuation_request_exception = nil
+        end
       end
     end
 
Index: test/net/imap/test_imap.rb
===================================================================
--- test/net/imap/test_imap.rb	(revision 58843)
+++ test/net/imap/test_imap.rb	(revision 58844)
@@ -582,7 +582,7 @@ EOF https://github.com/ruby/ruby/blob/trunk/test/net/imap/test_imap.rb#L582
         received_mail = sock.read(size)
         sock.gets
         sock.print("RUBY0001 OK APPEND completed\r\n")
-        sock.gets
+        requests.push(sock.gets)
         sock.print("* BYE terminating connection\r\n")
         sock.print("RUBY0002 OK LOGOUT completed\r\n")
       ensure
@@ -598,6 +598,8 @@ EOF https://github.com/ruby/ruby/blob/trunk/test/net/imap/test_imap.rb#L598
       assert_equal("RUBY0001 APPEND INBOX {#{mail.size}}\r\n", requests[0])
       assert_equal(mail, received_mail)
       imap.logout
+      assert_equal(2, requests.length)
+      assert_equal("RUBY0002 LOGOUT\r\n", requests[1])
     ensure
       imap.disconnect if imap
     end
@@ -619,10 +621,9 @@ EOF https://github.com/ruby/ruby/blob/trunk/test/net/imap/test_imap.rb#L621
       sock = server.accept
       begin
         sock.print("* OK test server\r\n")
-        line = sock.gets
-        requests.push(line)
+        requests.push(sock.gets)
         sock.print("RUBY0001 NO Mailbox doesn't exist\r\n")
-        sock.gets
+        requests.push(sock.gets)
         sock.print("* BYE terminating connection\r\n")
         sock.print("RUBY0002 OK LOGOUT completed\r\n")
       ensure
@@ -639,6 +640,8 @@ EOF https://github.com/ruby/ruby/blob/trunk/test/net/imap/test_imap.rb#L640
       assert_equal(1, requests.length)
       assert_equal("RUBY0001 APPEND INBOX {#{mail.size}}\r\n", requests[0])
       imap.logout
+      assert_equal(2, requests.length)
+      assert_equal("RUBY0002 LOGOUT\r\n", requests[1])
     ensure
       imap.disconnect if imap
     end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]