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

ruby-changes:62364

From: nagachika <ko1@a...>
Date: Thu, 23 Jul 2020 11:11:25 +0900 (JST)
Subject: [ruby-changes:62364] cc39480cf9 (ruby_2_7): merge revision(s) 5a79d8e0507cd143100bf928a88a59a8b5a5bca6,160511d851375f7cb922faae3a9310633187f51f: [Backport #16925]

https://git.ruby-lang.org/ruby.git/commit/?id=cc39480cf9

From cc39480cf9f2767967b6bcc69ccb3c201e5b2231 Mon Sep 17 00:00:00 2001
From: nagachika <nagachika@r...>
Date: Thu, 23 Jul 2020 11:11:12 +0900
Subject: merge revision(s)
 5a79d8e0507cd143100bf928a88a59a8b5a5bca6,160511d851375f7cb922faae3a9310633187f51f:
 [Backport #16925]

	Fix error raised by Net::HTTPResponse#inflater if the block raises

	* See https://bugs.ruby-lang.org/issues/13882#note-6

	Quarantine specs which fail frequently with CHECK_LEAKS=true

diff --git a/lib/net/http/response.rb b/lib/net/http/response.rb
index 5a94f95..08eaeb2 100644
--- a/lib/net/http/response.rb
+++ b/lib/net/http/response.rb
@@ -268,12 +268,13 @@ class Net::HTTPResponse https://github.com/ruby/ruby/blob/trunk/lib/net/http/response.rb#L268
 
       begin
         yield inflate_body_io
+        success = true
       ensure
-        orig_err = $!
         begin
           inflate_body_io.finish
         rescue => err
-          raise orig_err || err
+          # Ignore #finish's error if there is an exception from yield
+          raise err if success
         end
       end
     when 'none', 'identity' then
diff --git a/spec/ruby/library/net/http/http/get_spec.rb b/spec/ruby/library/net/http/http/get_spec.rb
index 4b8af59..e6cd50f 100644
--- a/spec/ruby/library/net/http/http/get_spec.rb
+++ b/spec/ruby/library/net/http/http/get_spec.rb
@@ -24,3 +24,72 @@ describe "Net::HTTP.get when passed URI" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/library/net/http/http/get_spec.rb#L24
     end
   end
 end
+
+quarantine! do # These specs fail frequently with CHECK_LEAKS=true
+describe "Net::HTTP.get" do
+  describe "when reading gzipped contents" do
+    def start_threads
+      require 'zlib'
+
+      server = nil
+      server_thread = Thread.new do
+        server = TCPServer.new("127.0.0.1", 0)
+        begin
+          c = server.accept
+        ensure
+          server.close
+        end
+        c.print "HTTP/1.1 200\r\n"
+        c.print "Content-Type: text/plain\r\n"
+        c.print "Content-Encoding: gzip\r\n"
+        s = StringIO.new
+        z = Zlib::GzipWriter.new(s)
+        begin
+          z.write 'Hello World!'
+        ensure
+          z.close
+        end
+        c.print "Content-Length: #{s.length}\r\n\r\n"
+        # Write partial gzip content
+        c.write s.string.byteslice(0..-2)
+        c.flush
+        c
+      end
+      Thread.pass until server && server_thread.stop?
+
+      client_thread = Thread.new do
+        Thread.current.report_on_exception = false
+        Net::HTTP.get("127.0.0.1", '/', server.connect_address.ip_port)
+      end
+      Thread.pass until client_thread.stop?
+
+      [server_thread, client_thread]
+    end
+
+    it "propagates exceptions interrupting the thread and does not replace it with Zlib::BufError" do
+      my_exception = Class.new(RuntimeError)
+      server_thread, client_thread = start_threads
+      socket = server_thread.value
+      begin
+        client_thread.raise my_exception, "my exception"
+        -> { client_thread.value }.should raise_error(my_exception)
+      ensure
+        socket.close
+      end
+    end
+
+    ruby_version_is "2.8" do # https://bugs.ruby-lang.org/issues/13882#note-6
+      it "lets the kill Thread exception goes through and does not replace it with Zlib::BufError" do
+        server_thread, client_thread = start_threads
+        socket = server_thread.value
+        begin
+          client_thread.kill
+          client_thread.value.should == nil
+        ensure
+          socket.close
+        end
+      end
+    end
+  end
+end
+end
diff --git a/version.h b/version.h
index f7f94bf..bbb9fc4 100644
--- a/version.h
+++ b/version.h
@@ -2,11 +2,11 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L2
 # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 97
+#define RUBY_PATCHLEVEL 98
 
 #define RUBY_RELEASE_YEAR 2020
 #define RUBY_RELEASE_MONTH 7
-#define RUBY_RELEASE_DAY 19
+#define RUBY_RELEASE_DAY 23
 
 #include "ruby/version.h"
 
-- 
cgit v0.10.2


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

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