dhc 1.0.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 +7 -0
- data/.github/workflows/rubocop.yml +27 -0
- data/.github/workflows/test.yml +27 -0
- data/.gitignore +37 -0
- data/.rubocop.yml +105 -0
- data/.ruby-version +1 -0
- data/Gemfile +5 -0
- data/LICENSE +674 -0
- data/README.md +999 -0
- data/Rakefile +25 -0
- data/dhc.gemspec +40 -0
- data/lib/core_ext/hash/deep_transform_values.rb +48 -0
- data/lib/dhc.rb +77 -0
- data/lib/dhc/concerns/dhc/basic_methods_concern.rb +42 -0
- data/lib/dhc/concerns/dhc/configuration_concern.rb +20 -0
- data/lib/dhc/concerns/dhc/fix_invalid_encoding_concern.rb +42 -0
- data/lib/dhc/concerns/dhc/formats_concern.rb +25 -0
- data/lib/dhc/concerns/dhc/request/user_agent_concern.rb +25 -0
- data/lib/dhc/config.rb +47 -0
- data/lib/dhc/endpoint.rb +119 -0
- data/lib/dhc/error.rb +82 -0
- data/lib/dhc/errors/client_error.rb +73 -0
- data/lib/dhc/errors/parser_error.rb +4 -0
- data/lib/dhc/errors/server_error.rb +28 -0
- data/lib/dhc/errors/timeout.rb +4 -0
- data/lib/dhc/errors/unknown_error.rb +4 -0
- data/lib/dhc/format.rb +18 -0
- data/lib/dhc/formats.rb +8 -0
- data/lib/dhc/formats/form.rb +45 -0
- data/lib/dhc/formats/json.rb +55 -0
- data/lib/dhc/formats/multipart.rb +45 -0
- data/lib/dhc/formats/plain.rb +42 -0
- data/lib/dhc/interceptor.rb +36 -0
- data/lib/dhc/interceptors.rb +26 -0
- data/lib/dhc/interceptors/auth.rb +94 -0
- data/lib/dhc/interceptors/caching.rb +148 -0
- data/lib/dhc/interceptors/default_timeout.rb +16 -0
- data/lib/dhc/interceptors/logging.rb +37 -0
- data/lib/dhc/interceptors/monitoring.rb +92 -0
- data/lib/dhc/interceptors/prometheus.rb +51 -0
- data/lib/dhc/interceptors/retry.rb +41 -0
- data/lib/dhc/interceptors/rollbar.rb +36 -0
- data/lib/dhc/interceptors/throttle.rb +86 -0
- data/lib/dhc/interceptors/zipkin.rb +110 -0
- data/lib/dhc/railtie.rb +9 -0
- data/lib/dhc/request.rb +161 -0
- data/lib/dhc/response.rb +60 -0
- data/lib/dhc/response/data.rb +28 -0
- data/lib/dhc/response/data/base.rb +18 -0
- data/lib/dhc/response/data/collection.rb +16 -0
- data/lib/dhc/response/data/item.rb +29 -0
- data/lib/dhc/rspec.rb +11 -0
- data/lib/dhc/test/cache_helper.rb +3 -0
- data/lib/dhc/version.rb +5 -0
- data/script/ci/build.sh +19 -0
- data/spec/basic_methods/delete_spec.rb +34 -0
- data/spec/basic_methods/get_spec.rb +49 -0
- data/spec/basic_methods/post_spec.rb +42 -0
- data/spec/basic_methods/put_spec.rb +48 -0
- data/spec/basic_methods/request_spec.rb +19 -0
- data/spec/basic_methods/request_without_rails_spec.rb +29 -0
- data/spec/config/endpoints_spec.rb +63 -0
- data/spec/config/placeholders_spec.rb +32 -0
- data/spec/core_ext/hash/deep_transform_values_spec.rb +24 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +8 -0
- data/spec/dummy/app/assets/config/manifest.js +3 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +7 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +4 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +5 -0
- data/spec/dummy/bin/rails +6 -0
- data/spec/dummy/bin/rake +6 -0
- data/spec/dummy/config.ru +6 -0
- data/spec/dummy/config/application.rb +16 -0
- data/spec/dummy/config/boot.rb +7 -0
- data/spec/dummy/config/environment.rb +7 -0
- data/spec/dummy/config/environments/development.rb +36 -0
- data/spec/dummy/config/environments/production.rb +77 -0
- data/spec/dummy/config/environments/test.rb +41 -0
- data/spec/dummy/config/initializers/assets.rb +10 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +9 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/spec/dummy/config/initializers/inflections.rb +18 -0
- data/spec/dummy/config/initializers/mime_types.rb +6 -0
- data/spec/dummy/config/initializers/session_store.rb +5 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +11 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/endpoint/compile_spec.rb +35 -0
- data/spec/endpoint/match_spec.rb +41 -0
- data/spec/endpoint/placeholders_spec.rb +30 -0
- data/spec/endpoint/remove_interpolated_params_spec.rb +17 -0
- data/spec/endpoint/values_as_params_spec.rb +31 -0
- data/spec/error/dup_spec.rb +12 -0
- data/spec/error/find_spec.rb +57 -0
- data/spec/error/response_spec.rb +17 -0
- data/spec/error/timeout_spec.rb +14 -0
- data/spec/error/to_s_spec.rb +85 -0
- data/spec/formats/form_spec.rb +27 -0
- data/spec/formats/json_spec.rb +66 -0
- data/spec/formats/multipart_spec.rb +26 -0
- data/spec/formats/plain_spec.rb +29 -0
- data/spec/interceptors/after_request_spec.rb +20 -0
- data/spec/interceptors/after_response_spec.rb +39 -0
- data/spec/interceptors/auth/basic_auth_spec.rb +17 -0
- data/spec/interceptors/auth/bearer_spec.rb +19 -0
- data/spec/interceptors/auth/body_spec.rb +36 -0
- data/spec/interceptors/auth/long_basic_auth_credentials_spec.rb +17 -0
- data/spec/interceptors/auth/no_instance_var_for_options_spec.rb +27 -0
- data/spec/interceptors/auth/reauthentication_configuration_spec.rb +61 -0
- data/spec/interceptors/auth/reauthentication_spec.rb +44 -0
- data/spec/interceptors/before_request_spec.rb +21 -0
- data/spec/interceptors/before_response_spec.rb +20 -0
- data/spec/interceptors/caching/hydra_spec.rb +26 -0
- data/spec/interceptors/caching/main_spec.rb +73 -0
- data/spec/interceptors/caching/methods_spec.rb +42 -0
- data/spec/interceptors/caching/multilevel_cache_spec.rb +139 -0
- data/spec/interceptors/caching/options_spec.rb +78 -0
- data/spec/interceptors/caching/parameters_spec.rb +24 -0
- data/spec/interceptors/caching/response_status_spec.rb +29 -0
- data/spec/interceptors/caching/to_cache_spec.rb +16 -0
- data/spec/interceptors/default_interceptors_spec.rb +15 -0
- data/spec/interceptors/default_timeout/main_spec.rb +34 -0
- data/spec/interceptors/define_spec.rb +30 -0
- data/spec/interceptors/dup_spec.rb +19 -0
- data/spec/interceptors/logging/main_spec.rb +37 -0
- data/spec/interceptors/monitoring/caching_spec.rb +66 -0
- data/spec/interceptors/monitoring/main_spec.rb +97 -0
- data/spec/interceptors/prometheus_spec.rb +54 -0
- data/spec/interceptors/response_competition_spec.rb +39 -0
- data/spec/interceptors/retry/main_spec.rb +73 -0
- data/spec/interceptors/return_response_spec.rb +38 -0
- data/spec/interceptors/rollbar/invalid_encoding_spec.rb +43 -0
- data/spec/interceptors/rollbar/main_spec.rb +57 -0
- data/spec/interceptors/throttle/main_spec.rb +236 -0
- data/spec/interceptors/throttle/reset_track_spec.rb +53 -0
- data/spec/interceptors/zipkin/distributed_tracing_spec.rb +135 -0
- data/spec/rails_helper.rb +6 -0
- data/spec/request/body_spec.rb +39 -0
- data/spec/request/encoding_spec.rb +38 -0
- data/spec/request/error_handling_spec.rb +88 -0
- data/spec/request/headers_spec.rb +12 -0
- data/spec/request/ignore_errors_spec.rb +73 -0
- data/spec/request/option_dup_spec.rb +13 -0
- data/spec/request/parallel_requests_spec.rb +59 -0
- data/spec/request/params_encoding_spec.rb +26 -0
- data/spec/request/request_without_rails_spec.rb +15 -0
- data/spec/request/url_patterns_spec.rb +54 -0
- data/spec/request/user_agent_spec.rb +26 -0
- data/spec/request/user_agent_without_rails_spec.rb +27 -0
- data/spec/response/body_spec.rb +16 -0
- data/spec/response/code_spec.rb +16 -0
- data/spec/response/data_accessor_spec.rb +29 -0
- data/spec/response/data_spec.rb +85 -0
- data/spec/response/effective_url_spec.rb +16 -0
- data/spec/response/headers_spec.rb +18 -0
- data/spec/response/options_spec.rb +18 -0
- data/spec/response/success_spec.rb +13 -0
- data/spec/response/time_spec.rb +21 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/fixtures/json/feedback.json +11 -0
- data/spec/support/fixtures/json/feedbacks.json +164 -0
- data/spec/support/fixtures/json/localina_content_ad.json +23 -0
- data/spec/support/load_json.rb +5 -0
- data/spec/support/reset_config.rb +8 -0
- data/spec/support/zipkin_mock.rb +114 -0
- data/spec/timeouts/no_signal_spec.rb +13 -0
- data/spec/timeouts/timings_spec.rb +55 -0
- metadata +527 -0
data/lib/dhc/error.rb
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DHC::Error < StandardError
|
|
4
|
+
include DHC::FixInvalidEncodingConcern
|
|
5
|
+
|
|
6
|
+
attr_accessor :response, :_message
|
|
7
|
+
|
|
8
|
+
def self.map
|
|
9
|
+
{
|
|
10
|
+
400 => DHC::BadRequest,
|
|
11
|
+
401 => DHC::Unauthorized,
|
|
12
|
+
402 => DHC::PaymentRequired,
|
|
13
|
+
403 => DHC::Forbidden,
|
|
14
|
+
404 => DHC::NotFound,
|
|
15
|
+
405 => DHC::MethodNotAllowed,
|
|
16
|
+
406 => DHC::NotAcceptable,
|
|
17
|
+
407 => DHC::ProxyAuthenticationRequired,
|
|
18
|
+
408 => DHC::RequestTimeout,
|
|
19
|
+
409 => DHC::Conflict,
|
|
20
|
+
410 => DHC::Gone,
|
|
21
|
+
411 => DHC::LengthRequired,
|
|
22
|
+
412 => DHC::PreconditionFailed,
|
|
23
|
+
413 => DHC::RequestEntityTooLarge,
|
|
24
|
+
414 => DHC::RequestUriToLong,
|
|
25
|
+
415 => DHC::UnsupportedMediaType,
|
|
26
|
+
416 => DHC::RequestedRangeNotSatisfiable,
|
|
27
|
+
417 => DHC::ExpectationFailed,
|
|
28
|
+
422 => DHC::UnprocessableEntity,
|
|
29
|
+
423 => DHC::Locked,
|
|
30
|
+
424 => DHC::FailedDependency,
|
|
31
|
+
426 => DHC::UpgradeRequired,
|
|
32
|
+
|
|
33
|
+
500 => DHC::InternalServerError,
|
|
34
|
+
501 => DHC::NotImplemented,
|
|
35
|
+
502 => DHC::BadGateway,
|
|
36
|
+
503 => DHC::ServiceUnavailable,
|
|
37
|
+
504 => DHC::GatewayTimeout,
|
|
38
|
+
505 => DHC::HttpVersionNotSupported,
|
|
39
|
+
507 => DHC::InsufficientStorage,
|
|
40
|
+
510 => DHC::NotExtended
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.find(response)
|
|
45
|
+
return DHC::Timeout if response.timeout?
|
|
46
|
+
status_code = response.code.to_s[0..2].to_i
|
|
47
|
+
error = map[status_code]
|
|
48
|
+
error ||= DHC::UnknownError
|
|
49
|
+
error
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.dup
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def initialize(message, response)
|
|
57
|
+
super(message)
|
|
58
|
+
self._message = message
|
|
59
|
+
self.response = response
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.to_a
|
|
63
|
+
[self]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def to_s
|
|
67
|
+
return response.to_s unless response.is_a?(DHC::Response)
|
|
68
|
+
request = response.request
|
|
69
|
+
return unless request.is_a?(DHC::Request)
|
|
70
|
+
|
|
71
|
+
debug = []
|
|
72
|
+
debug << [request.method, request.url].map { |str| self.class.fix_invalid_encoding(str) }.join(' ')
|
|
73
|
+
debug << "Options: #{request.options}"
|
|
74
|
+
debug << "Headers: #{request.headers}"
|
|
75
|
+
debug << "Response Code: #{response.code} (#{response.options[:return_code]})"
|
|
76
|
+
debug << "Response Options: #{response.options}"
|
|
77
|
+
debug << response.body
|
|
78
|
+
debug << _message
|
|
79
|
+
|
|
80
|
+
debug.map { |str| self.class.fix_invalid_encoding(str) }.join("\n")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DHC::ClientError < DHC::Error
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class DHC::BadRequest < DHC::ClientError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class DHC::Unauthorized < DHC::ClientError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class DHC::PaymentRequired < DHC::ClientError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class DHC::Forbidden < DHC::ClientError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class DHC::Forbidden < DHC::ClientError
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class DHC::NotFound < DHC::ClientError
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class DHC::MethodNotAllowed < DHC::ClientError
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class DHC::NotAcceptable < DHC::ClientError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class DHC::ProxyAuthenticationRequired < DHC::ClientError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class DHC::RequestTimeout < DHC::ClientError
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class DHC::Conflict < DHC::ClientError
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class DHC::Gone < DHC::ClientError
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class DHC::LengthRequired < DHC::ClientError
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class DHC::PreconditionFailed < DHC::ClientError
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class DHC::RequestEntityTooLarge < DHC::ClientError
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class DHC::RequestUriToLong < DHC::ClientError
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class DHC::UnsupportedMediaType < DHC::ClientError
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class DHC::RequestedRangeNotSatisfiable < DHC::ClientError
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class DHC::ExpectationFailed < DHC::ClientError
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class DHC::UnprocessableEntity < DHC::ClientError
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class DHC::Locked < DHC::ClientError
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class DHC::FailedDependency < DHC::ClientError
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
class DHC::UpgradeRequired < DHC::ClientError
|
|
73
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DHC::ServerError < DHC::Error
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class DHC::InternalServerError < DHC::ServerError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class DHC::NotImplemented < DHC::ServerError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class DHC::BadGateway < DHC::ServerError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class DHC::ServiceUnavailable < DHC::ServerError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class DHC::GatewayTimeout < DHC::ServerError
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class DHC::HttpVersionNotSupported < DHC::ServerError
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class DHC::InsufficientStorage < DHC::ServerError
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class DHC::NotExtended < DHC::ServerError
|
|
28
|
+
end
|
data/lib/dhc/format.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DHC::Format
|
|
4
|
+
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def no_content_type_header!(options)
|
|
8
|
+
return if (options[:headers].keys & [:'Content-Type', 'Content-Type']).blank?
|
|
9
|
+
|
|
10
|
+
raise 'Content-Type header is not allowed for formatted requests!\nSee https://github.com/DePayFi/dhc#formats for more information.'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def no_accept_header!(options)
|
|
14
|
+
return if (options[:headers].keys & [:Accept, 'Accept']).blank?
|
|
15
|
+
|
|
16
|
+
raise 'Accept header is not allowed for formatted requests!\nSee https://github.com/DePayFi/dhc#formats for more information.'
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/dhc/formats.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DHC::Formats
|
|
4
|
+
class Form < DHC::Format
|
|
5
|
+
include DHC::BasicMethodsConcern
|
|
6
|
+
|
|
7
|
+
def self.request(options)
|
|
8
|
+
options[:format] = new
|
|
9
|
+
super(options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def format_options(options)
|
|
13
|
+
options[:headers] ||= {}
|
|
14
|
+
no_content_type_header!(options)
|
|
15
|
+
options[:headers]['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
16
|
+
options
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def as_json(input)
|
|
20
|
+
parse(input)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def as_open_struct(input)
|
|
24
|
+
parse(input)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def to_body(input)
|
|
28
|
+
input
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
'form'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_sym
|
|
36
|
+
to_s.to_sym
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def parse(input)
|
|
42
|
+
input
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DHC::Formats
|
|
4
|
+
class JSON < DHC::Format
|
|
5
|
+
include DHC::BasicMethodsConcern
|
|
6
|
+
|
|
7
|
+
def self.request(options)
|
|
8
|
+
options[:format] = new
|
|
9
|
+
super(options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def format_options(options)
|
|
13
|
+
options[:headers] ||= {}
|
|
14
|
+
no_content_type_header!(options)
|
|
15
|
+
no_accept_header!(options)
|
|
16
|
+
|
|
17
|
+
options[:headers]['Content-Type'] = 'application/json; charset=utf-8'
|
|
18
|
+
options[:headers]['Accept'] = 'application/json,application/vnd.api+json'
|
|
19
|
+
options[:headers]['Accept-Charset'] = 'utf-8'
|
|
20
|
+
options
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def as_json(input)
|
|
24
|
+
parse(input, Hash)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def as_open_struct(input)
|
|
28
|
+
parse(input, OpenStruct)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_body(input)
|
|
32
|
+
if input.is_a?(String)
|
|
33
|
+
input
|
|
34
|
+
else
|
|
35
|
+
input.to_json
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_s
|
|
40
|
+
'json'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def to_sym
|
|
44
|
+
to_s.to_sym
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def parse(input, object_class)
|
|
50
|
+
::JSON.parse(input, object_class: object_class)
|
|
51
|
+
rescue ::JSON::ParserError => e
|
|
52
|
+
raise DHC::ParserError.new(e.message, input)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DHC::Formats
|
|
4
|
+
class Multipart < DHC::Format
|
|
5
|
+
include DHC::BasicMethodsConcern
|
|
6
|
+
|
|
7
|
+
def self.request(options)
|
|
8
|
+
options[:format] = new
|
|
9
|
+
super(options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def format_options(options)
|
|
13
|
+
options[:headers] ||= {}
|
|
14
|
+
no_content_type_header!(options)
|
|
15
|
+
options[:headers]['Content-Type'] = 'multipart/form-data'
|
|
16
|
+
options
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def as_json(input)
|
|
20
|
+
parse(input)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def as_open_struct(input)
|
|
24
|
+
parse(input)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def to_body(input)
|
|
28
|
+
input
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
'multipart'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_sym
|
|
36
|
+
to_s.to_sym
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def parse(input)
|
|
42
|
+
input
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DHC::Formats
|
|
4
|
+
class Plain < DHC::Format
|
|
5
|
+
include DHC::BasicMethodsConcern
|
|
6
|
+
|
|
7
|
+
def self.request(options)
|
|
8
|
+
options[:format] = new
|
|
9
|
+
super(options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def format_options(options)
|
|
13
|
+
options
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def as_json(input)
|
|
17
|
+
parse(input)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def as_open_struct(input)
|
|
21
|
+
parse(input)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_body(input)
|
|
25
|
+
input
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def to_s
|
|
29
|
+
'plain'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def to_sym
|
|
33
|
+
to_s.to_sym
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def parse(input)
|
|
39
|
+
input
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DHC::Interceptor
|
|
4
|
+
|
|
5
|
+
attr_reader :request
|
|
6
|
+
|
|
7
|
+
def initialize(request)
|
|
8
|
+
@request = request
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def response
|
|
12
|
+
@request.response
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def before_raw_request; end
|
|
16
|
+
|
|
17
|
+
def before_request; end
|
|
18
|
+
|
|
19
|
+
def after_request; end
|
|
20
|
+
|
|
21
|
+
def before_response; end
|
|
22
|
+
|
|
23
|
+
def after_response; end
|
|
24
|
+
|
|
25
|
+
# Prevent Interceptors from beeing duplicated!
|
|
26
|
+
# Their classes have flag-character.
|
|
27
|
+
# When duplicated you can't check for their class name anymore:
|
|
28
|
+
# e.g. options.deep_dup[:interceptors].include?(DHC::Caching) # false
|
|
29
|
+
def self.dup
|
|
30
|
+
self
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def all_interceptor_classes
|
|
34
|
+
@all_interceptors ||= DHC::Interceptors.new(request).all.map(&:class)
|
|
35
|
+
end
|
|
36
|
+
end
|