apimatic_core 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98a7a24dd99dffe816667bdbd683775d7b4961a2159cdcca5f6d01202aaad8cb
4
- data.tar.gz: e869b19703d585e264d2786da045a2689f14cd5a905b1124bbd4f37df097ec63
3
+ metadata.gz: d6999e5f75a815faf7120e5f551b3ea2661e6d146a84e087426f64b27863d2fc
4
+ data.tar.gz: f9c63258f67b4798393569aa35ca04c54bd70b0109f32d2f3bd756b6aed7838d
5
5
  SHA512:
6
- metadata.gz: e49802888b0b9e38e94f8e287ba5b4fdfd049145643ec2f39076f5b2d4a5d8ebb6d54599aa89f016597ca9ad2f7d6d4f2a60f4a10654d654ee0a7429a809866f
7
- data.tar.gz: 95cff96de07545fe02287eff869b34b43e424ca094ccde6ecf9ef892c0f0b019c1b5b9fd9959962ceaef10a9b541329288a3db881421b35d6f8057c6d4a383dc
6
+ metadata.gz: c86684bed17cbe67d0750a78bda0bc03b2385414a8ebba30088fa7990d45ae2471426cb8c0457ead6d3d1dbcbb5a11003e435fc2105917e234b6e13cd2a292b2
7
+ data.tar.gz: 5c539fe7981f7aa5196ad81e9f0e76ffaa3d3729d536f824ab3b5c2170e5cce61300f3f6018db93785121487b18db580d0eed60c67443ed4c2b72c8445a89899
data/README.md CHANGED
@@ -72,7 +72,12 @@ gem 'apimatic_core'
72
72
  ## Logger
73
73
  | Name | Description |
74
74
  |-------------------------------------------------------------------|--------------------------------------------|
75
- | [`EndpointLogger`](lib/apimatic-core/logger/endpoint_logger.rb) | A class to provide logging for an API call |
75
+ | [`SdkLogger`](lib/apimatic-core/logger/sdk_logger.rb) | A class responsible for logging request and response of an api call|
76
+ | [`NilSdkLogger`](lib/apimatic-core/logger/nil_sdk_logger.rb) | A class responsible for no logging|
77
+ | [`ConsoleLogger`](lib/apimatic-core/logger/default_logger.rb) | Represents default implementation of logger interface|
78
+ | [`ApiLoggingConfiguration`](lib/apimatic-core/logger/api_logging_configuration.rb) | Represents logging configuration|
79
+ | [`ApiRequestLoggingConfiguration`](lib/apimatic-core/logger/api_logging_configuration.rb) | Represents request logging configuration.|
80
+ | [`ApiResponseLoggingConfiguration`](lib/apimatic-core/logger/api_logging_configuration.rb) | Represents response logging configuration.|
76
81
 
77
82
  ## Types
78
83
  | Name | Description |
@@ -4,19 +4,17 @@ module CoreLibrary
4
4
  # Creates a new builder instance of the API call with pre-configured global and logging configurations.
5
5
  # @return [ApiCall] The instance of ApiCall object.
6
6
  def new_builder
7
- ApiCall.new(@global_configuration, logger: @endpoint_logger.logger)
7
+ ApiCall.new(@global_configuration)
8
8
  end
9
9
 
10
10
  # Initializes a new instance of ApiCall.
11
11
  # @param [GlobalConfiguration] global_configuration An instance of GlobalConfiguration.
12
- # @param logger An optional logger to log execution of program.
13
- def initialize(global_configuration, logger: nil)
12
+ def initialize(global_configuration)
14
13
  @global_configuration = global_configuration
15
14
  @request_builder = RequestBuilder.new
16
15
  @response_handler = ResponseHandler.new
17
- @endpoint_logger = EndpointLogger.new(logger)
18
- @endpoint_name_for_logging = nil
19
16
  @endpoint_context = {}
17
+ initialize_api_logger(@global_configuration.client_configuration.logging_configuration)
20
18
  end
21
19
 
22
20
  # The setter for the request builder to be used for building the request of an API call.
@@ -35,14 +33,6 @@ module CoreLibrary
35
33
  self
