mechanize 2.11.0 → 2.12.0
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile +6 -0
- data/lib/mechanize/http/agent.rb +30 -0
- data/lib/mechanize/version.rb +1 -1
- data/mechanize.gemspec +0 -5
- data/test/test_mechanize_http_agent.rb +41 -0
- metadata +2 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 991701dfb3f8c11d731e22733ddb6bd158303ff68b3701d8fdcd780228cbc4be
|
4
|
+
data.tar.gz: 53d0f50ac55ec64c3accc35f69c828477ba2c5efe36921711e8adea1c459da05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edde84f61a68ae2461b621b02e20dc479cab2258f8d005a3a6304f0c18d8829ae9e40c01c4d3f2eef0f24d08cc046035c1432a8b16202095a46f55ed67788fc5
|
7
|
+
data.tar.gz: 2bdbed0e937a610002095df60ad1bb476f5ddfe521b97044a4dd4102558ddf5a890a5a335fd3f6cb89be1403e91461f7db97ec0f924b3d6c21c95bf837834fd6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Mechanize CHANGELOG
|
2
2
|
|
3
|
+
## 2.12.0 / 2024-07-29
|
4
|
+
|
5
|
+
* Introduce experimental support for handling Brotli-compressed responses (CRuby only). (#650) @weshatheleopard
|
6
|
+
|
7
|
+
|
3
8
|
## 2.11.0 / 2024-07-18
|
4
9
|
|
5
10
|
* The `accept-charset` header is no longer sent. In early versions of Mechanize, circa 2007, this was a common header but now no modern browser sends it, and servers are instructed to ignore it. See #646 for an example of a server that is confused by its presence. (#647) @flavorjones
|
data/Gemfile
CHANGED
data/lib/mechanize/http/agent.rb
CHANGED
@@ -495,6 +495,34 @@ class Mechanize::HTTP::Agent
|
|
495
495
|
body_io.close
|
496
496
|
end
|
497
497
|
|
498
|
+
##
|
499
|
+
# Decodes a Brotli-encoded +body_io+
|
500
|
+
#
|
501
|
+
# (Experimental, CRuby only) Although Mechanize will never request a Brotli-encoded response via
|
502
|
+
# `accept-encoding`, buggy servers may return brotli-encoded responses anyway. Let's try to handle
|
503
|
+
# that case if the Brotli gem is loaded.
|
504
|
+
#
|
505
|
+
# If you need to handle Brotli-encoded responses, install the 'brotli' gem and require it in your
|
506
|
+
# application. If the `Brotli` constant is defined, Mechanize will attempt to use it to inflate
|
507
|
+
# the response.
|
508
|
+
#
|
509
|
+
def content_encoding_brotli(body_io)
|
510
|
+
log.debug('deflate brotli body') if log
|
511
|
+
|
512
|
+
unless defined?(::Brotli)
|
513
|
+
raise Mechanize::Error, "cannot deflate brotli-encoded response. Please install and require the 'brotli' gem."
|
514
|
+
end
|
515
|
+
|
516
|
+
begin
|
517
|
+
return StringIO.new(Brotli.inflate(body_io.read))
|
518
|
+
rescue Brotli::Error
|
519
|
+
log.error("unable to brotli-inflate response") if log
|
520
|
+
raise Mechanize::Error, "error inflating brotli-encoded response."
|
521
|
+
end
|
522
|
+
ensure
|
523
|
+
body_io.close
|
524
|
+
end
|
525
|
+
|
498
526
|
def disable_keep_alive request
|
499
527
|
request['connection'] = 'close' unless @keep_alive
|
500
528
|
end
|
@@ -831,6 +859,8 @@ class Mechanize::HTTP::Agent
|
|
831
859
|
content_encoding_inflate body_io
|
832
860
|
when 'gzip', 'x-gzip' then
|
833
861
|
content_encoding_gunzip body_io
|
862
|
+
when 'br' then
|
863
|
+
content_encoding_brotli body_io
|
834
864
|
else
|
835
865
|
raise Mechanize::Error,
|
836
866
|
"unsupported content-encoding: #{response['Content-Encoding']}"
|
data/lib/mechanize/version.rb
CHANGED
data/mechanize.gemspec
CHANGED
@@ -71,9 +71,4 @@ Gem::Specification.new do |spec|
|
|
71
71
|
spec.add_runtime_dependency("rubyntlm", ">= 0.6.3", "~> 0.6")
|
72
72
|
spec.add_runtime_dependency("base64") # removed from bundled gems in 3.4, and needed by rubyntlm (which doesn't declare this dependency)
|
73
73
|
spec.add_runtime_dependency("nkf") # removed from bundled gems in 3.4
|
74
|
-
|
75
|
-
spec.add_development_dependency("minitest", "~> 5.14")
|
76
|
-
spec.add_development_dependency("rake", "~> 13.0")
|
77
|
-
spec.add_development_dependency("rdoc", "~> 6.3")
|
78
|
-
spec.add_development_dependency("rubocop", "~> 1.12")
|
79
74
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'mechanize/test_case'
|
5
|
+
require "brotli" unless RUBY_PLATFORM == "java"
|
5
6
|
|
6
7
|
class TestMechanizeHttpAgent < Mechanize::TestCase
|
7
8
|
|
@@ -924,6 +925,46 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
924
925
|
assert_equal 'part', body.read
|
925
926
|
end
|
926
927
|
|
928
|
+
def test_response_content_encoding_brotli_when_brotli_not_loaded
|
929
|
+
skip("only test this on jruby which doesn't have brotli support") unless RUBY_ENGINE == 'jruby'
|
930
|
+
|
931
|
+
@res.instance_variable_set :@header, 'content-encoding' => %w[br]
|
932
|
+
body_io = StringIO.new("content doesn't matter for this test")
|
933
|
+
|
934
|
+
e = assert_raises(Mechanize::Error) do
|
935
|
+
@agent.response_content_encoding(@res, body_io)
|
936
|
+
end
|
937
|
+
assert_includes(e.message, "cannot deflate brotli-encoded response")
|
938
|
+
|
939
|
+
assert(body_io.closed?)
|
940
|
+
end
|
941
|
+
|
942
|
+
def test_response_content_encoding_brotli
|
943
|
+
skip("jruby does not have brotli support") if RUBY_ENGINE == 'jruby'
|
944
|
+
|
945
|
+
@res.instance_variable_set :@header, 'content-encoding' => %w[br]
|
946
|
+
body_io = StringIO.new(Brotli.deflate("this is compressed by brotli"))
|
947
|
+
|
948
|
+
body = @agent.response_content_encoding(@res, body_io)
|
949
|
+
|
950
|
+
assert_equal("this is compressed by brotli", body.read)
|
951
|
+
assert(body_io.closed?)
|
952
|
+
end
|
953
|
+
|
954
|
+
def test_response_content_encoding_brotli_corrupt
|
955
|
+
skip("jruby does not have brotli support") if RUBY_ENGINE == 'jruby'
|
956
|
+
|
957
|
+
@res.instance_variable_set :@header, 'content-encoding' => %w[br]
|
958
|
+
body_io = StringIO.new("not a brotli payload")
|
959
|
+
|
960
|
+
e = assert_raises(Mechanize::Error) do
|
961
|
+
@agent.response_content_encoding(@res, body_io)
|
962
|
+
end
|
963
|
+
assert_includes(e.message, "error inflating brotli-encoded response")
|
964
|
+
assert_kind_of(Brotli::Error, e.cause)
|
965
|
+
assert(body_io.closed?)
|
966
|
+
end
|
967
|
+
|
927
968
|
def test_response_content_encoding_gzip_corrupt
|
928
969
|
log = StringIO.new
|
929
970
|
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.
|
4
|
+
version: 2.12.0
|
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-
|
15
|
+
date: 2024-07-29 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: addressable
|
@@ -218,62 +218,6 @@ dependencies:
|
|
218
218
|
- - ">="
|
219
219
|
- !ruby/object:Gem::Version
|
220
220
|
version: '0'
|
221
|
-
- !ruby/object:Gem::Dependency
|
222
|
-
name: minitest
|
223
|
-
requirement: !ruby/object:Gem::Requirement
|
224
|
-
requirements:
|
225
|
-
- - "~>"
|
226
|
-
- !ruby/object:Gem::Version
|
227
|
-
version: '5.14'
|
228
|
-
type: :development
|
229
|
-
prerelease: false
|
230
|
-
version_requirements: !ruby/object:Gem::Requirement
|
231
|
-
requirements:
|
232
|
-
- - "~>"
|
233
|
-
- !ruby/object:Gem::Version
|
234
|
-
version: '5.14'
|
235
|
-
- !ruby/object:Gem::Dependency
|
236
|
-
name: rake
|
237
|
-
requirement: !ruby/object:Gem::Requirement
|
238
|
-
requirements:
|
239
|
-
- - "~>"
|
240
|
-
- !ruby/object:Gem::Version
|
241
|
-
version: '13.0'
|
242
|
-
type: :development
|
243
|
-
prerelease: false
|
244
|
-
version_requirements: !ruby/object:Gem::Requirement
|
245
|
-
requirements:
|
246
|
-
- - "~>"
|
247
|
-
- !ruby/object:Gem::Version
|
248
|
-
version: '13.0'
|
249
|
-
- !ruby/object:Gem::Dependency
|
250
|
-
name: rdoc
|
251
|
-
requirement: !ruby/object:Gem::Requirement
|
252
|
-
requirements:
|
253
|
-
- - "~>"
|
254
|
-
- !ruby/object:Gem::Version
|
255
|
-
version: '6.3'
|
256
|
-
type: :development
|
257
|
-
prerelease: false
|
258
|
-
version_requirements: !ruby/object:Gem::Requirement
|
259
|
-
requirements:
|
260
|
-
- - "~>"
|
261
|
-
- !ruby/object:Gem::Version
|
262
|
-
version: '6.3'
|
263
|
-
- !ruby/object:Gem::Dependency
|
264
|
-
name: rubocop
|
265
|
-
requirement: !ruby/object:Gem::Requirement
|
266
|
-
requirements:
|
267
|
-
- - "~>"
|
268
|
-
- !ruby/object:Gem::Version
|
269
|
-
version: '1.12'
|
270
|
-
type: :development
|
271
|
-
prerelease: false
|
272
|
-
version_requirements: !ruby/object:Gem::Requirement
|
273
|
-
requirements:
|
274
|
-
- - "~>"
|
275
|
-
- !ruby/object:Gem::Version
|
276
|
-
version: '1.12'
|
277
221
|
description: |-
|
278
222
|
The Mechanize library is used for automating interaction with websites.
|
279
223
|
Mechanize automatically stores and sends cookies, follows redirects,
|