httpx 0.15.3 → 0.17.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/doc/release_notes/0_15_4.md +5 -0
- data/doc/release_notes/0_16_0.md +93 -0
- data/doc/release_notes/0_16_1.md +5 -0
- data/doc/release_notes/0_17_0.md +49 -0
- data/lib/httpx/adapters/faraday.rb +3 -11
- data/lib/httpx/adapters/webmock.rb +2 -2
- data/lib/httpx/buffer.rb +1 -1
- data/lib/httpx/callbacks.rb +1 -1
- data/lib/httpx/chainable.rb +15 -8
- data/lib/httpx/connection/http1.rb +18 -10
- data/lib/httpx/connection/http2.rb +14 -21
- data/lib/httpx/connection.rb +6 -7
- data/lib/httpx/errors.rb +11 -11
- data/lib/httpx/headers.rb +1 -1
- data/lib/httpx/io/ssl.rb +2 -2
- data/lib/httpx/io/tls.rb +1 -1
- data/lib/httpx/options.rb +108 -81
- data/lib/httpx/parser/http1.rb +11 -7
- data/lib/httpx/plugins/aws_sigv4.rb +10 -9
- data/lib/httpx/plugins/compression.rb +12 -11
- data/lib/httpx/plugins/cookies/cookie.rb +4 -2
- data/lib/httpx/plugins/cookies/jar.rb +20 -1
- data/lib/httpx/plugins/cookies.rb +20 -7
- data/lib/httpx/plugins/digest_authentication.rb +19 -15
- data/lib/httpx/plugins/expect.rb +19 -15
- data/lib/httpx/plugins/follow_redirects.rb +9 -9
- data/lib/httpx/plugins/grpc/call.rb +4 -1
- data/lib/httpx/plugins/grpc.rb +73 -47
- data/lib/httpx/plugins/h2c.rb +7 -3
- data/lib/httpx/plugins/multipart/decoder.rb +187 -0
- data/lib/httpx/plugins/multipart/mime_type_detector.rb +3 -3
- data/lib/httpx/plugins/multipart/part.rb +2 -2
- data/lib/httpx/plugins/multipart.rb +14 -0
- data/lib/httpx/plugins/ntlm_authentication.rb +12 -10
- data/lib/httpx/plugins/proxy/socks4.rb +2 -1
- data/lib/httpx/plugins/proxy/socks5.rb +2 -1
- data/lib/httpx/plugins/proxy/ssh.rb +20 -13
- data/lib/httpx/plugins/proxy.rb +10 -10
- data/lib/httpx/plugins/retries.rb +25 -21
- data/lib/httpx/plugins/stream.rb +2 -3
- data/lib/httpx/plugins/upgrade.rb +7 -6
- data/lib/httpx/registry.rb +2 -2
- data/lib/httpx/request.rb +10 -19
- data/lib/httpx/resolver/https.rb +0 -2
- data/lib/httpx/resolver/native.rb +15 -3
- data/lib/httpx/resolver/resolver_mixin.rb +2 -1
- data/lib/httpx/response.rb +72 -38
- data/lib/httpx/selector.rb +6 -7
- data/lib/httpx/session.rb +34 -21
- data/lib/httpx/session2.rb +23 -0
- data/lib/httpx/transcoder/body.rb +1 -1
- data/lib/httpx/transcoder/chunker.rb +2 -1
- data/lib/httpx/transcoder/form.rb +20 -0
- data/lib/httpx/transcoder/json.rb +12 -0
- data/lib/httpx/transcoder.rb +62 -1
- data/lib/httpx/utils.rb +2 -2
- data/lib/httpx/version.rb +1 -1
- data/lib/httpx.rb +6 -3
- data/sig/buffer.rbs +3 -1
- data/sig/chainable.rbs +30 -29
- data/sig/connection/http1.rbs +11 -5
- data/sig/connection/http2.rbs +16 -5
- data/sig/connection.rbs +23 -11
- data/sig/errors.rbs +35 -1
- data/sig/headers.rbs +20 -19
- data/sig/httpx.rbs +4 -1
- data/sig/loggable.rbs +3 -1
- data/sig/options.rbs +45 -34
- data/sig/parser/http1.rbs +3 -3
- data/sig/plugins/authentication.rbs +1 -1
- data/sig/plugins/aws_sdk_authentication.rbs +5 -1
- data/sig/plugins/aws_sigv4.rbs +13 -5
- data/sig/plugins/basic_authentication.rbs +1 -1
- data/sig/plugins/compression.rbs +4 -6
- data/sig/plugins/cookies/cookie.rbs +5 -7
- data/sig/plugins/cookies/jar.rbs +9 -10
- data/sig/plugins/cookies.rbs +4 -5
- data/sig/plugins/digest_authentication.rbs +2 -3
- data/sig/plugins/expect.rbs +2 -4
- data/sig/plugins/follow_redirects.rbs +3 -5
- data/sig/plugins/grpc.rbs +4 -7
- data/sig/plugins/h2c.rbs +0 -2
- data/sig/plugins/multipart.rbs +64 -10
- data/sig/plugins/ntlm_authentication.rbs +2 -3
- data/sig/plugins/persistent.rbs +3 -8
- data/sig/plugins/proxy/ssh.rbs +4 -4
- data/sig/plugins/proxy.rbs +13 -13
- data/sig/plugins/push_promise.rbs +0 -2
- data/sig/plugins/retries.rbs +4 -8
- data/sig/plugins/stream.rbs +1 -1
- data/sig/plugins/upgrade.rbs +2 -3
- data/sig/pool.rbs +1 -2
- data/sig/registry.rbs +1 -1
- data/sig/request.rbs +11 -8
- data/sig/resolver/native.rbs +12 -6
- data/sig/resolver/resolver_mixin.rbs +4 -5
- data/sig/resolver/system.rbs +2 -0
- data/sig/resolver.rbs +7 -0
- data/sig/response.rbs +24 -12
- data/sig/selector.rbs +11 -9
- data/sig/session.rbs +22 -23
- data/sig/transcoder/body.rbs +6 -1
- data/sig/transcoder/chunker.rbs +8 -2
- data/sig/transcoder/form.rbs +3 -1
- data/sig/transcoder/json.rbs +2 -0
- data/sig/transcoder.rbs +13 -5
- data/sig/utils.rbs +2 -0
- metadata +12 -2
data/lib/httpx/selector.rb
CHANGED
|
@@ -43,9 +43,6 @@ class HTTPX::Selector
|
|
|
43
43
|
|
|
44
44
|
private
|
|
45
45
|
|
|
46
|
-
READ_INTERESTS = %i[r rw].freeze
|
|
47
|
-
WRITE_INTERESTS = %i[w rw].freeze
|
|
48
|
-
|
|
49
46
|
def select_many(interval, &block)
|
|
50
47
|
selectables, r, w = nil
|
|
51
48
|
|
|
@@ -64,8 +61,8 @@ class HTTPX::Selector
|
|
|
64
61
|
selectables.each do |io|
|
|
65
62
|
interests = io.interests
|
|
66
63
|
|
|
67
|
-
(r ||= []) << io if
|
|
68
|
-
(w ||= []) << io if
|
|
64
|
+
(r ||= []) << io if READABLE.include?(interests)
|
|
65
|
+
(w ||= []) << io if WRITABLE.include?(interests)
|
|
69
66
|
end
|
|
70
67
|
|
|
71
68
|
if @selectables.empty?
|
|
@@ -89,7 +86,7 @@ class HTTPX::Selector
|
|
|
89
86
|
|
|
90
87
|
readers, writers = IO.select(r, w, nil, interval)
|
|
91
88
|
|
|
92
|
-
raise HTTPX::TimeoutError.new(interval, "timed out while waiting on select") if readers.nil? && writers.nil?
|
|
89
|
+
raise HTTPX::TimeoutError.new(interval, "timed out while waiting on select") if readers.nil? && writers.nil? && interval
|
|
93
90
|
rescue IOError, SystemCallError
|
|
94
91
|
@selectables.reject!(&:closed?)
|
|
95
92
|
retry
|
|
@@ -112,6 +109,8 @@ class HTTPX::Selector
|
|
|
112
109
|
def select_one(interval)
|
|
113
110
|
io = @selectables.first
|
|
114
111
|
|
|
112
|
+
return unless io
|
|
113
|
+
|
|
115
114
|
interests = io.interests
|
|
116
115
|
|
|
117
116
|
result = case interests
|
|
@@ -121,7 +120,7 @@ class HTTPX::Selector
|
|
|
121
120
|
when nil then return
|
|
122
121
|
end
|
|
123
122
|
|
|
124
|
-
raise HTTPX::TimeoutError.new(interval, "timed out while waiting on select") unless result
|
|
123
|
+
raise HTTPX::TimeoutError.new(interval, "timed out while waiting on select") unless result || interval.nil?
|
|
125
124
|
|
|
126
125
|
yield io
|
|
127
126
|
rescue IOError, SystemCallError
|
data/lib/httpx/session.rb
CHANGED
|
@@ -15,8 +15,6 @@ module HTTPX
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def wrap
|
|
18
|
-
return unless block_given?
|
|
19
|
-
|
|
20
18
|
begin
|
|
21
19
|
prev_persistent = @persistent
|
|
22
20
|
@persistent = true
|
|
@@ -31,8 +29,10 @@ module HTTPX
|
|
|
31
29
|
end
|
|
32
30
|
|
|
33
31
|
def request(*args, **options)
|
|
32
|
+
raise ArgumentError, "must perform at least one request" if args.empty?
|
|
33
|
+
|
|
34
34
|
requests = args.first.is_a?(Request) ? args : build_requests(*args, options)
|
|
35
|
-
responses = send_requests(*requests
|
|
35
|
+
responses = send_requests(*requests)
|
|
36
36
|
return responses.first if responses.size == 1
|
|
37
37
|
|
|
38
38
|
responses
|
|
@@ -40,7 +40,8 @@ module HTTPX
|
|
|
40
40
|
|
|
41
41
|
def build_request(verb, uri, options = EMPTY_HASH)
|
|
42
42
|
rklass = @options.request_class
|
|
43
|
-
|
|
43
|
+
options = @options.merge(options) unless options.is_a?(Options)
|
|
44
|
+
request = rklass.new(verb, uri, options.merge(persistent: @persistent))
|
|
44
45
|
request.on(:response, &method(:on_response).curry(2)[request])
|
|
45
46
|
request.on(:promise, &method(:on_promise))
|
|
46
47
|
request
|
|
@@ -174,37 +175,38 @@ module HTTPX
|
|
|
174
175
|
end
|
|
175
176
|
end
|
|
176
177
|
|
|
177
|
-
def send_requests(*requests
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
connections = _send_requests(requests, request_options)
|
|
181
|
-
receive_requests(requests, connections, request_options)
|
|
178
|
+
def send_requests(*requests)
|
|
179
|
+
connections = _send_requests(requests)
|
|
180
|
+
receive_requests(requests, connections)
|
|
182
181
|
end
|
|
183
182
|
|
|
184
|
-
def _send_requests(requests
|
|
183
|
+
def _send_requests(requests)
|
|
185
184
|
connections = []
|
|
186
185
|
|
|
187
186
|
requests.each do |request|
|
|
188
187
|
error = catch(:resolve_error) do
|
|
189
|
-
connection = find_connection(request, connections, options)
|
|
188
|
+
connection = find_connection(request, connections, request.options)
|
|
190
189
|
connection.send(request)
|
|
191
190
|
end
|
|
192
191
|
next unless error.is_a?(ResolveError)
|
|
193
192
|
|
|
194
|
-
request.emit(:response, ErrorResponse.new(request, error, options))
|
|
193
|
+
request.emit(:response, ErrorResponse.new(request, error, request.options))
|
|
195
194
|
end
|
|
196
195
|
|
|
197
196
|
connections
|
|
198
197
|
end
|
|
199
198
|
|
|
200
|
-
def receive_requests(requests, connections
|
|
199
|
+
def receive_requests(requests, connections)
|
|
201
200
|
responses = []
|
|
202
201
|
|
|
203
202
|
begin
|
|
204
203
|
# guarantee ordered responses
|
|
205
204
|
loop do
|
|
206
205
|
request = requests.first
|
|
207
|
-
|
|
206
|
+
|
|
207
|
+
return responses unless request
|
|
208
|
+
|
|
209
|
+
pool.next_tick until (response = fetch_response(request, connections, request.options))
|
|
208
210
|
|
|
209
211
|
responses << response
|
|
210
212
|
requests.shift
|
|
@@ -218,7 +220,7 @@ module HTTPX
|
|
|
218
220
|
# opportunity to traverse the requests, hence we're returning only a fraction of the errors
|
|
219
221
|
# we were supposed to. This effectively fetches the existing responses and return them.
|
|
220
222
|
while (request = requests.shift)
|
|
221
|
-
responses << fetch_response(request, connections, options)
|
|
223
|
+
responses << fetch_response(request, connections, request.options)
|
|
222
224
|
end
|
|
223
225
|
break
|
|
224
226
|
end
|
|
@@ -247,9 +249,8 @@ module HTTPX
|
|
|
247
249
|
if !@plugins.include?(pl)
|
|
248
250
|
@plugins << pl
|
|
249
251
|
pl.load_dependencies(self, &block) if pl.respond_to?(:load_dependencies)
|
|
252
|
+
|
|
250
253
|
@default_options = @default_options.dup
|
|
251
|
-
@default_options = pl.extra_options(@default_options, &block) if pl.respond_to?(:extra_options)
|
|
252
|
-
@default_options = @default_options.merge(options) if options
|
|
253
254
|
|
|
254
255
|
include(pl::InstanceMethods) if defined?(pl::InstanceMethods)
|
|
255
256
|
extend(pl::ClassMethods) if defined?(pl::ClassMethods)
|
|
@@ -266,14 +267,26 @@ module HTTPX
|
|
|
266
267
|
opts.response_body_class.__send__(:include, pl::ResponseBodyMethods) if defined?(pl::ResponseBodyMethods)
|
|
267
268
|
opts.response_body_class.extend(pl::ResponseBodyClassMethods) if defined?(pl::ResponseBodyClassMethods)
|
|
268
269
|
opts.connection_class.__send__(:include, pl::ConnectionMethods) if defined?(pl::ConnectionMethods)
|
|
270
|
+
if defined?(pl::OptionsMethods)
|
|
271
|
+
opts.options_class.__send__(:include, pl::OptionsMethods)
|
|
272
|
+
|
|
273
|
+
(pl::OptionsMethods.instance_methods - Object.instance_methods).each do |meth|
|
|
274
|
+
opts.options_class.method_added(meth)
|
|
275
|
+
end
|
|
276
|
+
@default_options = opts.options_class.new(opts)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
@default_options = pl.extra_options(@default_options) if pl.respond_to?(:extra_options)
|
|
280
|
+
@default_options = @default_options.merge(options) if options
|
|
281
|
+
|
|
269
282
|
pl.configure(self, &block) if pl.respond_to?(:configure)
|
|
270
283
|
|
|
271
284
|
@default_options.freeze
|
|
272
285
|
elsif options
|
|
273
286
|
# this can happen when two plugins are loaded, an one of them calls the other under the hood,
|
|
274
287
|
# albeit changing some default.
|
|
275
|
-
@default_options = @default_options.
|
|
276
|
-
@default_options = @default_options.merge(options)
|
|
288
|
+
@default_options = pl.extra_options(@default_options) if pl.respond_to?(:extra_options)
|
|
289
|
+
@default_options = @default_options.merge(options) if options
|
|
277
290
|
|
|
278
291
|
@default_options.freeze
|
|
279
292
|
end
|
|
@@ -283,8 +296,8 @@ module HTTPX
|
|
|
283
296
|
# :nocov:
|
|
284
297
|
def plugins(pls)
|
|
285
298
|
warn ":#{__method__} is deprecated, use :plugin instead"
|
|
286
|
-
pls.each do |pl
|
|
287
|
-
plugin(pl
|
|
299
|
+
pls.each do |pl|
|
|
300
|
+
plugin(pl)
|
|
288
301
|
end
|
|
289
302
|
self
|
|
290
303
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "session"
|
|
4
|
+
module HTTPX
|
|
5
|
+
class Session
|
|
6
|
+
def initialize(options = EMPTY_HASH, &blk)
|
|
7
|
+
@options = self.class.default_options.merge(options)
|
|
8
|
+
@responses = {}
|
|
9
|
+
@persistent = @options.persistent
|
|
10
|
+
wrap(&blk) if block_given?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def wrap
|
|
14
|
+
begin
|
|
15
|
+
prev_persistent = @persistent
|
|
16
|
+
@persistent = true
|
|
17
|
+
yield self
|
|
18
|
+
ensure
|
|
19
|
+
@persistent = prev_persistent
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -7,6 +7,8 @@ module HTTPX::Transcoder
|
|
|
7
7
|
module Form
|
|
8
8
|
module_function
|
|
9
9
|
|
|
10
|
+
PARAM_DEPTH_LIMIT = 32
|
|
11
|
+
|
|
10
12
|
class Encoder
|
|
11
13
|
extend Forwardable
|
|
12
14
|
|
|
@@ -31,9 +33,27 @@ module HTTPX::Transcoder
|
|
|
31
33
|
end
|
|
32
34
|
end
|
|
33
35
|
|
|
36
|
+
module Decoder
|
|
37
|
+
module_function
|
|
38
|
+
|
|
39
|
+
def call(response, _)
|
|
40
|
+
URI.decode_www_form(response.to_s).each_with_object({}) do |(field, value), params|
|
|
41
|
+
HTTPX::Transcoder.normalize_query(params, field, value, PARAM_DEPTH_LIMIT)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
34
46
|
def encode(form)
|
|
35
47
|
Encoder.new(form)
|
|
36
48
|
end
|
|
49
|
+
|
|
50
|
+
def decode(response)
|
|
51
|
+
content_type = response.content_type.mime_type
|
|
52
|
+
|
|
53
|
+
raise Error, "invalid form mime type (#{content_type})" unless content_type == "application/x-www-form-urlencoded"
|
|
54
|
+
|
|
55
|
+
Decoder
|
|
56
|
+
end
|
|
37
57
|
end
|
|
38
58
|
register "form", Form
|
|
39
59
|
end
|
|
@@ -5,6 +5,10 @@ require "json"
|
|
|
5
5
|
|
|
6
6
|
module HTTPX::Transcoder
|
|
7
7
|
module JSON
|
|
8
|
+
JSON_REGEX = %r{\bapplication/(?:vnd\.api\+)?json\b}i.freeze
|
|
9
|
+
|
|
10
|
+
using HTTPX::RegexpExtensions unless Regexp.method_defined?(:match?)
|
|
11
|
+
|
|
8
12
|
module_function
|
|
9
13
|
|
|
10
14
|
class Encoder
|
|
@@ -27,6 +31,14 @@ module HTTPX::Transcoder
|
|
|
27
31
|
def encode(json)
|
|
28
32
|
Encoder.new(json)
|
|
29
33
|
end
|
|
34
|
+
|
|
35
|
+
def decode(response)
|
|
36
|
+
content_type = response.content_type.mime_type
|
|
37
|
+
|
|
38
|
+
raise Error, "invalid json mime type (#{content_type})" unless JSON_REGEX.match?(content_type)
|
|
39
|
+
|
|
40
|
+
::JSON.method(:parse)
|
|
41
|
+
end
|
|
30
42
|
end
|
|
31
43
|
register "json", JSON
|
|
32
44
|
end
|
data/lib/httpx/transcoder.rb
CHANGED
|
@@ -4,7 +4,11 @@ module HTTPX
|
|
|
4
4
|
module Transcoder
|
|
5
5
|
extend Registry
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
using RegexpExtensions unless Regexp.method_defined?(:match?)
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
def normalize_keys(key, value, cond = nil, &block)
|
|
8
12
|
if (cond && cond.call(value))
|
|
9
13
|
block.call(key.to_s, value)
|
|
10
14
|
elsif value.respond_to?(:to_ary)
|
|
@@ -23,6 +27,63 @@ module HTTPX
|
|
|
23
27
|
block.call(key.to_s, value)
|
|
24
28
|
end
|
|
25
29
|
end
|
|
30
|
+
|
|
31
|
+
# based on https://github.com/rack/rack/blob/d15dd728440710cfc35ed155d66a98dc2c07ae42/lib/rack/query_parser.rb#L82
|
|
32
|
+
def normalize_query(params, name, v, depth)
|
|
33
|
+
raise Error, "params depth surpasses what's supported" if depth <= 0
|
|
34
|
+
|
|
35
|
+
name =~ /\A[\[\]]*([^\[\]]+)\]*/
|
|
36
|
+
k = Regexp.last_match(1) || ""
|
|
37
|
+
after = Regexp.last_match ? Regexp.last_match.post_match : ""
|
|
38
|
+
|
|
39
|
+
if k.empty?
|
|
40
|
+
return Array(v) if !v.empty? && name == "[]"
|
|
41
|
+
|
|
42
|
+
return
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
case after
|
|
46
|
+
when ""
|
|
47
|
+
params[k] = v
|
|
48
|
+
when "["
|
|
49
|
+
params[name] = v
|
|
50
|
+
when "[]"
|
|
51
|
+
params[k] ||= []
|
|
52
|
+
raise Error, "expected Array (got #{params[k].class}) for param '#{k}'" unless params[k].is_a?(Array)
|
|
53
|
+
|
|
54
|
+
params[k] << v
|
|
55
|
+
when /^\[\]\[([^\[\]]+)\]$/, /^\[\](.+)$/
|
|
56
|
+
child_key = Regexp.last_match(1)
|
|
57
|
+
params[k] ||= []
|
|
58
|
+
raise Error, "expected Array (got #{params[k].class}) for param '#{k}'" unless params[k].is_a?(Array)
|
|
59
|
+
|
|
60
|
+
if params[k].last.is_a?(Hash) && !params_hash_has_key?(params[k].last, child_key)
|
|
61
|
+
normalize_query(params[k].last, child_key, v, depth - 1)
|
|
62
|
+
else
|
|
63
|
+
params[k] << normalize_query({}, child_key, v, depth - 1)
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
params[k] ||= {}
|
|
67
|
+
raise Error, "expected Hash (got #{params[k].class}) for param '#{k}'" unless params[k].is_a?(Hash)
|
|
68
|
+
|
|
69
|
+
params[k] = normalize_query(params[k], after, v, depth - 1)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
params
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def params_hash_has_key?(hash, key)
|
|
76
|
+
return false if /\[\]/.match?(key)
|
|
77
|
+
|
|
78
|
+
key.split(/[\[\]]+/).inject(hash) do |h, part|
|
|
79
|
+
next h if part == ""
|
|
80
|
+
return false unless h.is_a?(Hash) && h.key?(part)
|
|
81
|
+
|
|
82
|
+
h[part]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
true
|
|
86
|
+
end
|
|
26
87
|
end
|
|
27
88
|
end
|
|
28
89
|
|
data/lib/httpx/utils.rb
CHANGED
|
@@ -28,9 +28,9 @@ module HTTPX
|
|
|
28
28
|
URIParser = URI::RFC2396_Parser.new
|
|
29
29
|
|
|
30
30
|
def to_uri(uri)
|
|
31
|
-
return
|
|
31
|
+
return URI(uri) unless uri.is_a?(String) && !uri.ascii_only?
|
|
32
32
|
|
|
33
|
-
uri =
|
|
33
|
+
uri = URI(URIParser.escape(uri))
|
|
34
34
|
|
|
35
35
|
non_ascii_hostname = URIParser.unescape(uri.host)
|
|
36
36
|
|
data/lib/httpx/version.rb
CHANGED
data/lib/httpx.rb
CHANGED
|
@@ -20,6 +20,7 @@ require "httpx/response"
|
|
|
20
20
|
require "httpx/options"
|
|
21
21
|
require "httpx/chainable"
|
|
22
22
|
|
|
23
|
+
require "mutex_m"
|
|
23
24
|
# Top-Level Namespace
|
|
24
25
|
#
|
|
25
26
|
module HTTPX
|
|
@@ -28,15 +29,16 @@ module HTTPX
|
|
|
28
29
|
#
|
|
29
30
|
module Plugins
|
|
30
31
|
@plugins = {}
|
|
32
|
+
@plugins.extend(Mutex_m)
|
|
31
33
|
|
|
32
34
|
# Loads a plugin based on a name. If the plugin hasn't been loaded, tries to load
|
|
33
35
|
# it from the load path under "httpx/plugins/" directory.
|
|
34
36
|
#
|
|
35
37
|
def self.load_plugin(name)
|
|
36
38
|
h = @plugins
|
|
37
|
-
unless (plugin = h[name])
|
|
39
|
+
unless (plugin = h.synchronize { h[name] })
|
|
38
40
|
require "httpx/plugins/#{name}"
|
|
39
|
-
raise "Plugin #{name} hasn't been registered" unless (plugin = h[name])
|
|
41
|
+
raise "Plugin #{name} hasn't been registered" unless (plugin = h.synchronize { h[name] })
|
|
40
42
|
end
|
|
41
43
|
plugin
|
|
42
44
|
end
|
|
@@ -44,7 +46,8 @@ module HTTPX
|
|
|
44
46
|
# Registers a plugin (+mod+) in the central store indexed by +name+.
|
|
45
47
|
#
|
|
46
48
|
def self.register_plugin(name, mod)
|
|
47
|
-
|
|
49
|
+
h = @plugins
|
|
50
|
+
h.synchronize { h[name] = mod }
|
|
48
51
|
end
|
|
49
52
|
end
|
|
50
53
|
|
data/sig/buffer.rbs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module HTTPX
|
|
2
2
|
class Buffer
|
|
3
|
+
extend Forwardable
|
|
4
|
+
|
|
3
5
|
include _ToS
|
|
4
6
|
include _ToStr
|
|
5
7
|
|
|
@@ -11,7 +13,7 @@ module HTTPX
|
|
|
11
13
|
def shift!: (Integer) -> void
|
|
12
14
|
|
|
13
15
|
# delegated
|
|
14
|
-
def <<: (string data) ->
|
|
16
|
+
def <<: (string data) -> String
|
|
15
17
|
def empty?: () -> bool
|
|
16
18
|
def bytesize: () -> Integer
|
|
17
19
|
def clear: () -> void
|
data/sig/chainable.rbs
CHANGED
|
@@ -1,43 +1,44 @@
|
|
|
1
1
|
module HTTPX
|
|
2
2
|
module Chainable
|
|
3
|
-
def request: (*
|
|
3
|
+
def request: (*Request, **untyped) -> Array[response]
|
|
4
|
+
| (Request, **untyped) -> response
|
|
5
|
+
| (verb | string, uri | [uri], **untyped) -> response
|
|
6
|
+
| (Array[[verb | string, uri] | [verb | string, uri, options]], **untyped) -> Array[response]
|
|
7
|
+
| (verb | string, _Each[uri | [uri, options]], **untyped) -> Array[response]
|
|
8
|
+
|
|
4
9
|
def accept: (String) -> Session
|
|
5
10
|
def wrap: () { (Session) -> void } -> void
|
|
6
|
-
| () -> void
|
|
7
11
|
|
|
8
12
|
def with: (options) -> Session
|
|
9
|
-
| (options) { (Session) ->
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
| (options) { (Session) -> void } -> void
|
|
13
14
|
|
|
14
|
-
def plugin: (:authentication) -> Plugins::sessionAuthentication
|
|
15
|
-
| (:basic_authentication) -> Plugins::sessionBasicAuthentication
|
|
16
|
-
| (:digest_authentication) -> Plugins::sessionDigestAuthentication
|
|
17
|
-
| (:ntlm_authentication) -> Plugins::sessionNTLMAuthentication
|
|
18
|
-
| (:aws_sdk_authentication) -> Plugins::sessionAwsSdkAuthentication
|
|
19
|
-
| (:compression) -> Session
|
|
20
|
-
| (:cookies) -> Plugins::sessionCookies
|
|
21
|
-
| (:expect) -> Session
|
|
22
|
-
| (:follow_redirects) -> Plugins::sessionFollowRedirects
|
|
23
|
-
| (:upgrade) -> Session
|
|
24
|
-
| (:h2c) -> Session
|
|
25
|
-
| (:multipart) -> Session
|
|
26
|
-
| (:persistent) -> Plugins::sessionPersistent
|
|
27
|
-
| (:proxy) -> Plugins::sessionProxy
|
|
28
|
-
| (:push_promise) -> Plugins::sessionPushPromise
|
|
29
|
-
| (:retries) -> Plugins::sessionRetries
|
|
30
|
-
| (:rate_limiter) -> Session
|
|
31
|
-
| (:stream) -> Plugins::sessionStream
|
|
32
|
-
| (:aws_sigv4) -> Plugins::awsSigV4Session
|
|
33
|
-
| (:grpc) -> Plugins::grpcSession
|
|
34
|
-
| (Symbol | Module, ?options
|
|
35
|
-
| (Symbol | Module, ?options
|
|
15
|
+
def plugin: (:authentication, ?options) -> Plugins::sessionAuthentication
|
|
16
|
+
| (:basic_authentication, ?options) -> Plugins::sessionBasicAuthentication
|
|
17
|
+
| (:digest_authentication, ?options) -> Plugins::sessionDigestAuthentication
|
|
18
|
+
| (:ntlm_authentication, ?options) -> Plugins::sessionNTLMAuthentication
|
|
19
|
+
| (:aws_sdk_authentication, ?options) -> Plugins::sessionAwsSdkAuthentication
|
|
20
|
+
| (:compression, ?options) -> Session
|
|
21
|
+
| (:cookies, ?options) -> Plugins::sessionCookies
|
|
22
|
+
| (:expect, ?options) -> Session
|
|
23
|
+
| (:follow_redirects, ?options) -> Plugins::sessionFollowRedirects
|
|
24
|
+
| (:upgrade, ?options) -> Session
|
|
25
|
+
| (:h2c, ?options) -> Session
|
|
26
|
+
| (:multipart, ?options) -> Session
|
|
27
|
+
| (:persistent, ?options) -> Plugins::sessionPersistent
|
|
28
|
+
| (:proxy, ?options) -> Plugins::sessionProxy
|
|
29
|
+
| (:push_promise, ?options) -> Plugins::sessionPushPromise
|
|
30
|
+
| (:retries, ?options) -> Plugins::sessionRetries
|
|
31
|
+
| (:rate_limiter, ?options) -> Session
|
|
32
|
+
| (:stream, ?options) -> Plugins::sessionStream
|
|
33
|
+
| (:aws_sigv4, ?options) -> Plugins::awsSigV4Session
|
|
34
|
+
| (:grpc, ?options) -> Plugins::grpcSession
|
|
35
|
+
| (Symbol | Module, ?options) { (Class) -> void } -> Session
|
|
36
|
+
| (Symbol | Module, ?options) -> Session
|
|
36
37
|
|
|
37
38
|
private
|
|
38
39
|
|
|
39
40
|
def default_options: () -> Options
|
|
40
41
|
def branch: (options) -> Session
|
|
41
|
-
| (options) { (Session) ->
|
|
42
|
+
| (options) { (Session) -> void } -> Session
|
|
42
43
|
end
|
|
43
44
|
end
|