Class: Alexa::Connection

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

Constant Summary collapse

RFC_3986_UNRESERVED_CHARS =
"-_.~a-zA-Z\\d"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(credentials = {}) ⇒ Connection

Returns a new instance of Connection.



15
16
17
18
# File 'lib/alexa/connection.rb', line 15

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



20
21
22
# File 'lib/alexa/connection.rb', line 20

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



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

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

#get(params = {}) ⇒ Object



24
25
26
27
# File 'lib/alexa/connection.rb', line 24

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

#handle_response(response) ⇒ Object



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

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



76
77
78
# File 'lib/alexa/connection.rb', line 76

def query
  default_params.merge(params).map { |key, value| "#{key}=#{URI.escape(value.to_s, Regexp.new("[^#{RFC_3986_UNRESERVED_CHARS}]"))}" }.sort.join("&")
end

#requestObject



46
47
48
# File 'lib/alexa/connection.rb', line 46

def request
  Faraday.get(uri)
end

#signObject



72
73
74
# File 'lib/alexa/connection.rb', line 72

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

#signatureObject



54
55
56
# File 'lib/alexa/connection.rb', line 54

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

#timestampObject



50
51
52
# File 'lib/alexa/connection.rb', line 50

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

#uriObject



58
59
60
# File 'lib/alexa/connection.rb', line 58

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