36
34
  end
37
35
 
38
- # The setter for the name of the endpoint controller method to used while logging an endpoint call.
39
- # @param [String] endpoint_name_for_logging The name of the endpoint controller method to used while logging.
40
- # @return [ApiCall] An updated instance of ApiCall.
41
- def endpoint_name_for_logging(endpoint_name_for_logging)
42
- @endpoint_name_for_logging = endpoint_name_for_logging
43
- self
44
- end
45
-
46
36
  # The setter for the context for an endpoint call.
47
37
  # @param [String] context_key The name of the endpoint context.
48
38
  # @param [Object] context_value The value of the endpoint context.
@@ -61,45 +51,45 @@ module CoreLibrary
61
51
  raise ArgumentError, 'An HTTP client instance is required to execute an Api call.'
62
52
  end
63
53
 
64
- _http_request = @request_builder.endpoint_logger(@endpoint_logger)
65
- .endpoint_name_for_logging(@endpoint_name_for_logging)
66
- .global_configuration(@global_configuration)
54
+ _http_request = @request_builder.global_configuration(@global_configuration)
67
55
  .build(@endpoint_context)
68
- @endpoint_logger.debug("Raw request for #{@endpoint_name_for_logging} is: #{_http_request.inspect}")
56
+ @logger.log_request(_http_request)
69
57
 
70
58
  _http_callback = _client_configuration.http_callback
71
59
  unless _http_callback.nil?
72
60
  update_http_callback(proc do
73
61
  _http_callback&.on_before_request(_http_request)
74
- end, "Calling the on_before_request method of http_call_back for #{@endpoint_name_for_logging}.")
62
+ end)
75
63
  end
76
-
77
64
  _http_response = _client_configuration.http_client.execute(_http_request)
78
- @endpoint_logger.debug("Raw response for #{@endpoint_name_for_logging} is: #{_http_response.inspect}")
65
+ @logger.log_response(_http_response)
79
66
 
80
67
  unless _http_callback.nil?
81
68
  update_http_callback(proc do
82
69
  _http_callback&.on_after_response(_http_response)
83
- end, "Calling the on_after_response method of http_call_back for #{@endpoint_name_for_logging}.")
70
+ end)
84
71
  end
85
72
 
86
- _deserialized_response = @response_handler.endpoint_logger(@endpoint_logger)
87
- .endpoint_name_for_logging(@endpoint_name_for_logging)
88
- .handle(_http_response, @global_configuration.get_global_errors,
73
+ _deserialized_response = @response_handler.handle(_http_response, @global_configuration.get_global_errors,
89
74
  @global_configuration.should_symbolize_hash)
90
75
  _deserialized_response
91
76
  rescue StandardError => e
92
- @endpoint_logger.error(e)
93
77
  raise e
94
78
  end
95
79
  end
96
80
 
97
81
  # Registers request and response with the provided http_callback
98
82
  # @param [Callable] callable The callable to be called for registering into the HttpCallback instance.
99
- # @param [String] log_message The message to be logged if HttpCallback is set.
100
- def update_http_callback(callable, log_message)
101
- @endpoint_logger.info(log_message)
83
+ def update_http_callback(callable)
102
84
  callable.call
103
85
  end
86
+
87
+ def initialize_api_logger(logging_config)
88
+ @logger = if logging_config.nil?
89
+ NilSdkLogger.new
90
+ else
91
+ SdkLogger.new(logging_config)
92
+ end
93
+ end
104
94
  end
105
95
  end
@@ -1,7 +1,7 @@
1
1
  module CoreLibrary
2
2
  # Configuration for an HttpClient.
3
3
  class HttpClientConfiguration < ClientConfiguration
4
- attr_reader :http_client, :http_callback
4
+ attr_reader :http_client, :http_callback, :logging_configuration
5
5
 
6
6
  # Initializes a new instance of HttpClientConfiguration.
7
7
  # @param connection Connection information
@@ -20,7 +20,8 @@ module CoreLibrary
20
20
  connection: nil, adapter: :net_http_persistent, timeout: 60,
21
21
  max_retries: 0, retry_interval: 1, backoff_factor: 2,
22
22
  retry_statuses: [408, 413, 429, 500, 502, 503, 504, 521, 522, 524],
23
- retry_methods: %i[get put], cache: false, verify: true, http_callback: nil, http_client: nil
23
+ retry_methods: %i[get put], cache: false, verify: true, http_callback: nil, http_client: nil,
24
+ logging_configuration: nil
24
25
  )
