class Amazon::S3::Uri::AmazonS3URI

Constants

ENDPOINT_PATTERN

Attributes

bucket[R]
key[R]
region[R]
uri[R]

Public Class Methods

new(url) click to toggle source
# File lib/uri.rb, line 10
def initialize(url)
  if url.nil?
    raise ArgumentError.new("url cannot be null")
  end
  @uri = URI(url)

  @host = @uri.host
  if @host.nil?
    raise ArgumentError.new("Invalid S3 URI: no hostname: " + url)
  end

  matches = ENDPOINT_PATTERN.match(@host)

  prefix = matches[1]

  if prefix.nil? || prefix.empty?
    # No bucket name in the authority; parse it from the path.
    @isPathStyle = true
    path = uri.path
    if (path == '/')
      @bucket = nil
      @key = nil
    else
      # path genearlly in style of `/sample-bucket/temp/8746ee3e-4089-11e8-9a0b-f3d94c494e17.somaya.jpg`
      index = path.index('/', 1)
      if index.nil?
        # path if equals /sample-bucket
        # puts path
        @bucket = path[1 .. -1]
        @key = nil
      elsif index == path.length - 1
        # path if equals /sample-bucket/
        @bucket = path[1 ... index]
        @key = nil
      else
        # path if equals `/sample-bucket/temp/8746ee3e-4089-11e8-9a0b-f3d94c494e17.somaya.jpg`
        @bucket = path[1 ... index]
        @key = path[index + 1 .. -1]
      end
    end
  else
    @isPathStyle = false

    # Remove the trailing '.' from the prefix to get the bucket.
    @bucket = prefix[0 ... -1]
    path = uri.path
    if path.nil? || path.empty? || path  == '/'
      @key = nil
    else
      # Remove the leading '/'
      @key = path[ 1 .. -1]
    end
  end

  if matches[2] == 'amazonaws'
    # No region specified
    @region = nil
  else
    @region = matches[2]
  end
end