nano-smart-pkg 0.0.1
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 +7 -0
- data/faraday-2.14.3/CHANGELOG.md +574 -0
- data/faraday-2.14.3/LICENSE.md +20 -0
- data/faraday-2.14.3/README.md +67 -0
- data/faraday-2.14.3/Rakefile +12 -0
- data/faraday-2.14.3/examples/client_spec.rb +119 -0
- data/faraday-2.14.3/examples/client_test.rb +144 -0
- data/faraday-2.14.3/lib/faraday/adapter/test.rb +319 -0
- data/faraday-2.14.3/lib/faraday/adapter.rb +102 -0
- data/faraday-2.14.3/lib/faraday/adapter_registry.rb +30 -0
- data/faraday-2.14.3/lib/faraday/connection.rb +567 -0
- data/faraday-2.14.3/lib/faraday/encoders/flat_params_encoder.rb +106 -0
- data/faraday-2.14.3/lib/faraday/encoders/nested_params_encoder.rb +193 -0
- data/faraday-2.14.3/lib/faraday/error.rb +202 -0
- data/faraday-2.14.3/lib/faraday/logging/formatter.rb +118 -0
- data/faraday-2.14.3/lib/faraday/methods.rb +6 -0
- data/faraday-2.14.3/lib/faraday/middleware.rb +72 -0
- data/faraday-2.14.3/lib/faraday/middleware_registry.rb +83 -0
- data/faraday-2.14.3/lib/faraday/options/connection_options.rb +23 -0
- data/faraday-2.14.3/lib/faraday/options/env.rb +204 -0
- data/faraday-2.14.3/lib/faraday/options/proxy_options.rb +39 -0
- data/faraday-2.14.3/lib/faraday/options/request_options.rb +23 -0
- data/faraday-2.14.3/lib/faraday/options/ssl_options.rb +76 -0
- data/faraday-2.14.3/lib/faraday/options.rb +219 -0
- data/faraday-2.14.3/lib/faraday/parameters.rb +5 -0
- data/faraday-2.14.3/lib/faraday/rack_builder.rb +248 -0
- data/faraday-2.14.3/lib/faraday/request/authorization.rb +54 -0
- data/faraday-2.14.3/lib/faraday/request/instrumentation.rb +58 -0
- data/faraday-2.14.3/lib/faraday/request/json.rb +70 -0
- data/faraday-2.14.3/lib/faraday/request/url_encoded.rb +60 -0
- data/faraday-2.14.3/lib/faraday/request.rb +139 -0
- data/faraday-2.14.3/lib/faraday/response/json.rb +74 -0
- data/faraday-2.14.3/lib/faraday/response/logger.rb +39 -0
- data/faraday-2.14.3/lib/faraday/response/raise_error.rb +83 -0
- data/faraday-2.14.3/lib/faraday/response.rb +95 -0
- data/faraday-2.14.3/lib/faraday/utils/headers.rb +150 -0
- data/faraday-2.14.3/lib/faraday/utils/params_hash.rb +61 -0
- data/faraday-2.14.3/lib/faraday/utils.rb +121 -0
- data/faraday-2.14.3/lib/faraday/version.rb +5 -0
- data/faraday-2.14.3/lib/faraday.rb +306 -0
- data/faraday-2.14.3/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/faraday-2.14.3/spec/faraday/adapter/test_spec.rb +460 -0
- data/faraday-2.14.3/spec/faraday/adapter_registry_spec.rb +28 -0
- data/faraday-2.14.3/spec/faraday/adapter_spec.rb +55 -0
- data/faraday-2.14.3/spec/faraday/connection_spec.rb +860 -0
- data/faraday-2.14.3/spec/faraday/error_spec.rb +175 -0
- data/faraday-2.14.3/spec/faraday/middleware_registry_spec.rb +31 -0
- data/faraday-2.14.3/spec/faraday/middleware_spec.rb +213 -0
- data/faraday-2.14.3/spec/faraday/options/env_spec.rb +76 -0
- data/faraday-2.14.3/spec/faraday/options/options_spec.rb +297 -0
- data/faraday-2.14.3/spec/faraday/options/proxy_options_spec.rb +79 -0
- data/faraday-2.14.3/spec/faraday/options/request_options_spec.rb +19 -0
- data/faraday-2.14.3/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/faraday-2.14.3/spec/faraday/params_encoders/nested_spec.rb +179 -0
- data/faraday-2.14.3/spec/faraday/rack_builder_spec.rb +317 -0
- data/faraday-2.14.3/spec/faraday/request/authorization_spec.rb +118 -0
- data/faraday-2.14.3/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/faraday-2.14.3/spec/faraday/request/json_spec.rb +199 -0
- data/faraday-2.14.3/spec/faraday/request/url_encoded_spec.rb +93 -0
- data/faraday-2.14.3/spec/faraday/request_spec.rb +119 -0
- data/faraday-2.14.3/spec/faraday/response/json_spec.rb +206 -0
- data/faraday-2.14.3/spec/faraday/response/logger_spec.rb +299 -0
- data/faraday-2.14.3/spec/faraday/response/raise_error_spec.rb +286 -0
- data/faraday-2.14.3/spec/faraday/response_spec.rb +84 -0
- data/faraday-2.14.3/spec/faraday/utils/headers_spec.rb +109 -0
- data/faraday-2.14.3/spec/faraday/utils_spec.rb +120 -0
- data/faraday-2.14.3/spec/faraday_spec.rb +43 -0
- data/faraday-2.14.3/spec/spec_helper.rb +133 -0
- data/faraday-2.14.3/spec/support/disabling_stub.rb +14 -0
- data/faraday-2.14.3/spec/support/fake_safe_buffer.rb +15 -0
- data/faraday-2.14.3/spec/support/faraday_middleware_subclasses.rb +18 -0
- data/faraday-2.14.3/spec/support/helper_methods.rb +96 -0
- data/faraday-2.14.3/spec/support/shared_examples/adapter.rb +105 -0
- data/faraday-2.14.3/spec/support/shared_examples/params_encoder.rb +18 -0
- data/faraday-2.14.3/spec/support/shared_examples/request_method.rb +263 -0
- data/faraday-2.14.3/spec/support/streaming_response_checker.rb +35 -0
- data/nano-smart-pkg.gemspec +12 -0
- metadata +117 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
require 'logger'
|
|
5
|
+
require 'faraday/logging/formatter'
|
|
6
|
+
|
|
7
|
+
module Faraday
|
|
8
|
+
class Response
|
|
9
|
+
# Logger is a middleware that logs internal events in the HTTP request
|
|
10
|
+
# lifecycle to a given Logger object. By default, this logs to STDOUT. See
|
|
11
|
+
# Faraday::Logging::Formatter to see specifically what is logged.
|
|
12
|
+
class Logger < Middleware
|
|
13
|
+
DEFAULT_OPTIONS = { formatter: Logging::Formatter }.merge(Logging::Formatter::DEFAULT_OPTIONS).freeze
|
|
14
|
+
|
|
15
|
+
def initialize(app, logger = nil, options = {})
|
|
16
|
+
super(app, options)
|
|
17
|
+
logger ||= ::Logger.new($stdout)
|
|
18
|
+
formatter_class = @options.delete(:formatter)
|
|
19
|
+
@formatter = formatter_class.new(logger: logger, options: @options)
|
|
20
|
+
yield @formatter if block_given?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def call(env)
|
|
24
|
+
@formatter.request(env)
|
|
25
|
+
super
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def on_complete(env)
|
|
29
|
+
@formatter.response(env)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def on_error(exc)
|
|
33
|
+
@formatter.exception(exc) if @formatter.respond_to?(:exception)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
Faraday::Response.register_middleware(logger: Faraday::Response::Logger)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Faraday
|
|
4
|
+
class Response
|
|
5
|
+
# RaiseError is a Faraday middleware that raises exceptions on common HTTP
|
|
6
|
+
# client or server error responses.
|
|
7
|
+
class RaiseError < Middleware
|
|
8
|
+
# rubocop:disable Naming/ConstantName
|
|
9
|
+
ClientErrorStatuses = (400...500)
|
|
10
|
+
ServerErrorStatuses = (500...600)
|
|
11
|
+
ClientErrorStatusesWithCustomExceptions = {
|
|
12
|
+
400 => Faraday::BadRequestError,
|
|
13
|
+
401 => Faraday::UnauthorizedError,
|
|
14
|
+
403 => Faraday::ForbiddenError,
|
|
15
|
+
404 => Faraday::ResourceNotFound,
|
|
16
|
+
408 => Faraday::RequestTimeoutError,
|
|
17
|
+
409 => Faraday::ConflictError,
|
|
18
|
+
422 => Faraday::UnprocessableContentError,
|
|
19
|
+
429 => Faraday::TooManyRequestsError
|
|
20
|
+
}.freeze
|
|
21
|
+
# rubocop:enable Naming/ConstantName
|
|
22
|
+
|
|
23
|
+
DEFAULT_OPTIONS = { include_request: true, allowed_statuses: [] }.freeze
|
|
24
|
+
|
|
25
|
+
def on_complete(env)
|
|
26
|
+
return if Array(options[:allowed_statuses]).include?(env[:status])
|
|
27
|
+
|
|
28
|
+
case env[:status]
|
|
29
|
+
when *ClientErrorStatusesWithCustomExceptions.keys
|
|
30
|
+
raise ClientErrorStatusesWithCustomExceptions[env[:status]], response_values(env)
|
|
31
|
+
when 407
|
|
32
|
+
# mimic the behavior that we get with proxy requests with HTTPS
|
|
33
|
+
msg = %(407 "Proxy Authentication Required")
|
|
34
|
+
raise Faraday::ProxyAuthError.new(msg, response_values(env))
|
|
35
|
+
when ClientErrorStatuses
|
|
36
|
+
raise Faraday::ClientError, response_values(env)
|
|
37
|
+
when ServerErrorStatuses
|
|
38
|
+
raise Faraday::ServerError, response_values(env)
|
|
39
|
+
when nil
|
|
40
|
+
raise Faraday::NilStatusError, response_values(env)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns a hash of response data with the following keys:
|
|
45
|
+
# - status
|
|
46
|
+
# - headers
|
|
47
|
+
# - body
|
|
48
|
+
# - request
|
|
49
|
+
#
|
|
50
|
+
# The `request` key is omitted when the middleware is explicitly
|
|
51
|
+
# configured with the option `include_request: false`.
|
|
52
|
+
def response_values(env)
|
|
53
|
+
response = {
|
|
54
|
+
status: env.status,
|
|
55
|
+
headers: env.response_headers,
|
|
56
|
+
body: env.body
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Include the request data by default. If the middleware was explicitly
|
|
60
|
+
# configured to _not_ include request data, then omit it.
|
|
61
|
+
return response unless options[:include_request]
|
|
62
|
+
|
|
63
|
+
response.merge(
|
|
64
|
+
request: {
|
|
65
|
+
method: env.method,
|
|
66
|
+
url: env.url,
|
|
67
|
+
url_path: env.url.path,
|
|
68
|
+
params: query_params(env),
|
|
69
|
+
headers: env.request_headers,
|
|
70
|
+
body: env.request_body
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def query_params(env)
|
|
76
|
+
env.request.params_encoder ||= Faraday::Utils.default_params_encoder
|
|
77
|
+
env.params_encoder.decode(env.url.query)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
Faraday::Response.register_middleware(raise_error: Faraday::Response::RaiseError)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
module Faraday
|
|
6
|
+
# Response represents an HTTP response from making an HTTP request.
|
|
7
|
+
class Response
|
|
8
|
+
extend Forwardable
|
|
9
|
+
extend MiddlewareRegistry
|
|
10
|
+
|
|
11
|
+
def initialize(env = nil)
|
|
12
|
+
@env = Env.from(env) if env
|
|
13
|
+
@on_complete_callbacks = []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attr_reader :env
|
|
17
|
+
|
|
18
|
+
def status
|
|
19
|
+
finished? ? env.status : nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def reason_phrase
|
|
23
|
+
finished? ? env.reason_phrase : nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def headers
|
|
27
|
+
finished? ? env.response_headers : {}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def_delegator :headers, :[]
|
|
31
|
+
|
|
32
|
+
def body
|
|
33
|
+
finished? ? env.body : nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def url
|
|
37
|
+
finished? ? env.url : nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def finished?
|
|
41
|
+
!!env
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def on_complete(&block)
|
|
45
|
+
if finished?
|
|
46
|
+
yield(env)
|
|
47
|
+
else
|
|
48
|
+
@on_complete_callbacks << block
|
|
49
|
+
end
|
|
50
|
+
self
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def finish(env)
|
|
54
|
+
raise 'response already finished' if finished?
|
|
55
|
+
|
|
56
|
+
@env = env.is_a?(Env) ? env : Env.from(env)
|
|
57
|
+
@on_complete_callbacks.each { |callback| callback.call(@env) }
|
|
58
|
+
self
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def success?
|
|
62
|
+
finished? && env.success?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def to_hash
|
|
66
|
+
{
|
|
67
|
+
status: status, body: body,
|
|
68
|
+
response_headers: headers,
|
|
69
|
+
url: url
|
|
70
|
+
}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# because @on_complete_callbacks cannot be marshalled
|
|
74
|
+
def marshal_dump
|
|
75
|
+
finished? ? to_hash : nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def marshal_load(env)
|
|
79
|
+
@env = Env.from(env)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Expand the env with more properties, without overriding existing ones.
|
|
83
|
+
# Useful for applying request params after restoring a marshalled Response.
|
|
84
|
+
def apply_request(request_env)
|
|
85
|
+
raise "response didn't finish yet" unless finished?
|
|
86
|
+
|
|
87
|
+
@env = Env.from(request_env).update(@env)
|
|
88
|
+
self
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
require 'faraday/response/json'
|
|
94
|
+
require 'faraday/response/logger'
|
|
95
|
+
require 'faraday/response/raise_error'
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Faraday
|
|
4
|
+
module Utils
|
|
5
|
+
# A case-insensitive Hash that preserves the original case of a header
|
|
6
|
+
# when set.
|
|
7
|
+
#
|
|
8
|
+
# Adapted from Rack::Utils::HeaderHash
|
|
9
|
+
class Headers < ::Hash
|
|
10
|
+
def self.from(value)
|
|
11
|
+
new(value)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.allocate
|
|
15
|
+
new_self = super
|
|
16
|
+
new_self.initialize_names
|
|
17
|
+
new_self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(hash = nil)
|
|
21
|
+
super()
|
|
22
|
+
@names = {}
|
|
23
|
+
update(hash || {})
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize_names
|
|
27
|
+
@names = {}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# on dup/clone, we need to duplicate @names hash
|
|
31
|
+
def initialize_copy(other)
|
|
32
|
+
super
|
|
33
|
+
@names = other.names.dup
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# need to synchronize concurrent writes to the shared KeyMap
|
|
37
|
+
keymap_mutex = Mutex.new
|
|
38
|
+
|
|
39
|
+
# symbol -> string mapper + cache
|
|
40
|
+
KeyMap = Hash.new do |map, key|
|
|
41
|
+
value = if key.respond_to?(:to_str)
|
|
42
|
+
key
|
|
43
|
+
else
|
|
44
|
+
key.to_s.split('_') # user_agent: %w(user agent)
|
|
45
|
+
.each(&:capitalize!) # => %w(User Agent)
|
|
46
|
+
.join('-') # => "User-Agent"
|
|
47
|
+
end
|
|
48
|
+
keymap_mutex.synchronize { map[key] = value }
|
|
49
|
+
end
|
|
50
|
+
KeyMap[:etag] = 'ETag'
|
|
51
|
+
|
|
52
|
+
def [](key)
|
|
53
|
+
key = KeyMap[key]
|
|
54
|
+
super || super(@names[key.downcase])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def []=(key, val)
|
|
58
|
+
key = KeyMap[key]
|
|
59
|
+
key = (@names[key.downcase] ||= key)
|
|
60
|
+
# join multiple values with a comma
|
|
61
|
+
val = val.to_ary.join(', ') if val.respond_to?(:to_ary)
|
|
62
|
+
super
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def fetch(key, ...)
|
|
66
|
+
key = KeyMap[key]
|
|
67
|
+
key = @names.fetch(key.downcase, key)
|
|
68
|
+
super
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def delete(key)
|
|
72
|
+
key = KeyMap[key]
|
|
73
|
+
key = @names[key.downcase]
|
|
74
|
+
return unless key
|
|
75
|
+
|
|
76
|
+
@names.delete key.downcase
|
|
77
|
+
super
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def dig(key, *rest)
|
|
81
|
+
key = KeyMap[key]
|
|
82
|
+
key = @names.fetch(key.downcase, key)
|
|
83
|
+
super
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def include?(key)
|
|
87
|
+
@names.include? key.downcase
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
alias has_key? include?
|
|
91
|
+
alias member? include?
|
|
92
|
+
alias key? include?
|
|
93
|
+
|
|
94
|
+
def merge!(other)
|
|
95
|
+
other.each { |k, v| self[k] = v }
|
|
96
|
+
self
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
alias update merge!
|
|
100
|
+
|
|
101
|
+
def merge(other)
|
|
102
|
+
hash = dup
|
|
103
|
+
hash.merge! other
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def replace(other)
|
|
107
|
+
clear
|
|
108
|
+
@names.clear
|
|
109
|
+
update other
|
|
110
|
+
self
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def to_hash
|
|
114
|
+
{}.update(self)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def parse(header_string)
|
|
118
|
+
return unless header_string && !header_string.empty?
|
|
119
|
+
|
|
120
|
+
headers = header_string.split("\r\n")
|
|
121
|
+
|
|
122
|
+
# Find the last set of response headers.
|
|
123
|
+
start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0
|
|
124
|
+
last_response = headers.slice(start_index, headers.size)
|
|
125
|
+
|
|
126
|
+
last_response
|
|
127
|
+
.tap { |a| a.shift if a.first.start_with?('HTTP/') }
|
|
128
|
+
.map { |h| h.split(/:\s*/, 2) } # split key and value
|
|
129
|
+
.reject { |p| p[0].nil? } # ignore blank lines
|
|
130
|
+
.each { |key, value| add_parsed(key, value) }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
protected
|
|
134
|
+
|
|
135
|
+
attr_reader :names
|
|
136
|
+
|
|
137
|
+
private
|
|
138
|
+
|
|
139
|
+
# Join multiple values with a comma.
|
|
140
|
+
def add_parsed(key, value)
|
|
141
|
+
if key?(key)
|
|
142
|
+
self[key] = self[key].to_s
|
|
143
|
+
self[key] << ', ' << value
|
|
144
|
+
else
|
|
145
|
+
self[key] = value
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Faraday
|
|
4
|
+
module Utils
|
|
5
|
+
# A hash with stringified keys.
|
|
6
|
+
class ParamsHash < Hash
|
|
7
|
+
def [](key)
|
|
8
|
+
super(convert_key(key))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def []=(key, value)
|
|
12
|
+
super(convert_key(key), value)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def delete(key)
|
|
16
|
+
super(convert_key(key))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def include?(key)
|
|
20
|
+
super(convert_key(key))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
alias has_key? include?
|
|
24
|
+
alias member? include?
|
|
25
|
+
alias key? include?
|
|
26
|
+
|
|
27
|
+
def update(params)
|
|
28
|
+
params.each do |key, value|
|
|
29
|
+
self[key] = value
|
|
30
|
+
end
|
|
31
|
+
self
|
|
32
|
+
end
|
|
33
|
+
alias merge! update
|
|
34
|
+
|
|
35
|
+
def merge(params)
|
|
36
|
+
dup.update(params)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def replace(other)
|
|
40
|
+
clear
|
|
41
|
+
update(other)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def merge_query(query, encoder = nil)
|
|
45
|
+
return self unless query && !query.empty?
|
|
46
|
+
|
|
47
|
+
update((encoder || Utils.default_params_encoder).decode(query))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def to_query(encoder = nil)
|
|
51
|
+
(encoder || Utils.default_params_encoder).encode(self)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def convert_key(key)
|
|
57
|
+
key.to_s
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uri'
|
|
4
|
+
require 'faraday/utils/headers'
|
|
5
|
+
require 'faraday/utils/params_hash'
|
|
6
|
+
|
|
7
|
+
module Faraday
|
|
8
|
+
# Utils contains various static helper methods.
|
|
9
|
+
module Utils
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
def build_query(params)
|
|
13
|
+
FlatParamsEncoder.encode(params)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def build_nested_query(params)
|
|
17
|
+
NestedParamsEncoder.encode(params)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def default_space_encoding
|
|
21
|
+
@default_space_encoding ||= '+'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class << self
|
|
25
|
+
attr_writer :default_space_encoding
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/
|
|
29
|
+
|
|
30
|
+
def escape(str)
|
|
31
|
+
str.to_s.gsub(ESCAPE_RE) do |match|
|
|
32
|
+
"%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
|
|
33
|
+
end.gsub(' ', default_space_encoding)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def unescape(str)
|
|
37
|
+
CGI.unescape str.to_s
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
DEFAULT_SEP = /[&;] */n
|
|
41
|
+
|
|
42
|
+
# Adapted from Rack
|
|
43
|
+
def parse_query(query)
|
|
44
|
+
FlatParamsEncoder.decode(query)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def parse_nested_query(query)
|
|
48
|
+
NestedParamsEncoder.decode(query)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def default_params_encoder
|
|
52
|
+
@default_params_encoder ||= NestedParamsEncoder
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def basic_header_from(login, pass)
|
|
56
|
+
value = ["#{login}:#{pass}"].pack('m') # Base64 encoding
|
|
57
|
+
value.delete!("\n")
|
|
58
|
+
"Basic #{value}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class << self
|
|
62
|
+
attr_writer :default_params_encoder
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Normalize URI() behavior across Ruby versions
|
|
66
|
+
#
|
|
67
|
+
# url - A String or URI.
|
|
68
|
+
#
|
|
69
|
+
# Returns a parsed URI.
|
|
70
|
+
def URI(url) # rubocop:disable Naming/MethodName
|
|
71
|
+
if url.respond_to?(:host)
|
|
72
|
+
url
|
|
73
|
+
elsif url.respond_to?(:to_str)
|
|
74
|
+
default_uri_parser.call(url)
|
|
75
|
+
else
|
|
76
|
+
raise ArgumentError, 'bad argument (expected URI object or URI string)'
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def default_uri_parser
|
|
81
|
+
@default_uri_parser ||= Kernel.method(:URI)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def default_uri_parser=(parser)
|
|
85
|
+
@default_uri_parser = if parser.respond_to?(:call) || parser.nil?
|
|
86
|
+
parser
|
|
87
|
+
else
|
|
88
|
+
parser.method(:parse)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Receives a String or URI and returns just
|
|
93
|
+
# the path with the query string sorted.
|
|
94
|
+
def normalize_path(url)
|
|
95
|
+
url = URI(url)
|
|
96
|
+
(url.path.start_with?('/') ? url.path : "/#{url.path}") +
|
|
97
|
+
(url.query ? "?#{sort_query_params(url.query)}" : '')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Recursive hash update
|
|
101
|
+
def deep_merge!(target, hash)
|
|
102
|
+
hash.each do |key, value|
|
|
103
|
+
target[key] = if value.is_a?(Hash) && (target[key].is_a?(Hash) || target[key].is_a?(Options))
|
|
104
|
+
deep_merge(target[key], value)
|
|
105
|
+
else
|
|
106
|
+
value
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
target
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Recursive hash merge
|
|
113
|
+
def deep_merge(source, hash)
|
|
114
|
+
deep_merge!(source.dup, hash)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def sort_query_params(query)
|
|
118
|
+
query.split('&').sort.join('&')
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|