25
26
  @response_factory = HttpResponseFactory.new
26
27
  @connection = connection
@@ -35,6 +36,7 @@ module CoreLibrary
35
36
  @verify = verify
36
37
  @cache = cache
37
38
  @http_client = http_client
39
+ @logging_configuration = logging_configuration
38
40
  end
39
41
 
40
42
  # Setter for http_client.
@@ -0,0 +1,97 @@
1
+ module CoreLibrary
2
+ # Represents options for configuring logging behavior.
3
+ class ApiLoggingConfiguration
4
+ attr_reader :logger, :log_level, :request_logging_config, :response_logging_config, :mask_sensitive_headers
5
+
6
+ # Initializes a new instance of ApiLoggingConfiguration.
7
+ #
8
+ # @param logger [LoggerInterface] The logger to use for logging messages.
9
+ # @param log_level [LogLevel] The log level to determine which messages should be logged.
10
+ # @param request_logging_config [ApiRequestLoggingConfiguration] Options for logging HTTP requests.
11
+ # @param response_logging_config [ApiResponseLoggingConfiguration] Options for logging HTTP responses.
12
+ # @param mask_sensitive_headers [Boolean] Indicates whether sensitive headers should be masked in logged messages.
13
+ def initialize(
14
+ logger,
15
+ log_level,
16
+ request_logging_config,
17
+ response_logging_config,
18
+ mask_sensitive_headers
19
+ )
20
+ @logger = logger || ConsoleLogger.new
21
+ @log_level = log_level || ::Logger::INFO
22
+ @request_logging_config = request_logging_config
23
+ @response_logging_config = response_logging_config
24
+ @mask_sensitive_headers = mask_sensitive_headers
25
+ end
26
+ end
27
+
28
+ # Represents configuration for logging HTTP messages.
29
+ class BaseHttpLoggingConfiguration
30
+ attr_reader :log_body, :log_headers, :headers_to_exclude, :headers_to_include, :headers_to_unmask
31
+
32
+ # Initializes a new instance of BaseHttpLoggingConfiguration.
33
+ #
34
+ # @param log_body [Boolean] Indicates whether the message body should be logged. Default is false.
35
+ # @param log_headers [Boolean] Indicates whether the message headers should be logged. Default is false.
36
+ # @param headers_to_exclude [Array<String>] Array of headers not displayed in logging. Default is an empty array.
37
+ # @param headers_to_include [Array<String>] Array of headers to be displayed in logging. Default is an empty array.
38
+ # @param headers_to_unmask [Array<String>] Array of headers which values are non-sensitive to display in logging.
39
+ # Default is an empty array.
40
+ def initialize(
41
+ log_body,
42
+ log_headers,
43
+ headers_to_exclude,
44
+ headers_to_include,
45
+ headers_to_unmask
46
+ )
47
+ @log_body = log_body
48
+ @log_headers = log_headers
49
+ @headers_to_exclude = headers_to_exclude || []
50
+ @headers_to_include = headers_to_include || []
51
+ @headers_to_unmask = headers_to_unmask || []
52
+ end
53
+ end
54
+
55
+ # Represents request logging configuration.
56
+ class ApiRequestLoggingConfiguration < BaseHttpLoggingConfiguration
57
+ attr_reader :include_query_in_path
58
+
59
+ # Initializes a new instance of ApiRequestLoggingConfiguration.
60
+ #
61
+ # @param log_body [Boolean] Indicates whether the message body should be logged. Default is false.
62
+ # @param log_headers [Boolean] Indicates whether the message headers should be logged. Default is false.
63
+ # @param headers_to_exclude [Array<String>] Array of headers not displayed in logging. Default is an empty array.
64
+ # @param headers_to_include [Array<String>] Array of headers to be displayed in logging. Default is an empty array.
65
+ # @param headers_to_unmask [Array<String>] Array of headers which values are non-sensitive to display in logging.
66
+ # Default is an empty array.
67
+ def initialize(
68
+ log_body,
69
+ log_headers,
70
+ headers_to_exclude,
71
+ headers_to_include,
72
+ headers_to_unmask,
73
+ include_query_in_path
74
+ )
75
+ super(
76
+ log_body,
77
+ log_headers,
78
+ headers_to_exclude,
79
+ headers_to_include,
80
+ headers_to_unmask
81
+ )
82
+ @include_query_in_path = include_query_in_path
83
+ end
84
+ end
85
+
86
+ # Represents response logging configuration.
87
+ class ApiResponseLoggingConfiguration < BaseHttpLoggingConfiguration
88
+ # Initializes a new instance of ApiResponseLoggingConfiguration.
89
+ #
90
+ # @param log_body [Boolean] Indicates whether the message body should be logged. Default is false.
91
+ # @param log_headers [Boolean] Indicates whether the message headers should be logged. Default is false.
92
+ # @param headers_to_exclude [Array<String>] Array of headers not displayed in logging. Default is an empty array.
93
+ # @param headers_to_include [Array<String>] Array of headers to be displayed in logging. Default is an empty array.
94
+ # @param headers_to_unmask [Array<String>] Array of headers which values are non-sensitive to display in logging.
95
+ # Default is an empty array.
96
+ end
97
+ end
@@ -0,0 +1,44 @@
1
+ # Represents a logger implementation that logs messages to the console.
2
+ class ConsoleLogger < Logger
3
+ # Initializes a new instance of DefaultLogger.
4
+ def initialize
5
+ @logger = ::Logger.new($stdout)
6
+ @logger.formatter = method(:format_log_message)
7
+ end
8
+
9
+ # Logs a message to the console with the specified log level.
10
+ # @param level [Symbol] The log level of the message.
11
+ # @param message [String] The message to log.
12
+ # @param params [Hash] Additional parameters to include in the log message.
13
+ def log(level, message, params = {})
14
+ formatted_message = message_with_params(message, params)
15
+ case level
16
+ when Logger::DEBUG
17
+ @logger.debug(formatted_message)
18
+ when Logger::INFO
19
+ @logger.info(formatted_message)
20
+ when Logger::WARN
21
+ @logger.warn(formatted_message)
22
+ when Logger::ERROR
23
+ @logger.error(formatted_message)
24
+ when Logger::FATAL
25
+ @logger.fatal(formatted_message)
26
+ else
27
+ @logger.unknown(formatted_message)
28
+ end
29
+ end
30
+
31
+ def format_log_message(severity, _datetime, _progname, msg)
32
+ "#{
33
+ severity.ljust(5) +
34
+ msg
35
+ }\n"
36
+ end
37
+
38
+ def message_with_params(message, params)
39
+ message.gsub(/\{([\w-]+)\}/) do |match|
40
+ key = match[1..-2]
41
+ params[key.to_sym] || params[key.to_s]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,16 @@
1
+ module CoreLibrary
2
+ # This class is nil implementation of ApiLogger.
3
+ class NilSdkLogger < ApiLogger
4
+ # Logs the details of an HTTP request.
5
+ # @param request [HttpRequest] The HTTP request to log.
6
+ def log_request(request)
7
+ # This function is intentionally left empty because this logger does not perform any logging.
8
+ end
9
+
10
+ # Logs the details of an HTTP response.
11
+ # @param response [HttpResponse] The HTTP response to log.
12
+ def log_response(response)
13
+ # This function is intentionally left empty because this logger does not perform any logging.
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,78 @@
1
+ module CoreLibrary
2
+ # This class is responsible for logging request and response info.
3
+ class SdkLogger < ApiLogger
4
+ def initialize(logging_config)
5
+ @log_level = logging_config.log_level
6
+ @logger = logging_config.logger
7
+ @request_logging_config = logging_config.request_logging_config
8
+ @response_logging_config = logging_config.response_logging_config
9
+ @mask_sensitive_headers = logging_config.mask_sensitive_headers
10
+ end
11
+
12
+ def log_request(request)
13
+ content_type_header = LoggerHelper.get_content_type(request.headers)
14
+ url = @request_logging_config.include_query_in_path ? request.query_url : request.query_url.split('?').first
15
+
16
+ @logger.log(@log_level, "Request {#{METHOD}} {#{URL}} {#{CONTENT_TYPE_HEADER}}", {
17
+ METHOD => request.http_method,
18
+ URL => url,
19
+ CONTENT_TYPE_HEADER => content_type_header
20
+ })
21
+
22
+ apply_log_request_options(request)
23
+ end
24
+
25
+ def log_response(response)
26
+ content_type_header = LoggerHelper.get_content_type(response.headers)
27
+ content_length_header = LoggerHelper.get_content_length(response.headers)
28
+
29
+ @logger.log(@log_level, "Response {#{STATUS_CODE}} {#{CONTENT_LENGTH_HEADER}} {#{CONTENT_TYPE_HEADER}}", {
30
+ STATUS_CODE => response.status_code,
31
+ CONTENT_LENGTH_HEADER => content_length_header,
32
+ CONTENT_TYPE_HEADER => content_type_header
33
+ })
34
+
35
+ apply_log_response_options(response)
36
+ end
37
+
38
+ private
39
+
40
+ def apply_log_request_options(request)
41
+ headers_to_log = LoggerHelper.extract_headers_to_log(
42
+ @request_logging_config,
43
+ request.headers
44
+ )
45
+
46
+ if @request_logging_config.log_headers
47
+ @logger.log(@log_level, 'Request headers {headers}', {
48
+ headers: headers_to_log
49
+ })
50
+ end
51
+
52
+ return unless @request_logging_config.log_body
53
+
54
+ @logger.log(@log_level, 'Request body {body}', {
55
+ body: request.parameters
56
+ })
57
+ end
58
+
59
+ def apply_log_response_options(response)
60
+ headers_to_log = LoggerHelper.extract_headers_to_log(
61
+ @response_logging_config,
62
+ response.headers
63
+ )
64
+
65
+ if @response_logging_config.log_headers
66
+ @logger.log(@log_level, 'Response headers {headers}', {
67
+ headers: headers_to_log
68
+ })
69
+ end
70
+
71
+ return unless @response_logging_config.log_body
72
+
73
+ @logger.log(@log_level, 'Response body {body}', {
74
+ body: response.raw_body
75
+ })
76
+ end
77
+ end
78
+ end
@@ -18,8 +18,6 @@ module CoreLibrary
18
18
  @auth = nil
