class BranchableCDNAssets::Invalidator::AkamaiCCU::HTTP

Attributes

access_token[R]
client_token[R]
ident[R]
nonce[R]
secret_token[R]
time[R]

Public Class Methods

get(opts={}) click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 19
def self.get opts={}
  uri  = URI.parse opts.fetch(:url)
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true

  request = Net::HTTP::Get.new(opts.fetch(:url))
  signed  = self.new(opts).sign(request)

  return http.request signed
end
new(opts={}) click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 49
def initialize opts={}
  @ident = 'EG1-HMAC-SHA256'
  @time  = Time.now
  @nonce = SecureRandom.uuid

  @client_token = opts[:client_token]
  @access_token = opts[:access_token]
  @secret_token = opts[:secret_token]
end
post(opts={}) click to toggle source

opts requires:

action
url
and required keys for HTTP
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 35
def self.post opts={}
  uri  = URI.parse opts.fetch(:url)
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true

  request = Net::HTTP::Post.new(  opts.fetch(:url),
                                  'Content-Type' => 'application/json' )

  request.body = opts.fetch(:body).to_json
  signed       = self.new(opts).sign(request)

  return http.request signed
end

Public Instance Methods

formatted_time() click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 59
def formatted_time
  time.utc.strftime('%Y%m%dT%H:%M:%S+0000')
end
sign(http_request) click to toggle source

return a signed http_request

# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 64
def sign http_request
  unsigned_auth_header = "#{ident} client_token=#{client_token};" +
                         "access_token=#{access_token};" +
                         "timestamp=#{formatted_time};"  +
                         "nonce=#{nonce};"

  uri         = URI(http_request.path)
  auth_header = base64_hmac_sha256 [  http_request.method,
                                      uri.scheme,
                                      http_request.key?('host') ? http_request['host'] : uri.host,
                                      uri.request_uri,
                                      '',
                                      content_hash(http_request),
                                      unsigned_auth_header ].join("\t"),
                                   base64_hmac_sha256( formatted_time, secret_token )



  http_request['Authorization'] = "#{unsigned_auth_header}signature=#{auth_header}"

  return http_request
end

Private Instance Methods

base64_hmac_sha256(data, key) click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 107
def base64_hmac_sha256 data, key
  Base64.encode64( OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, key, data) ).strip
end
base64_sha256(data) click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 103
def base64_sha256 data
  Base64.encode64( OpenSSL::Digest::SHA256.new.digest(data) ).strip
end
content_hash(http_request) click to toggle source
# File lib/branchable_cdn_assets/invalidator/akamai_ccu/http.rb, line 89
def content_hash http_request
  if http_request.method == 'POST' && http_request.body && http_request.body.length > 0
    if http_request.body.length > 2048
      body = http_request.body[0..2047]
    else
      body = http_request.body
    end

    return base64_sha256(body)
  else
    return ""
  end
end