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.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/rubocop.yml +27 -0
  3. data/.github/workflows/test.yml +27 -0
  4. data/.gitignore +37 -0
  5. data/.rubocop.yml +105 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE +674 -0
  9. data/README.md +999 -0
  10. data/Rakefile +25 -0
  11. data/dhc.gemspec +40 -0
  12. data/lib/core_ext/hash/deep_transform_values.rb +48 -0
  13. data/lib/dhc.rb +77 -0
  14. data/lib/dhc/concerns/dhc/basic_methods_concern.rb +42 -0
  15. data/lib/dhc/concerns/dhc/configuration_concern.rb +20 -0
  16. data/lib/dhc/concerns/dhc/fix_invalid_encoding_concern.rb +42 -0
  17. data/lib/dhc/concerns/dhc/formats_concern.rb +25 -0
  18. data/lib/dhc/concerns/dhc/request/user_agent_concern.rb +25 -0
  19. data/lib/dhc/config.rb +47 -0
  20. data/lib/dhc/endpoint.rb +119 -0
  21. data/lib/dhc/error.rb +82 -0
  22. data/lib/dhc/errors/client_error.rb +73 -0
  23. data/lib/dhc/errors/parser_error.rb +4 -0
  24. data/lib/dhc/errors/server_error.rb +28 -0
  25. data/lib/dhc/errors/timeout.rb +4 -0
  26. data/lib/dhc/errors/unknown_error.rb +4 -0
  27. data/lib/dhc/format.rb +18 -0
  28. data/lib/dhc/formats.rb +8 -0
  29. data/lib/dhc/formats/form.rb +45 -0
  30. data/lib/dhc/formats/json.rb +55 -0
  31. data/lib/dhc/formats/multipart.rb +45 -0
  32. data/lib/dhc/formats/plain.rb +42 -0
  33. data/lib/dhc/interceptor.rb +36 -0
  34. data/lib/dhc/interceptors.rb +26 -0
  35. data/lib/dhc/interceptors/auth.rb +94 -0
  36. data/lib/dhc/interceptors/caching.rb +148 -0
  37. data/lib/dhc/interceptors/default_timeout.rb +16 -0
  38. data/lib/dhc/interceptors/logging.rb +37 -0
  39. data/lib/dhc/interceptors/monitoring.rb +92 -0
  40. data/lib/dhc/interceptors/prometheus.rb +51 -0
  41. data/lib/dhc/interceptors/retry.rb +41 -0
  42. data/lib/dhc/interceptors/rollbar.rb +36 -0
  43. data/lib/dhc/interceptors/throttle.rb +86 -0
  44. data/lib/dhc/interceptors/zipkin.rb +110 -0
  45. data/lib/dhc/railtie.rb +9 -0
  46. data/lib/dhc/request.rb +161 -0
  47. data/lib/dhc/response.rb +60 -0
  48. data/lib/dhc/response/data.rb +28 -0
  49. data/lib/dhc/response/data/base.rb +18 -0
  50. data/lib/dhc/response/data/collection.rb +16 -0
  51. data/lib/dhc/response/data/item.rb +29 -0
  52. data/lib/dhc/rspec.rb +11 -0
  53. data/lib/dhc/test/cache_helper.rb +3 -0
  54. data/lib/dhc/version.rb +5 -0
  55. data/script/ci/build.sh +19 -0
  56. data/spec/basic_methods/delete_spec.rb +34 -0
  57. data/spec/basic_methods/get_spec.rb +49 -0
  58. data/spec/basic_methods/post_spec.rb +42 -0
  59. data/spec/basic_methods/put_spec.rb +48 -0
  60. data/spec/basic_methods/request_spec.rb +19 -0
  61. data/spec/basic_methods/request_without_rails_spec.rb +29 -0
  62. data/spec/config/endpoints_spec.rb +63 -0
  63. data/spec/config/placeholders_spec.rb +32 -0
  64. data/spec/core_ext/hash/deep_transform_values_spec.rb +24 -0
  65. data/spec/dummy/README.rdoc +28 -0
  66. data/spec/dummy/Rakefile +8 -0
  67. data/spec/dummy/app/assets/config/manifest.js +3 -0
  68. data/spec/dummy/app/assets/images/.keep +0 -0
  69. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  70. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  71. data/spec/dummy/app/controllers/application_controller.rb +7 -0
  72. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  73. data/spec/dummy/app/helpers/application_helper.rb +4 -0
  74. data/spec/dummy/app/mailers/.keep +0 -0
  75. data/spec/dummy/app/models/.keep +0 -0
  76. data/spec/dummy/app/models/concerns/.keep +0 -0
  77. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  78. data/spec/dummy/bin/bundle +5 -0
  79. data/spec/dummy/bin/rails +6 -0
  80. data/spec/dummy/bin/rake +6 -0
  81. data/spec/dummy/config.ru +6 -0
  82. data/spec/dummy/config/application.rb +16 -0
  83. data/spec/dummy/config/boot.rb +7 -0
  84. data/spec/dummy/config/environment.rb +7 -0
  85. data/spec/dummy/config/environments/development.rb +36 -0
  86. data/spec/dummy/config/environments/production.rb +77 -0
  87. data/spec/dummy/config/environments/test.rb +41 -0
  88. data/spec/dummy/config/initializers/assets.rb +10 -0
  89. data/spec/dummy/config/initializers/backtrace_silencers.rb +9 -0
  90. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  91. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  92. data/spec/dummy/config/initializers/inflections.rb +18 -0
  93. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  94. data/spec/dummy/config/initializers/session_store.rb +5 -0
  95. data/spec/dummy/config/initializers/wrap_parameters.rb +11 -0
  96. data/spec/dummy/config/locales/en.yml +23 -0
  97. data/spec/dummy/config/routes.rb +58 -0
  98. data/spec/dummy/config/secrets.yml +22 -0
  99. data/spec/dummy/lib/assets/.keep +0 -0
  100. data/spec/dummy/log/.keep +0 -0
  101. data/spec/dummy/public/404.html +67 -0
  102. data/spec/dummy/public/422.html +67 -0
  103. data/spec/dummy/public/500.html +66 -0
  104. data/spec/dummy/public/favicon.ico +0 -0
  105. data/spec/endpoint/compile_spec.rb +35 -0
  106. data/spec/endpoint/match_spec.rb +41 -0
  107. data/spec/endpoint/placeholders_spec.rb +30 -0
  108. data/spec/endpoint/remove_interpolated_params_spec.rb +17 -0
  109. data/spec/endpoint/values_as_params_spec.rb +31 -0
  110. data/spec/error/dup_spec.rb +12 -0
  111. data/spec/error/find_spec.rb +57 -0
  112. data/spec/error/response_spec.rb +17 -0
  113. data/spec/error/timeout_spec.rb +14 -0
  114. data/spec/error/to_s_spec.rb +85 -0
  115. data/spec/formats/form_spec.rb +27 -0
  116. data/spec/formats/json_spec.rb +66 -0
  117. data/spec/formats/multipart_spec.rb +26 -0
  118. data/spec/formats/plain_spec.rb +29 -0
  119. data/spec/interceptors/after_request_spec.rb +20 -0
  120. data/spec/interceptors/after_response_spec.rb +39 -0
  121. data/spec/interceptors/auth/basic_auth_spec.rb +17 -0
  122. data/spec/interceptors/auth/bearer_spec.rb +19 -0
  123. data/spec/interceptors/auth/body_spec.rb +36 -0
  124. data/spec/interceptors/auth/long_basic_auth_credentials_spec.rb +17 -0
  125. data/spec/interceptors/auth/no_instance_var_for_options_spec.rb +27 -0
  126. data/spec/interceptors/auth/reauthentication_configuration_spec.rb +61 -0
  127. data/spec/interceptors/auth/reauthentication_spec.rb +44 -0
  128. data/spec/interceptors/before_request_spec.rb +21 -0
  129. data/spec/interceptors/before_response_spec.rb +20 -0
  130. data/spec/interceptors/caching/hydra_spec.rb +26 -0
  131. data/spec/interceptors/caching/main_spec.rb +73 -0
  132. data/spec/interceptors/caching/methods_spec.rb +42 -0
  133. data/spec/interceptors/caching/multilevel_cache_spec.rb +139 -0
  134. data/spec/interceptors/caching/options_spec.rb +78 -0
  135. data/spec/interceptors/caching/parameters_spec.rb +24 -0
  136. data/spec/interceptors/caching/response_status_spec.rb +29 -0
  137. data/spec/interceptors/caching/to_cache_spec.rb +16 -0
  138. data/spec/interceptors/default_interceptors_spec.rb +15 -0
  139. data/spec/interceptors/default_timeout/main_spec.rb +34 -0
  140. data/spec/interceptors/define_spec.rb +30 -0
  141. data/spec/interceptors/dup_spec.rb +19 -0
  142. data/spec/interceptors/logging/main_spec.rb +37 -0
  143. data/spec/interceptors/monitoring/caching_spec.rb +66 -0
  144. data/spec/interceptors/monitoring/main_spec.rb +97 -0
  145. data/spec/interceptors/prometheus_spec.rb +54 -0
  146. data/spec/interceptors/response_competition_spec.rb +39 -0
  147. data/spec/interceptors/retry/main_spec.rb +73 -0
  148. data/spec/interceptors/return_response_spec.rb +38 -0
  149. data/spec/interceptors/rollbar/invalid_encoding_spec.rb +43 -0
  150. data/spec/interceptors/rollbar/main_spec.rb +57 -0
  151. data/spec/interceptors/throttle/main_spec.rb +236 -0
  152. data/spec/interceptors/throttle/reset_track_spec.rb +53 -0
  153. data/spec/interceptors/zipkin/distributed_tracing_spec.rb +135 -0
  154. data/spec/rails_helper.rb +6 -0
  155. data/spec/request/body_spec.rb +39 -0
  156. data/spec/request/encoding_spec.rb +38 -0
  157. data/spec/request/error_handling_spec.rb +88 -0
  158. data/spec/request/headers_spec.rb +12 -0
  159. data/spec/request/ignore_errors_spec.rb +73 -0
  160. data/spec/request/option_dup_spec.rb +13 -0
  161. data/spec/request/parallel_requests_spec.rb +59 -0
  162. data/spec/request/params_encoding_spec.rb +26 -0
  163. data/spec/request/request_without_rails_spec.rb +15 -0
  164. data/spec/request/url_patterns_spec.rb +54 -0
  165. data/spec/request/user_agent_spec.rb +26 -0
  166. data/spec/request/user_agent_without_rails_spec.rb +27 -0
  167. data/spec/response/body_spec.rb +16 -0
  168. data/spec/response/code_spec.rb +16 -0
  169. data/spec/response/data_accessor_spec.rb +29 -0
  170. data/spec/response/data_spec.rb +85 -0
  171. data/spec/response/effective_url_spec.rb +16 -0
  172. data/spec/response/headers_spec.rb +18 -0
  173. data/spec/response/options_spec.rb +18 -0
  174. data/spec/response/success_spec.rb +13 -0
  175. data/spec/response/time_spec.rb +21 -0
  176. data/spec/spec_helper.rb +9 -0
  177. data/spec/support/fixtures/json/feedback.json +11 -0
  178. data/spec/support/fixtures/json/feedbacks.json +164 -0
  179. data/spec/support/fixtures/json/localina_content_ad.json +23 -0
  180. data/spec/support/load_json.rb +5 -0
  181. data/spec/support/reset_config.rb +8 -0
  182. data/spec/support/zipkin_mock.rb +114 -0
  183. data/spec/timeouts/no_signal_spec.rb +13 -0
  184. data/spec/timeouts/timings_spec.rb +55 -0
  185. 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,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DHC::ParserError < DHC::Error
4
+ 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
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DHC::Timeout < DHC::Error
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DHC::UnknownError < DHC::Error
4
+ 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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DHC::Formats
4
+ autoload :Form, 'dhc/formats/form'
5
+ autoload :JSON, 'dhc/formats/json'
6
+ autoload :Multipart, 'dhc/formats/multipart'
7
+ autoload :Plain, 'dhc/formats/plain'
8
+ end
@@ -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