mechanize 2.12.0 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 991701dfb3f8c11d731e22733ddb6bd158303ff68b3701d8fdcd780228cbc4be
4
- data.tar.gz: 53d0f50ac55ec64c3accc35f69c828477ba2c5efe36921711e8adea1c459da05
3
+ metadata.gz: 7183879e98b1195380219464368f7761a6ee2b9adb3eb18f47b216e740d840d5
4
+ data.tar.gz: 9eaf999bb67a5f7f7625b1a77a4466b88a005d947003b67e155398f3af2b0bf5
5
5
  SHA512:
6
- metadata.gz: edde84f61a68ae2461b621b02e20dc479cab2258f8d005a3a6304f0c18d8829ae9e40c01c4d3f2eef0f24d08cc046035c1432a8b16202095a46f55ed67788fc5
7
- data.tar.gz: 2bdbed0e937a610002095df60ad1bb476f5ddfe521b97044a4dd4102558ddf5a890a5a335fd3f6cb89be1403e91461f7db97ec0f924b3d6c21c95bf837834fd6
6
+ metadata.gz: 3ba304c3a37d0eb98ccbbba83f425a68cb6ad2fb0da5d768a93cc8fd802f691da8fb86d7b6670888a597ca5f3f96ff755d6155197cbd1eef7c8db2442177bd72
7
+ data.tar.gz: db944be6db0079e9740c8e3aaade533baf990efbd87b6ebdbca034eb81a0adef82838fa50fd301f72d23c463109660a3256d0fae7f0154c8393a97b24ab214a1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Mechanize CHANGELOG
2
2
 