19
19
  @array_serialization_format = ArraySerializationFormat::INDEXED
20
20
  @xml_attributes = nil
21
- @endpoint_name_for_logging = nil
22
- @endpoint_logger = nil
23
21
  end
24
22
 
25
23
  # The setter for the server.
@@ -154,22 +152,6 @@ module CoreLibrary
154
152
  self
155
153
  end
156
154
 
157
- # The setter for the name of the endpoint controller method to used while logging an endpoint call.
158
- # @param [String] endpoint_name_for_logging The name of the endpoint controller method to used while logging.
159
- # @return [RequestBuilder] An updated instance of RequestBuilder.
160
- def endpoint_name_for_logging(endpoint_name_for_logging)
161
- @endpoint_name_for_logging = endpoint_name_for_logging
162
- self
163
- end
164
-
165
- # The setter for the name of the endpoint controller method to used while logging an endpoint call.
166
- # @param [EndpointLogger] endpoint_logger The name of the endpoint controller method to used while logging.
167
- # @return [RequestBuilder] An updated instance of RequestBuilder.
168
- def endpoint_logger(endpoint_logger)
169
- @endpoint_logger = endpoint_logger
170
- self
171
- end
172
-
173
155
  # Sets global configuration object for the request builder.
174
156
  def global_configuration(global_configuration)
