Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
- RSpec ~> 3.13
- Rake ~> 13.0
- Rest-Client ~> 2.1
- Remove implicit ActiveSupport requirement from runtime
- Typhoeus ~> 1.4

# 2.6.0 (2025-01-18)
Expand Down
12 changes: 6 additions & 6 deletions lib/api_auth/headers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module ApiAuth
# Builds the canonical string given a request object.
class Headers
include RequestDrivers
include Helpers

# Mapping of request class patterns to their driver classes
REQUEST_DRIVER_MAPPING = [
Expand Down Expand Up @@ -83,7 +84,10 @@ def canonical_string(override_method = nil, headers_to_sign = [])
@request.timestamp]

if headers_to_sign.is_a?(Array) && headers_to_sign.any?
headers_to_sign.each { |h| canonical_array << headers[h] if headers[h].present? }
headers_to_sign.each do |header_name|
header_value = headers[header_name]
canonical_array << header_value if value_present?(header_value)
end
end

canonical_array.join(',')
Expand Down Expand Up @@ -122,11 +126,7 @@ def sign_header(header)
private

def parse_uri(uri)
parsed_uri = URI.parse(uri)

return parsed_uri.request_uri if parsed_uri.respond_to?(:request_uri)

uri.empty? ? '/' : uri
canonical_request_uri(uri)
end
end
end
51 changes: 51 additions & 0 deletions lib/api_auth/helpers.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'uri'

module ApiAuth
module Helpers # :nodoc:
def b64_encode(string)
Expand All @@ -18,5 +20,54 @@ def capitalize_keys(hsh)
hsh.each_pair { |k, v| capitalized_hash[k.to_s.upcase] = v }
capitalized_hash
end

def value_blank?(value)
case value
when nil, false
true
when String, Array, Hash
value.empty?
else
value.respond_to?(:empty?) ? value.empty? : false
end
end

def value_present?(value)
!value_blank?(value)
end

def canonical_request_uri(base_url, additional_query = nil)
base = base_url.to_s
return '/' if base.empty?

uri = URI.parse(base)
merged_query = merge_query_strings(uri.query, normalize_query_component(additional_query))
uri.query = merged_query if value_present?(merged_query)

result = uri.respond_to?(:request_uri) ? uri.request_uri : uri.to_s
value_present?(result) ? result : '/'
rescue URI::InvalidURIError
'/'
end

private

def merge_query_strings(*queries)
combined = queries.compact.map(&:to_s).reject(&:empty?).join('&')
combined.empty? ? nil : combined
end

def normalize_query_component(component)
case component
when nil
nil
when String
component.empty? ? nil : component
when Hash
component.empty? ? nil : URI.encode_www_form(component)
else
component.to_s
end
end
end
end
17 changes: 1 addition & 16 deletions lib/api_auth/request_drivers/typhoeus_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,7 @@ def original_uri
end

def request_uri
url = (@request.base_url || '').to_s
return '/' if url.empty?

uri = URI.parse(url)
merged_query = merge_query(uri.query, params_query)
uri.query = merged_query unless merged_query.nil?

path = uri.request_uri
path.nil? || path.empty? ? '/' : path
rescue URI::InvalidURIError
'/'
canonical_request_uri(@request.base_url, params_query)
end

def set_date
Expand Down Expand Up @@ -116,11 +106,6 @@ def params_query
end
end

def merge_query(existing, additional)
segments = [existing, additional].compact.reject(&:empty?)
segments.empty? ? nil : segments.join('&')
end

def headers_hash
@request.options[:headers] ||= {}
end
Expand Down