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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 838c02901688f672d7a94781a50997dc0dd82d9ea8f00addafc7e610cbf2c230
4
- data.tar.gz: 6719045f1cccd8e339e0f97aea37b221bf61152c679248d2428ae92ea96a7a7c
3
+ metadata.gz: aca2ddf08f8675bc1c6c9e466a6d593a34c52f02a3a32f4068427ca39aad7263
4
+ data.tar.gz: 96a6b9a912363c4849287acae53f8b3394ada2b943a677958f09c36fccbdd30e
5
5
  SHA512:
6
- metadata.gz: d096aedb098363e777d5d818f8d050ed1c87df5edb032c26cd761976ed052baa92d01333665b2f72daffbdc0cea75606f3eeef8f0616140088cba5281a640ea1
7
- data.tar.gz: 50adf03a07cc7968e26b44f276ddbdf6c087c86f33bcff589ba368b5ed557e043e9fc21500bb9f6999e5e7148e52bf4fabec42ae7b8c322807207dd7bbf45307
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 encodings.empty? || encodings.include?(IDENTITY)
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
- ->(b) { chain.reduce(b) { |acc, fn| fn.call(acc) } }
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 = env[: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
- if body.is_a?(String)
80
- env[:body] = processor.call(body)
81
- headers[CONTENT_LENGTH] = env[:body].bytesize
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
- io = StringIO.new(body)
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 body_nil_or_empty?(body)
122
- return true if body.nil?
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
- false
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.reverse.filter_map { |enc| processors[enc] }
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Faraday
4
4
  module Gzip
5
- VERSION = '3.1.0'
5
+ VERSION = '3.2.0'
6
6
  end
7
7
  end
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.1.0
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: http://www.rubydoc.info/gems/faraday-gzip/3.1.0
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.3
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: []