httparty 0.21.0 → 0.22.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.
data/httparty.gemspec CHANGED
@@ -13,8 +13,9 @@ Gem::Specification.new do |s|
13
13
  s.summary = 'Makes http fun! Also, makes consuming restful web services dead easy.'
14
14
  s.description = 'Makes http fun! Also, makes consuming restful web services dead easy.'
15
15
 
16
- s.required_ruby_version = '>= 2.3.0'
16
+ s.required_ruby_version = '>= 2.7.0'
17
17
 
18
+ s.add_dependency 'csv'
18
19
  s.add_dependency 'multi_xml', ">= 0.5.2"
19
20
  s.add_dependency 'mini_mime', ">= 1.0.0"
20
21
 
@@ -119,10 +119,7 @@ module HTTParty
119
119
  if add_timeout?(options[:timeout])
120
120
  http.open_timeout = options[:timeout]
121
121
  http.read_timeout = options[:timeout]
122
-
123
- from_ruby_version('2.6.0', option: :write_timeout, warn: false) do
124
- http.write_timeout = options[:timeout]
125
- end
122
+ http.write_timeout = options[:timeout]
126
123
  end
127
124
 
128
125
  if add_timeout?(options[:read_timeout])
@@ -134,15 +131,11 @@ module HTTParty
134
131
  end
135
132
 
136
133
  if add_timeout?(options[:write_timeout])
137
- from_ruby_version('2.6.0', option: :write_timeout) do
138
- http.write_timeout = options[:write_timeout]
139
- end
134
+ http.write_timeout = options[:write_timeout]
140
135
  end
141
136
 
142
137
  if add_max_retries?(options[:max_retries])
143
- from_ruby_version('2.5.0', option: :max_retries) do
144
- http.max_retries = options[:max_retries]
145
- end
138
+ http.max_retries = options[:max_retries]
146
139
  end
147
140
 
148
141
  if options[:debug_output]
@@ -157,15 +150,11 @@ module HTTParty
157
150
  #
158
151
  # @see https://bugs.ruby-lang.org/issues/6617
159
152
  if options[:local_host]
160
- from_ruby_version('2.0.0', option: :local_host) do
161
- http.local_host = options[:local_host]
162
- end
153
+ http.local_host = options[:local_host]
163
154
  end
164
155
 
165
156
  if options[:local_port]
166
- from_ruby_version('2.0.0', option: :local_port) do
167
- http.local_port = options[:local_port]
168
- end
157
+ http.local_port = options[:local_port]
169
158
  end
170
159
 
171
160
  http
@@ -173,14 +162,6 @@ module HTTParty
173
162
 
174
163
  private
175
164
 
176
- def from_ruby_version(ruby_version, option: nil, warn: true)
177
- if RUBY_VERSION >= ruby_version
178
- yield
179
- elsif warn
180
- Kernel.warn("Warning: option #{ option } requires Ruby version #{ ruby_version } or later")
181
- end
182
- end
183
-
184
165
  def add_timeout?(timeout)
185
166
  timeout && (timeout.is_a?(Integer) || timeout.is_a?(Float))
186
167
  end
@@ -24,6 +24,7 @@ module HTTParty
24
24
  attr_reader :request, :response
25
25
 
26
26
  def logstash_message