175
157
  @global_configuration = global_configuration
@@ -195,7 +177,6 @@ module CoreLibrary
195
177
  # Processes and resolves the endpoint URL.
196
178
  # @return [String] The processed URL.
197
179
  def process_url
198
- @endpoint_logger.info("Preparing query URL for #{@endpoint_name_for_logging}.")
199
180
  _base_url = @global_configuration.get_base_uri_executor.call(@server)
200
181
  _updated_url_with_template_params = ApiHelper.append_url_with_template_parameters(@path, @template_params)
201
182
  _url = _base_url + _updated_url_with_template_params
@@ -233,10 +214,6 @@ module CoreLibrary
233
214
  _has_additional_headers = !_additional_headers.nil? && _additional_headers.any?
234
215
  _has_local_headers = !@header_params.nil? and @header_params.any?
235
216
 
236
- if _has_global_headers || _has_additional_headers || _has_local_headers
237
- @endpoint_logger.info("Preparing headers for #{@endpoint_name_for_logging}.")
238
- end
239
-
240
217
  _request_headers.merge!(_global_headers) if _has_global_headers
241
218
  _request_headers.merge!(_additional_headers) if _has_additional_headers
242
219
 
@@ -258,12 +235,6 @@ module CoreLibrary
258
235
  _has_body_serializer = !@body_serializer.nil?
