diff --git a/lib/rubygems.rb b/lib/rubygems.rb index b7dda38d52..40f3a893d8 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -800,7 +800,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]} ## # Safely write a file in binary mode on all platforms. def self.write_binary(path, data) - File.open(path, File::RDWR | File::CREAT | File::BINARY | File::LOCK_EX) do |io| + File.open(path, File::RDWR | File::CREAT | File::LOCK_EX, binmode: true) do |io| io.write data end rescue *WRITE_BINARY_ERRORS diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index 5ce420b91a..3ce9be7c90 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -173,6 +173,21 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== assert_equal 'hello', File.read(path) end + def test_cache_update_path_with_utf8_internal_encoding + with_internal_encoding('UTF-8') do + uri = URI 'http://example/file' + path = File.join @tempdir, 'file' + data = String.new("\xC8").force_encoding(Encoding::BINARY) + + fetcher = util_fuck_with_fetcher data + + written_data = fetcher.cache_update_path uri, path + + assert_equal data, written_data + assert_equal data, File.binread(path) + end + end + def test_cache_update_path_no_update uri = URI 'http://example/file' path = File.join @tempdir, 'file'