class S3Direct::UploadRequest

Attributes

filename[R]
options[R]
path[R]

Public Class Methods

new(path, sanitized_filename, options = {}) click to toggle source
# File lib/s3direct/upload_request.rb, line 5
def initialize(path, sanitized_filename, options = {})
  @path = path
  @filename = sanitized_filename
  @options = options
end

Public Instance Methods

attachment_filename() click to toggle source
# File lib/s3direct/upload_request.rb, line 39
def attachment_filename
  options[:attachment_filename].presence
end
content_type() click to toggle source
# File lib/s3direct/upload_request.rb, line 47
def content_type
  ContentTypeDetection.new(filename, filetype).lookup
end
filetype() click to toggle source
# File lib/s3direct/upload_request.rb, line 43
def filetype
  options[:filetype].presence
end
key() click to toggle source
# File lib/s3direct/upload_request.rb, line 11
def key
  ::File.join(@path, @filename)
end
max_upload_size() click to toggle source
# File lib/s3direct/upload_request.rb, line 55
def max_upload_size
  options.fetch(:max_upload_size, config.max_upload_size)
end
s3_acl() click to toggle source
# File lib/s3direct/upload_request.rb, line 51
def s3_acl
  options.fetch(:acl, config.default_acl)
end
to_json() click to toggle source
# File lib/s3direct/upload_request.rb, line 15
def to_json
  data = {
    url: config.bucket_url,
    filename: @filename,
    key: key,
    policy: s3_upload_policy_document,
    signature: s3_upload_signature,
    acl: s3_acl,
    success_action_status: "200",
    max_upload_size: max_upload_size,
    'AWSAccessKeyId' => config.access_key
  }

  if attachment_filename
    data["Content-Disposition"] = %Q{attachment; filename="#{attachment_filename}"}
  end

  if content_type
    data["Content-Type"] = content_type
  end

  data.to_json
end

Private Instance Methods

config() click to toggle source
# File lib/s3direct/upload_request.rb, line 99
def config
  ::S3Direct.config
end
encode(str) click to toggle source
# File lib/s3direct/upload_request.rb, line 95
def encode(str)
  Base64.encode64(str).gsub("\n",'')
end
s3_upload_policy_document() click to toggle source

generate the policy document that amazon is expecting.

# File lib/s3direct/upload_request.rb, line 62
def s3_upload_policy_document
  policy = {
    'expiration' => 5.minutes.from_now.utc.xmlschema,
    'conditions' => [
      {'bucket' => config.bucket},
      {'acl' => s3_acl},
      {'success_action_status' => '200'},
      {'key' => key},
      ['content-length-range', 0, max_upload_size]
    ]
  }

  if attachment_filename
    policy['conditions'] << {"Content-Disposition" => %Q{attachment; filename="#{attachment_filename}"}}
  end

  if content_type
    policy['conditions'] << {"Content-Type" => content_type}
  end

  encode(policy.to_json)
end
s3_upload_signature() click to toggle source

sign our request by Base64 encoding the policy document.

# File lib/s3direct/upload_request.rb, line 86
def s3_upload_signature
  signature = OpenSSL::HMAC.digest(
    OpenSSL::Digest.new('sha1'),
    config.secret_key,
    s3_upload_policy_document
  )
  encode(signature)
end