class S3HttpGet::Request

Public Class Methods

new(uri, profile_name: nil) click to toggle source

@param uri [String, URI::HTTP] URI for the S3 object @param profile_name [String] profile name of your credential file

# File lib/s3-http-get/request.rb, line 7
def initialize(uri, profile_name: nil)
  @uri = uri.is_a?(URI::HTTP) ? uri : URI(uri)

  # cf. Aws::CredentialProviderChain
  @credentials = Aws::Credentials.new(ENV["AWS_ACCESS_KEY_ID"], ENV["AWS_SECRET_ACCESS_KEY"])
  unless @credentials.set?
    @credentials = Aws::SharedCredentials.new(profile_name: profile_name)
  end
end

Public Instance Methods

execute() click to toggle source

@return [Net::HTTPResponse]

# File lib/s3-http-get/request.rb, line 18
def execute
  Net::HTTP.start(@uri.host, @uri.port, use_ssl: @uri.scheme == "https") do |http|
    request = Net::HTTP::Get.new(@uri)
    # cf. http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html
    request.initialize_http_header(build_signature(@uri, @credentials).headers)
    http.request(request)
  end
end

Private Instance Methods

build_signature(uri, credentials) click to toggle source
# File lib/s3-http-get/request.rb, line 29
def build_signature(uri, credentials)
  signer = Aws::Sigv4::Signer.new(service: "s3", region: resolve_region(uri.host), credentials_provider: credentials)
  signer.sign_request(http_method: "GET", url: uri.to_s)
end
resolve_region(host) click to toggle source
# File lib/s3-http-get/request.rb, line 34
def resolve_region(host)
  # cf. http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro
  # cf. http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
  if host =~ /(?:\A|\.)s3(?:-external-1)?.amazonaws.com\z/
    return "us-east-1"
  end

  # e.g. "bucketname.s3-aws-region.amazonaws.com" => ["bucketname", "s3-aws-region"]
  labels = host.split(".")[0..-3]
  if labels[-1].start_with?("s3-")
    # e.g. "bucketname.s3-aws-region.amazonaws.com", "s3-aws-region.amazonaws.com"
    labels[-1].sub(/\As3-/, "")
  else  # Dual-Stack Endpoints:
    # e.g. "bucketname.s3.dualstack.aws-region.amazonaws.com", "s3.dualstack.aws-region.amazonaws.com"
    labels[-1]
  end
end