259
236
  _has_xml_attributes = !@xml_attributes.nil?
260
237
 
261
- if _has_form_params || _has_additional_form_params
262
- @endpoint_logger.info("Preparing form parameters for #{@endpoint_name_for_logging}.")
263
- elsif _has_body_param
264
- @endpoint_logger.info("Preparing body parameters for #{@endpoint_name_for_logging}.")
265
- end
266
-
267
238
  if _has_xml_attributes
268
239
  return process_xml_parameters
269
240
  elsif _has_form_params || _has_additional_form_params || _has_multipart_param
@@ -12,8 +12,6 @@ module CoreLibrary
12
12
  @datetime_format = nil
13
13
  @is_xml_response = false
14
14
  @xml_attribute = nil
15
- @endpoint_name_for_logging = nil
16
- @endpoint_logger = nil
17
15
  @is_primitive_response = false
18
16
  @is_date_response = false
19
17
  @is_response_array = false
@@ -84,22 +82,6 @@ module CoreLibrary
84
82
  self
85
83
  end
86
84
 
87
- # Sets the endpoint_name_for_logging property.
88
- # @param [String] endpoint_name_for_logging The endpoint method name to be used while logging.
89
- # @return [ResponseHandler] An updated instance of ResponseHandler.
90
- def endpoint_name_for_logging(endpoint_name_for_logging)
91
- @endpoint_name_for_logging = endpoint_name_for_logging
92
- self
93
- end
94
-
95
- # Sets endpoint logger to be used.
96
- # @param [EndpointLogger] endpoint_logger The logger to be used for logging API call steps.
97
- # @return [ResponseHandler] An updated instance of ResponseHandler.
98
- def endpoint_logger(endpoint_logger)
99
- @endpoint_logger = endpoint_logger
100
- self
101
- end
102
-
103
85
  # Sets the is_primitive_response property.
104
86
  # @param [Boolean] is_primitive_response Flag if the response is of primitive type.
105
87
  # @return [ResponseHandler] An updated instance of ResponseHandler.
@@ -164,13 +146,8 @@ module CoreLibrary
164
146
  # @param [Boolean] should_symbolize_hash Flag to symbolize the hash during response deserialization.
165
147
  # @return [Object] The deserialized response of the API Call.
166
148
  def handle(response, global_errors, should_symbolize_hash = false)
167
- @endpoint_logger.info("Validating response for #{@endpoint_name_for_logging}.")
168
-
169
149
  # checking Nullify 404
170
- if response.status_code == 404 && @is_nullify404
171
- @endpoint_logger.info("Status code 404 received for #{@endpoint_name_for_logging}. Returning None.")
172
- return nil
173
- end
150
+ return nil if response.status_code == 404 && @is_nullify404
174
151
 
175
152
  # validating response if configured
176
153
  validate(response, global_errors)