27
+ require 'json'
27
28
  {
28
29
  '@timestamp' => current_time,
29
30
  '@version' => 1,
@@ -29,7 +29,7 @@ module HTTParty
29
29
  @mattr_inheritable_attrs += args
30
30
 
31
31
  args.each do |arg|
32
- module_eval %(class << self; attr_accessor :#{arg} end)
32
+ singleton_class.attr_accessor(arg)
33
33
  end
34
34
 
35
35
  @mattr_inheritable_attrs
@@ -42,14 +42,12 @@ module HTTParty
42
42
  subclass.instance_variable_set(ivar, instance_variable_get(ivar).clone)
43
43
 
44
44
  if instance_variable_get(ivar).respond_to?(:merge)
45
- method = <<-EOM
45
+ subclass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
46
46
  def self.#{inheritable_attribute}
47
47
  duplicate = ModuleInheritableAttributes.hash_deep_dup(#{ivar})
48
48
  #{ivar} = superclass.#{inheritable_attribute}.merge(duplicate)
49
49
  end
50
- EOM
51
-
52
- subclass.class_eval method
50
+ RUBY
53
51
  end
54
52
  end
55
53
  end
@@ -118,16 +118,19 @@ module HTTParty
118
118
  protected
119
119
 
120
120
  def xml
121
+ require 'multi_xml'
121
122
  MultiXml.parse(body)
122
123
  end
123
124
 
124
125
  UTF8_BOM = "\xEF\xBB\xBF"
125
126
 
126
127
  def json
128
+ require 'json'
127
129
  JSON.parse(body, :quirks_mode => true, :allow_nan => true)
128
130
  end
129
131
 
130
132
  def csv
133
+ require 'csv'
131
134
  CSV.parse(body)
132
135
  end
133
136
 
@@ -91,6 +91,7 @@ module HTTParty
91
91
 
92
92
  def content_type(object)
93
93
  return object.content_type if object.respond_to?(:content_type)
94
+ require 'mini_mime'
94
95
  mime = MiniMime.lookup_by_filename(object.path)
95
96
  mime ? mime.content_type : 'application/octet-stream'
96
97
  end
@@ -295,24 +295,7 @@ module HTTParty
295
295
 
296
296
  def handle_response(raw_body, &block)
297
297
  if response_redirects?
298
- options[:limit] -= 1
299
- if options[:logger]
300
- logger = HTTParty::Logger.build(options[:logger], options[:log_level], options[:log_format])
301
- logger.format(self, last_response)
302
- end
303
- self.path = last_response['location']
304
- self.redirect = true
305
- if last_response.class == Net::HTTPSeeOther
306
- unless options[:maintain_method_across_redirects] && options[:resend_on_redirect]
307
- self.http_method = Net::HTTP::Get
308
- end
309
- elsif last_response.code != '307' && last_response.code != '308'
310
- unless options[:maintain_method_across_redirects]
311
- self.http_method = Net::HTTP::Get
312
- end
313
- end
314
- capture_cookies(last_response)
315
- perform(&block)
298
+ handle_redirection(&block)
316
299
  else
317
300
  raw_body ||= last_response.body
318
301
 
@@ -331,10 +314,34 @@ module HTTParty
331
314
  end
332
315
  end
333
316
 
317
+ def handle_redirection(&block)
318
+ options[:limit] -= 1
319
+ if options[:logger]
320
+ logger = HTTParty::Logger.build(options[:logger], options[:log_level], options[:log_format])
321
+ logger.format(self, last_response)
322
+ end
323
+ self.path = last_response['location']
324
+ self.redirect = true
325
+ if last_response.class == Net::HTTPSeeOther
326
+ unless options[:maintain_method_across_redirects] && options[:resend_on_redirect]
327
+ self.http_method = Net::HTTP::Get
328
+ end
329
+ elsif last_response.code != '307' && last_response.code != '308'
330
+ unless options[:maintain_method_across_redirects]
331
+ self.http_method = Net::HTTP::Get
332
+ end
333
+ end
334
+ if http_method == Net::HTTP::Get
335
+ clear_body
336
+ end
337
+ capture_cookies(last_response)
338
+ perform(&block)
339
+ end
340
+
334
341
  def handle_host_redirection
335
342
  check_duplicate_location_header
336
343
  redirect_path = options[:uri_adapter].parse(last_response['location']).normalize
337
- return if redirect_path.relative? || path.host == redirect_path.host
344
+ return if redirect_path.relative? || path.host == redirect_path.host || uri.host == redirect_path.host
338
345
  @changed_hosts = true
339
346
  end
340
347
 
@@ -362,6 +369,14 @@ module HTTParty
362
369
  parser.call(body, format)
363
370
  end
364
371
 
372
+ # Some Web Application Firewalls reject incoming GET requests that have a body
373
+ # if we redirect, and the resulting verb is GET then we will clear the body that
374
+ # may be left behind from the initiating request
375
+ def clear_body
376
+ options[:body] = nil
377
+ @raw_request.body = nil
378
+ end
379
+
365
380
  def capture_cookies(response)
366
381
  return unless response['Set-Cookie']
367
382
  cookies_hash = HTTParty::CookieHash.new
@@ -67,12 +67,12 @@ module HTTParty
67
67
  end
68
68
 
69
69
  # Support old multiple_choice? method from pre 2.0.0 era.
70
- if ::RUBY_VERSION >= '2.0.0' && ::RUBY_PLATFORM != 'java'
70
+ if ::RUBY_PLATFORM != 'java'
71
71
  alias_method :multiple_choice?, :multiple_choices?
72
72
  end
73
73
 
74
74
  # Support old status codes method from pre 2.6.0 era.
75
- if ::RUBY_VERSION >= '2.6.0' && ::RUBY_PLATFORM != 'java'
75
+ if ::RUBY_PLATFORM != 'java'
76
76
  alias_method :gateway_time_out?, :gateway_timeout?
77
77
  alias_method :request_entity_too_large?, :payload_too_large?
78
78
  alias_method :request_time_out?, :request_timeout?
@@ -133,7 +133,7 @@ module HTTParty
133
133
  end
134
134
 
135
135
  def throw_exception
136
- if @request.options[:raise_on] && @request.options[:raise_on].include?(code)
136
+ if @request.options[:raise_on].to_a.detect { |c| code.to_s.match(/#{c.to_s}/) }
137
137
  ::Kernel.raise ::HTTParty::ResponseError.new(@response), "Code #{code} - #{body}"
138
138
  end
139
139
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTParty
4
- VERSION = '0.21.0'
4
+ VERSION = '0.22.0'
5
5
  end
data/lib/httparty.rb CHANGED
@@ -3,11 +3,6 @@
3
3
  require 'pathname'
4
4
  require 'net/http'
5
5
  require 'uri'
6
- require 'zlib'
7
- require 'multi_xml'
8
- require 'mini_mime'
9
- require 'json'
10
- require 'csv'
11
6
 
12
7
  require 'httparty/module_inheritable_attributes'
13
8
  require 'httparty/cookie_hash'
@@ -83,7 +78,7 @@ module HTTParty
83
78
  #
84
79
  # class Foo
85
80
  # include HTTParty
86
- # raise_on [404, 500]
81
+ # raise_on [404, 500, '5[0-9]*']
87
82
  # end
88
83
  def raise_on(codes = [])
89
84
  default_options[:raise_on] = *codes
@@ -591,6 +586,13 @@ module HTTParty
591
586
  perform_request Net::HTTP::Unlock, path, options, &block
592
587
  end
593
588
 
589
+ def build_request(http_method, path, options = {})
590
+ options = ModuleInheritableAttributes.hash_deep_dup(default_options).merge(options)
591
+ HeadersProcessor.new(headers, options).call
592
+ process_cookies(options)
593
+ Request.new(http_method, path, options)
594
+ end
595
+
594
596
  attr_reader :default_options
595
597
 
596
598
  private
@@ -606,10 +608,7 @@ module HTTParty
606
608
  end
607
609
 
608
610
  def perform_request(http_method, path, options, &block) #:nodoc:
609
- options = ModuleInheritableAttributes.hash_deep_dup(default_options).merge(options)
610
- HeadersProcessor.new(headers, options).call
611
- process_cookies(options)
612
- Request.new(http_method, path, options).perform(&block)
611
+ build_request(http_method, path, options).perform(&block)
613
612
  end
614
613
 
615
614
  def process_cookies(options) #:nodoc:
@@ -676,6 +675,10 @@ module HTTParty
676
675
  def self.options(*args, &block)
677
676
  Basement.options(*args, &block)
678
677
  end
678
+
679
+ def self.build_request(*args, &block)
680
+ Basement.build_request(*args, &block)
681
+ end
679
682
  end
680
683
 
681
684
  require 'httparty/hash_conversions'
data/script/release CHANGED
@@ -18,9 +18,9 @@ gem_name=httparty
18
18
  rm -rf $gem_name-*.gem
19
19
  gem build -q $gem_name.gemspec
20
20
 
21
- # Make sure we're on the master branch.
22
- (git branch | grep -q '* master') || {
23
- echo "Only release from the master branch."
21
+ # Make sure we're on the main branch.
22
+ (git branch | grep -q '* main') || {
23
+ echo "Only release from the main branch."
24
24
  exit 1
25
25
  }
26
26
 
@@ -39,4 +39,4 @@ git fetch -t origin
39
39
 
40
40
  # Tag it and bag it.
41
41
  gem push $gem_name-*.gem && git tag "$tag" &&
42
- git push origin master && git push origin "$tag"
42
+ git push origin main && git push origin "$tag"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-12-30 00:00:00.000000000 Z
12
+ date: 2024-04-29 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: csv
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: multi_xml
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -48,6 +62,7 @@ extensions: []
48
62
  extra_rdoc_files: []
49
63
  files:
50
64
  - ".editorconfig"
65
+ - ".github/dependabot.yml"
51
66
  - ".github/workflows/ci.yml"
52
67
  - ".gitignore"
53
68
  - ".rubocop.yml"
@@ -123,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
138
  requirements:
124
139
  - - ">="
125
140
  - !ruby/object:Gem::Version
126
- version: 2.3.0
141
+ version: 2.7.0
127
142
  required_rubygems_version: !ruby/object:Gem::Requirement
128
143
  requirements:
129
144
  - - ">="