Class: Alexa::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/alexa/connection.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(credentials = {}) ⇒ Connection

Returns a new instance of Connection.



13
14
15
16
# File 'lib/alexa/connection.rb', line 13

def initialize(credentials = {})
  self.secret_access_key = credentials.fetch(:secret_access_key)
  self.access_key_id     = credentials.fetch(:access_key_id)
end

Instance Attribute Details

#access_key_idObject

Returns the value of attribute access_key_id.



10
11
12
# File 'lib/alexa/connection.rb', line 10

def access_key_id
  @access_key_id
end

#paramsObject



18
19
20
# File 'lib/alexa/connection.rb', line 18

def params
  @params ||= {}
end

#secret_access_keyObject

Returns the value of attribute secret_access_key.



10
11
12
# File 'lib/alexa/connection.rb', line 10

def secret_access_key
  @secret_access_key
end

Instance Method Details

#default_paramsObject



60
61
62
63
64
65
66
67
68
# File 'lib/alexa/connection.rb', line 60

def default_params
  {
    "AWSAccessKeyId"   => access_key_id,
    "SignatureMethod"  => "HmacSHA256",
    "SignatureVersion" => "2",
    "Timestamp"        => timestamp,
    "Version"          => Alexa::API_VERSION
  }
end

#get(params = {}) ⇒ Object



22
23
24
25
# File 'lib/alexa/connection.rb', line 22

def get(params = {})
  self.params = params
  handle_response(request).body.force_encoding(Encoding::UTF_8)
end

#handle_response(response) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/alexa/connection.rb', line 27

def handle_response(response)
  case response.status.to_i
  when 200...300
    response
  when 300...600
    if response.body.nil?
      raise ResponseError.new(nil, response)
    else
      xml = MultiXml.parse(response.body)
      message = xml["Response"]["Errors"]["Error"]["Message"]
      raise ResponseError.new(message, response)
    end
  else
    raise ResponseError.new("Unknown code: #{respnse.code}", response)
  end
end

#queryObject



74
75
76
# File 'lib/alexa/connection.rb', line 74

def query
  default_params.merge(params).map { |key, value| "#{key}=#{CGI::escape(value.to_s)}" }.sort.join("&")
end

#requestObject



44
45
46
# File 'lib/alexa/connection.rb', line 44

def request
  Faraday.get(uri)
end

#signObject



70
71
72
# File 'lib/alexa/connection.rb', line 70

def sign
  "GET\n" + Alexa::API_HOST + "\n/\n" + query
end

#signatureObject



52
53
54
# File 'lib/alexa/connection.rb', line 52

def signature
  Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new("sha256"), secret_access_key, sign)).strip
end

#timestampObject



48
49
50
# File 'lib/alexa/connection.rb', line 48

def timestamp
  @timestamp ||= Time::now.utc.strftime("%Y-%m-%dT%H:%M:%S.000Z")
end

#uriObject



56
57
58
# File 'lib/alexa/connection.rb', line 56

def uri
  URI.parse("http://#{Alexa::API_HOST}/?" + query + "&Signature=" + CGI::escape(signature))
end