3
+ ## 2.12.1 / 2024-08-21
4
+
5
+ * Introduce experimental support for handling Zstd-compressed responses (CRuby only). (#652) @adrianodennanni
6
+
7
+
3
8
  ## 2.12.0 / 2024-07-29
4
9
 
5
10
  * Introduce experimental support for handling Brotli-compressed responses (CRuby only). (#650) @weshatheleopard
data/Gemfile CHANGED
@@ -6,4 +6,7 @@ gem "minitest", "~> 5.14"
6
6
  gem "rake", "~> 13.0"
7
7
  gem "rdoc", "~> 6.3"
8
8
  gem "rubocop", "~> 1.12"
9
- gem "brotli", ">= 0.5" unless RUBY_PLATFORM == "java"
9
+ unless RUBY_PLATFORM == 'java'
10
+ gem 'brotli', '>= 0.5'
11
+ gem 'zstd-ruby', '~> 1.5'
12
+ end
@@ -523,6 +523,35 @@ class Mechanize::HTTP::Agent
523
523
  body_io.close
524
524
  end
525
525
 
526
+ ##
527
+ # Decodes a Zstd-encoded +body_io+
528
+ #
529
+ # (Experimental, CRuby only) Although Mechanize will never request a zstd-encoded response via
530
+ # `accept-encoding`, buggy servers may return zstd-encoded responses, or you might need to
531
+ # inform the zstd keyword on your Accept-Encoding headers. Let's try to handle those cases if
532
+ # the Zstd gem is loaded.
533
+ #
534
+ # If you need to handle Zstd-encoded responses, install the 'zstd-ruby' gem and require it in your
535
+ # application. If the `Zstd` constant is defined, Mechanize will attempt to use it to inflate
536
+ # the response.
537
+ #
538
+ def content_encoding_zstd(body_io)
539
+ log.debug('deflate zstd body') if log
540
+
541
+ unless defined?(::Zstd)
542
+ raise Mechanize::Error, "cannot deflate zstd-encoded response. Please install and require the 'zstd-ruby' gem."
543
+ end
544
+
545
+ begin
546
+ return StringIO.new(Zstd.decompress(body_io.read))
547
+ rescue StandardError
548
+ log.error("unable to zstd#decompress response") if log
549
+ raise Mechanize::Error, "error decompressing zstd-encoded response."
550
+ end
551
+ ensure
552
+ body_io.close
553
+ end
554
+
526
555
  def disable_keep_alive request
527
556
  request['connection'] = 'close' unless @keep_alive
528
557
  end
@@ -861,6 +890,8 @@ class Mechanize::HTTP::Agent
861
890
  content_encoding_gunzip body_io
862
891
  when 'br' then
863
892
  content_encoding_brotli body_io
893
+ when 'zstd' then
894
+ content_encoding_zstd body_io
864
895
  else
865
896
  raise Mechanize::Error,
866
897
  "unsupported content-encoding: #{response['Content-Encoding']}"
@@ -15,11 +15,6 @@ end
15
15
 
16
16
  require 'minitest/autorun'
17
17
 
18
- begin
19
- require 'minitest/pride'
20
- rescue LoadError
21
- end
22
-
23
18
  ##
24
19
  # A generic test case for testing mechanize. Using a subclass of
25
20
  # Mechanize::TestCase for your tests will create an isolated mechanize
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  class Mechanize
3
- VERSION = "2.12.0"
3
+ VERSION = "2.12.1"
4
4
  end
@@ -2,7 +2,10 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'mechanize/test_case'
5
- require "brotli" unless RUBY_PLATFORM == "java"
5
+ unless RUBY_PLATFORM == 'java'
6
+ require 'brotli'
7
+ require 'zstd-ruby'
8
+ end
6
9
 
7
10
  class TestMechanizeHttpAgent < Mechanize::TestCase
8
11
 
@@ -965,6 +968,46 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
965
968
  assert(body_io.closed?)
966
969
  end
967
970
 
971
+ def test_response_content_encoding_zstd_when_zstd_not_loaded
972
+ skip("only test this on jruby which doesn't have zstd support") unless RUBY_ENGINE == 'jruby'
973
+
974
+ @res.instance_variable_set :@header, 'content-encoding' => %w[zstd]
975
+ body_io = StringIO.new("content doesn't matter for this test")
976
+
977
+ e = assert_raises(Mechanize::Error) do
978
+ @agent.response_content_encoding(@res, body_io)
979
+ end
980
+ assert_includes(e.message, 'cannot deflate zstd-encoded response')
981
+
982
+ assert(body_io.closed?)
983
+ end
984
+
985
+ def test_response_content_encoding_zstd
986
+ skip('jruby does not have zstd support') if RUBY_ENGINE == 'jruby'
987
+
988
+ @res.instance_variable_set :@header, 'content-encoding' => %w[zstd]
989
+ body_io = StringIO.new(Zstd.compress('this is compressed by zstd'))
990
+
991
+ body = @agent.response_content_encoding(@res, body_io)
992
+
993
+ assert_equal('this is compressed by zstd', body.read)
994
+ assert(body_io.closed?)
995
+ end
996
+
997
+ def test_response_content_encoding_zstd_corrupt
998
+ skip('jruby does not have zstd support') if RUBY_ENGINE == 'jruby'
999
+
1000
+ @res.instance_variable_set :@header, 'content-encoding' => %w[zstd]
1001
+ body_io = StringIO.new('not a zstd payload')
1002
+
1003
+ e = assert_raises(Mechanize::Error) do
1004
+ @agent.response_content_encoding(@res, body_io)
1005
+ end
1006
+ assert_includes(e.message, 'error decompressing zstd-encoded response')
1007
+ assert_kind_of(RuntimeError, e.cause)
1008
+ assert(body_io.closed?)
1009
+ end
1010
+
968
1011
  def test_response_content_encoding_gzip_corrupt
969
1012
  log = StringIO.new
970
1013
  logger = Logger.new log
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mechanize
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.12.0
4
+ version: 2.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Hodel
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2024-07-29 00:00:00.000000000 Z
15
+ date: 2024-08-21 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: addressable