faraday-gzip 3.1.0 → 3.2.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 +10 -0
- data/lib/faraday/gzip/middleware.rb +17 -35
- data/lib/faraday/gzip/version.rb +1 -1
- metadata +3 -87
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aca2ddf08f8675bc1c6c9e466a6d593a34c52f02a3a32f4068427ca39aad7263
|
|
4
|
+
data.tar.gz: 96a6b9a912363c4849287acae53f8b3394ada2b943a677958f09c36fccbdd30e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6c37c4a0ece9fb5eb4c23856c62dd2d1a0ac640e7f7401b621de518188e9f6cc822abba179ad99d7566e107c4267c2177977fef2c47b507c541a6fc60afab643
|
|
7
|
+
data.tar.gz: 9bb4a964ea2a41d2760847873551474d2bd91b4598ff0ce9700e096e423ff489f59fc4eca73d00f726a8ec7694642b3cc7d4f654c3bf1cd555c0693e0d2d0fd5
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.2.0 (12-Oct-2026)
|
|
4
|
+
|
|
5
|
+
- Moved development dependencies to `Gemfile` and improved SimpleCov compatibility across Ruby versions.
|
|
6
|
+
- Simplified response decompression logic.
|
|
7
|
+
- Prevented partial decompression when unsupported content encodings are present.
|
|
8
|
+
- Preserved response headers for empty, non-string, and partial (`206`) responses.
|
|
9
|
+
- Added support for concatenated gzip streams.
|
|
10
|
+
- Added regression tests for encoding chains, partial responses, and concatenated gzip streams.
|
|
11
|
+
- Fixed test helpers to properly initialize HTTP response environments.
|
|
12
|
+
|
|
3
13
|
## 3.1.0 (05-Jan-2026)
|
|
4
14
|
|
|
5
15
|
* Improve handling of edge cases and malformed `Content-Encoding` headers
|
|
@@ -49,51 +49,31 @@ module Faraday
|
|
|
49
49
|
|
|
50
50
|
# Finds a proper processor
|
|
51
51
|
def find_processor(response_env)
|
|
52
|
-
body = response_env[:body]
|
|
53
|
-
|
|
54
52
|
encodings = parse_content_encoding(
|
|
55
53
|
response_env[:response_headers][CONTENT_ENCODING]
|
|
56
54
|
)
|
|
57
|
-
return nil if
|
|
58
|
-
|
|
59
|
-
# If body is nil/empty, we still want to normalize headers:
|
|
60
|
-
# Content-Encoding is meaningless without an encoded body.
|
|
61
|
-
return ->(b) { b } if body_nil_or_empty?(body)
|
|
55
|
+
return nil if skip_decompression?(response_env, encodings)
|
|
62
56
|
|
|
63
57
|
chain = processor_chain(encodings)
|
|
64
58
|
return nil if chain.empty?
|
|
65
59
|
|
|
66
|
-
->(
|
|
60
|
+
->(body) { chain.reduce(body) { |acc, fn| fn.call(acc) } }
|
|
67
61
|
end
|
|
68
62
|
|
|
69
63
|
# Calls the proper processor to decompress body
|
|
70
64
|
def reset_body(env, processor)
|
|
71
65
|
return if processor.nil?
|
|
72
66
|
|
|
73
|
-
body
|
|
74
|
-
headers = env[:response_headers]
|
|
75
|
-
|
|
76
|
-
# Don't touch streaming / IO-like bodies.
|
|
77
|
-
return unless body.is_a?(String) || body_nil_or_empty?(body)
|
|
67
|
+
body = processor.call(env[:body])
|
|
78
68
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Normalize encoding header even for nil/empty body.
|
|
85
|
-
headers.delete(CONTENT_ENCODING)
|
|
69
|
+
env[:body] = body
|
|
70
|
+
env[:response_headers][CONTENT_LENGTH] = body.bytesize
|
|
71
|
+
env[:response_headers].delete(CONTENT_ENCODING)
|
|
86
72
|
end
|
|
87
73
|
|
|
88
74
|
# Process gzip
|
|
89
75
|
def uncompress_gzip(body)
|
|
90
|
-
|
|
91
|
-
gzip_reader = Zlib::GzipReader.new(io, encoding: 'ASCII-8BIT')
|
|
92
|
-
begin
|
|
93
|
-
gzip_reader.read
|
|
94
|
-
ensure
|
|
95
|
-
gzip_reader.close
|
|
96
|
-
end
|
|
76
|
+
Zlib::GzipReader.zcat(StringIO.new(body))
|
|
97
77
|
end
|
|
98
78
|
|
|
99
79
|
# Process deflate
|
|
@@ -118,14 +98,13 @@ module Faraday
|
|
|
118
98
|
|
|
119
99
|
private
|
|
120
100
|
|
|
121
|
-
def
|
|
122
|
-
|
|
123
|
-
return body.empty? if body.respond_to?(:empty?)
|
|
124
|
-
# rubocop:disable Style/ZeroLengthPredicate
|
|
125
|
-
return body.size.zero? if body.respond_to?(:size)
|
|
126
|
-
# rubocop:enable Style/ZeroLengthPredicate
|
|
101
|
+
def skip_decompression?(env, encodings)
|
|
102
|
+
body = env[:body]
|
|
127
103
|
|
|
128
|
-
|
|
104
|
+
return true unless body.is_a?(String) && !body.empty?
|
|
105
|
+
return true if env[:status] == 206
|
|
106
|
+
|
|
107
|
+
encodings.empty? || encodings.include?(IDENTITY)
|
|
129
108
|
end
|
|
130
109
|
|
|
131
110
|
def parse_content_encoding(value)
|
|
@@ -139,8 +118,11 @@ module Faraday
|
|
|
139
118
|
|
|
140
119
|
# Decode in reverse order of application:
|
|
141
120
|
# "gzip, br" => br -> gzip
|
|
121
|
+
# If the encoding is unknown, do not touch the content
|
|
142
122
|
def processor_chain(encodings)
|
|
143
|
-
encodings.
|
|
123
|
+
return [] unless encodings.all? { |enc| processors[enc] }
|
|
124
|
+
|
|
125
|
+
encodings.reverse.map { |enc| processors[enc] }
|
|
144
126
|
end
|
|
145
127
|
|
|
146
128
|
def processors
|
data/lib/faraday/gzip/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: faraday-gzip
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ilya Krukowski
|
|
@@ -43,90 +43,6 @@ dependencies:
|
|
|
43
43
|
- - "~>"
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
45
|
version: '3.0'
|
|
46
|
-
- !ruby/object:Gem::Dependency
|
|
47
|
-
name: rake
|
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
requirements:
|
|
50
|
-
- - "~>"
|
|
51
|
-
- !ruby/object:Gem::Version
|
|
52
|
-
version: '13.0'
|
|
53
|
-
type: :development
|
|
54
|
-
prerelease: false
|
|
55
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
-
requirements:
|
|
57
|
-
- - "~>"
|
|
58
|
-
- !ruby/object:Gem::Version
|
|
59
|
-
version: '13.0'
|
|
60
|
-
- !ruby/object:Gem::Dependency
|
|
61
|
-
name: rspec
|
|
62
|
-
requirement: !ruby/object:Gem::Requirement
|
|
63
|
-
requirements:
|
|
64
|
-
- - "~>"
|
|
65
|
-
- !ruby/object:Gem::Version
|
|
66
|
-
version: '3.0'
|
|
67
|
-
type: :development
|
|
68
|
-
prerelease: false
|
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
-
requirements:
|
|
71
|
-
- - "~>"
|
|
72
|
-
- !ruby/object:Gem::Version
|
|
73
|
-
version: '3.0'
|
|
74
|
-
- !ruby/object:Gem::Dependency
|
|
75
|
-
name: simplecov
|
|
76
|
-
requirement: !ruby/object:Gem::Requirement
|
|
77
|
-
requirements:
|
|
78
|
-
- - "~>"
|
|
79
|
-
- !ruby/object:Gem::Version
|
|
80
|
-
version: '0.22'
|
|
81
|
-
type: :development
|
|
82
|
-
prerelease: false
|
|
83
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
-
requirements:
|
|
85
|
-
- - "~>"
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: '0.22'
|
|
88
|
-
- !ruby/object:Gem::Dependency
|
|
89
|
-
name: rubocop
|
|
90
|
-
requirement: !ruby/object:Gem::Requirement
|
|
91
|
-
requirements:
|
|
92
|
-
- - "~>"
|
|
93
|
-
- !ruby/object:Gem::Version
|
|
94
|
-
version: '1.82'
|
|
95
|
-
type: :development
|
|
96
|
-
prerelease: false
|
|
97
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
98
|
-
requirements:
|
|
99
|
-
- - "~>"
|
|
100
|
-
- !ruby/object:Gem::Version
|
|
101
|
-
version: '1.82'
|
|
102
|
-
- !ruby/object:Gem::Dependency
|
|
103
|
-
name: rubocop-performance
|
|
104
|
-
requirement: !ruby/object:Gem::Requirement
|
|
105
|
-
requirements:
|
|
106
|
-
- - "~>"
|
|
107
|
-
- !ruby/object:Gem::Version
|
|
108
|
-
version: '1.26'
|
|
109
|
-
type: :development
|
|
110
|
-
prerelease: false
|
|
111
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
-
requirements:
|
|
113
|
-
- - "~>"
|
|
114
|
-
- !ruby/object:Gem::Version
|
|
115
|
-
version: '1.26'
|
|
116
|
-
- !ruby/object:Gem::Dependency
|
|
117
|
-
name: rubocop-rspec
|
|
118
|
-
requirement: !ruby/object:Gem::Requirement
|
|
119
|
-
requirements:
|
|
120
|
-
- - "~>"
|
|
121
|
-
- !ruby/object:Gem::Version
|
|
122
|
-
version: '3.8'
|
|
123
|
-
type: :development
|
|
124
|
-
prerelease: false
|
|
125
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
-
requirements:
|
|
127
|
-
- - "~>"
|
|
128
|
-
- !ruby/object:Gem::Version
|
|
129
|
-
version: '3.8'
|
|
130
46
|
description: 'Faraday plugin to automatically set compression headers (GZip, Deflate,
|
|
131
47
|
Brotli) and decompress the response.
|
|
132
48
|
|
|
@@ -149,7 +65,7 @@ licenses:
|
|
|
149
65
|
metadata:
|
|
150
66
|
bug_tracker_uri: https://github.com/bodrovis/faraday-gzip/issues
|
|
151
67
|
changelog_uri: https://github.com/bodrovis/faraday-gzip/blob/master/CHANGELOG.md
|
|
152
|
-
documentation_uri:
|
|
68
|
+
documentation_uri: https://www.rubydoc.info/gems/faraday-gzip/3.2.0
|
|
153
69
|
source_code_uri: https://github.com/bodrovis/faraday-gzip
|
|
154
70
|
rubygems_mfa_required: 'true'
|
|
155
71
|
rdoc_options: []
|
|
@@ -166,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
166
82
|
- !ruby/object:Gem::Version
|
|
167
83
|
version: '0'
|
|
168
84
|
requirements: []
|
|
169
|
-
rubygems_version: 4.0.
|
|
85
|
+
rubygems_version: 4.0.22
|
|
170
86
|
specification_version: 4
|
|
171
87
|
summary: Automatically sets compression headers and decompresses the response
|
|
172
88
|
test_files: []
|