@@ -0,0 +1,7 @@
1
+ module CoreLibrary
2
+ CONTENT_TYPE_HEADER = 'content-type'.freeze
3
+ CONTENT_LENGTH_HEADER = 'content-length'.freeze
4
+ METHOD = 'method'.freeze
5
+ URL = 'url'.freeze
6
+ STATUS_CODE = 'status_code'.freeze
7
+ end
@@ -0,0 +1,82 @@
1
+ module CoreLibrary
2
+ # logger helper methods.
3
+ class LoggerHelper
4
+ NON_SENSITIVE_HEADERS = %w[
5
+ accept accept-charset accept-encoding accept-language access-control-allow-origin
6
+ cache-control connection content-encoding content-language content-length
7
+ content-location content-md5 content-range content-type date etag expect
8
+ expires from host if-match if-modified-since if-none-match if-range
9
+ if-unmodified-since keep-alive last-modified location max-forwards pragma
10
+ range referer retry-after server trailer transfer-encoding upgrade user-agent
11
+ vary via warning x-forwarded-for x-requested-with x-powered-by
12
+ ].map(&:downcase).freeze
13
+
14
+ def self.get_content_type(headers)
15
+ return '' if headers.nil?
16
+
17
+ headers.find { |key, _| key.downcase == CONTENT_TYPE_HEADER }&.last || ''
18
+ end
19
+
20
+ def self.get_content_length(headers)
21
+ return '' if headers.nil?
22
+
23
+ headers.find { |key, _| key.downcase == CONTENT_LENGTH_HEADER }&.last || ''
24
+ end
25
+
26
+ def self.extract_headers_to_log(http_logging_config, headers)
27
+ return headers if headers.nil?
28
+
29
+ filtered_headers = if http_logging_config.headers_to_include.any?
30
+ include_headers(headers, http_logging_config.headers_to_include)
31
+ elsif http_logging_config.headers_to_exclude.any?
32
+ exclude_headers(headers, http_logging_config.headers_to_exclude)
33
+ else
34
+ headers
35
+ end
36
+
37
+ mask_sensitive_headers(filtered_headers, http_logging_config.headers_to_unmask)
38
+ end
39
+
40
+ def self.include_headers(headers, headers_to_include)
41
+ included_headers = {}
42
+
43
+ headers_to_include.each do |name|
44
+ key = headers.keys.find { |header_key| header_key.downcase == name.downcase }
45
+ included_headers[key] = headers[key] if headers[key]
46
+ end
47
+
48
+ included_headers
49
+ end
50
+
51
+ def self.exclude_headers(headers, headers_to_exclude)
52
+ excluded_headers = {}
53
+
54
+ headers.each do |key, val|
55
+ excluded_headers[key] = val unless headers_to_exclude.any? do |excluded_name|
56
+ excluded_name.downcase == key.downcase
57
+ end
58
+ end
59
+
60
+ excluded_headers
61
+ end
62
+
63
+ def self.mask_sensitive_headers(headers, headers_to_unmask)
64
+ return headers unless @mask_sensitive_headers || !headers.nil?
65
+
66
+ headers.each do |key, val|
67
+ headers[key] = mask_if_sensitive_header(key, val, headers_to_unmask)
68
+ end
69
+
70
+ headers
71
+ end
72
+
73
+ def self.mask_if_sensitive_header(name, value, headers_to_unmask)
74
+ headers_to_unmask ||= []
75
+ headers_to_unmask = headers_to_unmask.map(&:downcase)
76
+ name_downcase = name.downcase
77
+
78
+ NON_SENSITIVE_HEADERS.include?(name_downcase) || headers_to_unmask.include?(name_downcase) ?
79
+ value : '**Redacted**'
80
+ end
81
+ end
82
+ end
data/lib/apimatic_core.rb CHANGED
@@ -3,6 +3,7 @@ require 'json'
3
3
  require 'certifi'
4
4
  require 'apimatic_core_interfaces'
5
5
  require 'cgi'
6
+ require 'logger'
6
7
 
7
8
  require_relative 'apimatic-core/request_builder'
8
9
  require_relative 'apimatic-core/response_handler'
