class AWS::SES::Base
AWS::SES::Base is the abstract super class of all classes who make requests against SES
Attributes
Public Class Methods
@option options [String] :access_key_id (“”) The user's AWS Access Key ID @option options [String] :secret_access_key (“”) The user's AWS Secret Access Key @option options [Boolean] :use_ssl (true) Connect using SSL? @option options [String] :server (“email.us-east-1.amazonaws.com”) The server API endpoint host @option options [String] :proxy_server (nil) An HTTP proxy server FQDN @option options [String] :user_agent (“github-aws-ses-ruby-gem”) The HTTP User-Agent header value @return [Object] the object.
# File lib/aws/ses/base.rb, line 86 def initialize( options = {} ) options = { :access_key_id => "", :secret_access_key => "", :use_ssl => true, :server => DEFAULT_HOST, :path => "/", :user_agent => USER_AGENT, :proxy_server => nil }.merge(options) @server = options[:server] @proxy_server = options[:proxy_server] @use_ssl = options[:use_ssl] @path = options[:path] @user_agent = options[:user_agent] @settings = {} raise ArgumentError, "No :access_key_id provided" if options[:access_key_id].nil? || options[:access_key_id].empty? raise ArgumentError, "No :secret_access_key provided" if options[:secret_access_key].nil? || options[:secret_access_key].empty? raise ArgumentError, "No :use_ssl value provided" if options[:use_ssl].nil? raise ArgumentError, "Invalid :use_ssl value provided, only 'true' or 'false' allowed" unless options[:use_ssl] == true || options[:use_ssl] == false raise ArgumentError, "No :server provided" if options[:server].nil? || options[:server].empty? if options[:port] # user-specified port @port = options[:port] elsif @use_ssl # https @port = 443 else # http @port = 80 end @access_key_id = options[:access_key_id] @secret_access_key = options[:secret_access_key] # Use proxy server if defined # Based on patch by Mathias Dalheimer. 20070217 proxy = @proxy_server ? URI.parse(@proxy_server) : OpenStruct.new @http = Net::HTTP::Proxy( proxy.host, proxy.port, proxy.user, proxy.password).new(options[:server], @port) @http.use_ssl = @use_ssl # Don't verify the SSL certificates. Avoids SSL Cert warning in log on every GET. @http.verify_mode = OpenSSL::SSL::VERIFY_NONE end
Public Instance Methods
# File lib/aws/ses/addresses.rb, line 69 def addresses @addresses ||= Addresses.new(self) end
# File lib/aws/ses/base.rb, line 139 def connection @http end
Set the Authorization header using AWS signed header authentication
# File lib/aws/ses/base.rb, line 182 def get_aws_auth_param(timestamp, secret_access_key) encoded_canonical = SES.encode(secret_access_key, timestamp, false) SES.authorization_header(@access_key_id, 'HmacSHA256', encoded_canonical) end
Make the connection to AWS passing in our request.
allow us to have a one line call in each method which will do all of the work in making the actual request to AWS.
# File lib/aws/ses/base.rb, line 146 def request(action, params = {}) # Use a copy so that we don't modify the caller's Hash, remove any keys that have nil or empty values params = params.reject { |key, value| value.nil? or value.empty?} timestamp = Time.now.getutc params.merge!( {"Action" => action, "SignatureVersion" => "2", "SignatureMethod" => 'HmacSHA256', "AWSAccessKeyId" => @access_key_id, "Version" => API_VERSION, "Timestamp" => timestamp.iso8601 } ) query = params.sort.collect do |param| CGI::escape(param[0]) + "=" + CGI::escape(param[1]) end.join("&") req = {} req['X-Amzn-Authorization'] = get_aws_auth_param(timestamp.httpdate, @secret_access_key) req['Date'] = timestamp.httpdate req['User-Agent'] = @user_agent response = connection.post(@path, query, req) response_class = AWS::SES.const_get( "#{action}Response" ) result = response_class.new(action, response) if result.error? raise ResponseError.new(result) end result end