class ApiSignature::Builder

Constants

SPLITTER

Attributes

settings[R]

Public Class Methods

new(settings = {}, unsigned_headers = []) click to toggle source
# File lib/api_signature/builder.rb, line 11
def initialize(settings = {}, unsigned_headers = [])
  @settings = settings
  @unsigned_headers = unsigned_headers
end

Public Instance Methods

body() click to toggle source
# File lib/api_signature/builder.rb, line 44
def body
  @body ||= (settings[:body] || '')
end
build_sign_headers(apply_checksum_header = false) click to toggle source
# File lib/api_signature/builder.rb, line 48
def build_sign_headers(apply_checksum_header = false)
  @sign_headers = {
    'host' => host,
    'x-datetime' => datetime
  }
  @sign_headers['x-content-sha256'] = content_sha256 if apply_checksum_header
  @sign_headers
end
canonical_request(path) click to toggle source
# File lib/api_signature/builder.rb, line 69
def canonical_request(path)
  [
    http_method,
    path,
    Utils.normalized_querystring(uri.query),
    canonical_headers + SPLITTER,
    signed_headers_names,
    content_sha256
  ].join(SPLITTER)
end
content_sha256() click to toggle source
# File lib/api_signature/builder.rb, line 40
def content_sha256
  @content_sha256 ||= Utils.sha256_hexdigest(body)
end
date() click to toggle source
# File lib/api_signature/builder.rb, line 36
def date
  @date ||= datetime.to_s.scan(/\d/).take(8).join
end
datetime() click to toggle source
# File lib/api_signature/builder.rb, line 32
def datetime
  @datetime ||= extract_datetime
end
full_headers() click to toggle source
# File lib/api_signature/builder.rb, line 57
def full_headers
  @full_headers ||= merge_sign_with_origin_headers
end
headers() click to toggle source
# File lib/api_signature/builder.rb, line 28
def headers
  @headers ||= Utils.normalize_keys(settings[:headers])
end
host() click to toggle source
# File lib/api_signature/builder.rb, line 24
def host
  @host ||= extract_host_from_uri
end
http_method() click to toggle source
# File lib/api_signature/builder.rb, line 16
def http_method
  @http_method ||= extract_http_method
end
signed_headers() click to toggle source
# File lib/api_signature/builder.rb, line 61
def signed_headers
  @signed_headers ||= full_headers.reject { |key, _value| @unsigned_headers.include?(key) }
end
signed_headers_names() click to toggle source
# File lib/api_signature/builder.rb, line 65
def signed_headers_names
  @signed_headers_names ||= signed_headers.keys.sort.join(';')
end
uri() click to toggle source
# File lib/api_signature/builder.rb, line 20
def uri
  @uri ||= extract_uri
end

Private Instance Methods

canonical_headers() click to toggle source
# File lib/api_signature/builder.rb, line 113
def canonical_headers
  signed_headers.sort_by(&:first)
                .map { |k, v| "#{k}:#{Utils.canonical_header_value(v.to_s)}" }
                .join(SPLITTER)
end
extract_datetime() click to toggle source
# File lib/api_signature/builder.rb, line 102
def extract_datetime
  headers['x-datetime'] || Time.now.utc.strftime(ApiSignature.configuration.datetime_format)
end
extract_host_from_uri() click to toggle source
# File lib/api_signature/builder.rb, line 94
def extract_host_from_uri
  if Utils.standard_port?(uri)
    uri.host
  else
    "#{uri.host}:#{uri.port}"
  end
end
extract_http_method() click to toggle source
# File lib/api_signature/builder.rb, line 82
def extract_http_method
  raise ArgumentError, 'missing required option :http_method' unless settings[:http_method]

  settings[:http_method].to_s.upcase
end
extract_uri() click to toggle source
# File lib/api_signature/builder.rb, line 88
def extract_uri
  raise ArgumentError, 'missing required option :url' unless settings[:url]

  URI.parse(settings[:url].to_s)
end
merge_sign_with_origin_headers() click to toggle source
# File lib/api_signature/builder.rb, line 106
def merge_sign_with_origin_headers
  raise ArgumentError, 'missing required variable sign_headers' unless @sign_headers

  # merge so we do not modify given headers hash
  headers.merge(@sign_headers)
end