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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +3 -6
- data/Changelog.md +385 -318
- data/httparty.gemspec +2 -1
- data/lib/httparty/connection_adapter.rb +5 -24
- data/lib/httparty/logger/logstash_formatter.rb +1 -0
- data/lib/httparty/module_inheritable_attributes.rb +3 -5
- data/lib/httparty/parser.rb +3 -0
- data/lib/httparty/request/body.rb +1 -0
- data/lib/httparty/request.rb +34 -19
- data/lib/httparty/response.rb +3 -3
- data/lib/httparty/version.rb +1 -1
- data/lib/httparty.rb +13 -10
- data/script/release +4 -4
- metadata +18 -3
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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -29,7 +29,7 @@ module HTTParty
|
|
29
29
|
@mattr_inheritable_attrs += args
|
30
30
|
|
31
31
|
args.each do |arg|
|
32
|
-
|
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
|
-
|
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
|
-
|
51
|
-
|
52
|
-
subclass.class_eval method
|
50
|
+
RUBY
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
data/lib/httparty/parser.rb
CHANGED
@@ -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
|
|
data/lib/httparty/request.rb
CHANGED
@@ -295,24 +295,7 @@ module HTTParty
|
|
295
295
|
|
296
296
|
def handle_response(raw_body, &block)
|
297
297
|
if response_redirects?
|
298
|
-
|
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
|
data/lib/httparty/response.rb
CHANGED
@@ -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 ::
|
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 ::
|
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]
|
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
|
data/lib/httparty/version.rb
CHANGED
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
|
-
|
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
|
22
|
-
(git branch | grep -q '*
|
23
|
-
echo "Only release from the
|
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
|
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.
|
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:
|
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.
|
141
|
+
version: 2.7.0
|
127
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
143
|
requirements:
|
129
144
|
- - ">="
|