@@ -16,7 +17,10 @@ require_relative 'apimatic-core/exceptions/auth_validation_exception'
16
17
  require_relative 'apimatic-core/exceptions/any_of_validation_exception'
17
18
  require_relative 'apimatic-core/exceptions/one_of_validation_exception'
18
19
 
19
- require_relative 'apimatic-core/logger/endpoint_logger'
20
+ require_relative 'apimatic-core/logger/default_logger'
21
+ require_relative 'apimatic-core/logger/nil_sdk_logger'
22
+ require_relative 'apimatic-core/logger/sdk_logger'
23
+ require_relative 'apimatic-core/logger/configurations/api_logging_configuration'
20
24
 
21
25
  require_relative 'apimatic-core/http/configurations/http_client_configuration'
22
26
  require_relative 'apimatic-core/http/request/http_request'
@@ -44,6 +48,8 @@ require_relative 'apimatic-core/utilities/xml_helper'
44
48
  require_relative 'apimatic-core/utilities/auth_helper'
45
49
  require_relative 'apimatic-core/utilities/union_type_helper'
46
50
  require_relative 'apimatic-core/utilities/json_pointer_helper'
51
+ require_relative 'apimatic-core/utilities/logger_helper'
52
+ require_relative 'apimatic-core/utilities/constants'
47
53
 
48
54
  require_relative 'apimatic-core/authentication/header_auth'
49
55
  require_relative 'apimatic-core/authentication/query_auth'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apimatic_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - APIMatic Ltd.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-22 00:00:00.000000000 Z
11
+ date: 2024-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: apimatic_core_interfaces
@@ -173,7 +173,10 @@ files:
173
173
  - lib/apimatic-core/http/request/http_request.rb
174
174
  - lib/apimatic-core/http/response/api_response.rb
175
175
  - lib/apimatic-core/http/response/http_response.rb
176
- - lib/apimatic-core/logger/endpoint_logger.rb
176
+ - lib/apimatic-core/logger/configurations/api_logging_configuration.rb
177
+ - lib/apimatic-core/logger/default_logger.rb
178
+ - lib/apimatic-core/logger/nil_sdk_logger.rb
179
+ - lib/apimatic-core/logger/sdk_logger.rb
177
180
  - lib/apimatic-core/request_builder.rb
178
181
  - lib/apimatic-core/response_handler.rb
179
182
  - lib/apimatic-core/types/error_case.rb
@@ -190,9 +193,11 @@ files:
190
193
  - lib/apimatic-core/utilities/api_helper.rb
191
194
  - lib/apimatic-core/utilities/auth_helper.rb
192
195
  - lib/apimatic-core/utilities/comparison_helper.rb
196
+ - lib/apimatic-core/utilities/constants.rb
193
197
  - lib/apimatic-core/utilities/date_time_helper.rb
194
198
  - lib/apimatic-core/utilities/file_helper.rb
195
199
  - lib/apimatic-core/utilities/json_pointer_helper.rb
200
+ - lib/apimatic-core/utilities/logger_helper.rb
196
201
  - lib/apimatic-core/utilities/union_type_helper.rb
197
202
  - lib/apimatic-core/utilities/xml_helper.rb
198
203
  - lib/apimatic_core.rb
@@ -1,30 +0,0 @@
1
- module CoreLibrary
2
- # This class is responsible for logging info messages, debug messages, and errors.
3
- class EndpointLogger
4
- attr_reader :logger
5
-
6
- # Initializes a new instance of EndpointLogger.
7
- # @param logger A logger with methods info, debug and error.
8
- def initialize(logger)
9
- @logger = logger
10
- end
11
-
12
- # Logs the info message.
13
- # @param [String] info_message The message to be logged.
14
- def info(info_message)
15
- @logger&.info(info_message)
16
- end
17
-
18
- # Logs the debug message.
19
- # @param [String] debug_message The message to be logged.
20
- def debug(debug_message)
21
- @logger&.debug(debug_message)
22
- end
23
-
24
- # Logs the error.
25
- # @param [Exception] error The exception to be logged.
26
- def error(error)
27
- @logger&.error(error)
28
- end
29
- end
30
- end