Packages
ex_aws
1.0.0-beta0
2.7.0
2.6.1
2.6.0
2.5.11
2.5.10
2.5.9
2.5.8
2.5.7
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.1
1.0.0-beta3
1.0.0-beta2
1.0.0-beta1
1.0.0-beta0
0.5.0
0.4.19
0.4.18
0.4.17
0.4.15
0.4.14
0.4.13
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
AWS client for Elixir. Currently supports Dynamo, DynamoStreams, EC2, Firehose, Kinesis, KMS, Lambda, RRDS, Route53, S3, SES, SNS, SQS, STS and others.
Current section
Files
Jump to
Current section
Files
lib/ex_aws/operation/s3.ex
defmodule ExAws.Operation.S3 do
@moduledoc """
Holds data necessary for an operation on the S3 service.
"""
defstruct [
stream_builder: nil,
parser: &ExAws.Utils.identity/1,
bucket: "",
path: "/",
http_method: nil,
body: "",
resource: "",
params: %{},
headers: %{},
service: :s3
]
@type t :: %__MODULE__{}
defimpl ExAws.Operation do
def perform(operation, config) do
bucket = operation.bucket
body = operation.body
resource = operation.resource
query = operation.params |> URI.encode_query
headers = operation.headers
path = operation.path
http_method = operation.http_method
url =
config
|> url(bucket, path)
|> add_query(resource, query)
hashed_payload = ExAws.Auth.Utils.hash_sha256(body)
headers = headers
|> Map.put("x-amz-content-sha256", hashed_payload)
|> Map.put("content-length", byte_size(body))
|> Map.to_list
ExAws.Request.request(http_method, url, body, headers, config, operation.service)
|> operation.parser.()
end
def stream!(%{stream_builder: fun}, config) do
fun.(config)
end
def url(%{scheme: scheme, host: host}, bucket, path) do
[scheme, do_url(host, bucket, path)]
|> IO.iodata_to_binary
end
defp do_url(host, "", path) do
[host, "/", no_slash(path)]
end
defp do_url(host, bucket, path) do
[host, "/", bucket, ensure_slash(path)]
end
defp no_slash("/" <> path), do: path
defp no_slash(path), do: path
def ensure_slash("/" <> _ = path), do: path
def ensure_slash(path), do: "/" <> path
def add_query(url, "", ""), do: url
def add_query(url, "", query), do: url <> "?" <> query
def add_query(url, resource, ""), do: url <> "?" <> resource
def add_query(url, resource, query), do: url <> "?" <> resource <> "&" <> query
end
end
defmodule ExAws.Operation.S3DeleteAllObjects do
defstruct [
bucket: nil,
objects: [],
opts: []
]
@type t :: %__MODULE__{}
defimpl ExAws.Operation do
def perform(%{bucket: bucket, files: files, opts: opts}, config) do
request_fun = fn objects ->
bucket
|> ExAws.S3.delete_multiple_objects(objects, opts)
|> ExAws.request(config)
end
delete_all_objects(request_fun, files, opts, [])
end
defp delete_all_objects(_request_fun, [], _opts, acc) do
{:ok, Enum.reverse(acc)}
end
defp delete_all_objects(request_fun, objects, opts, acc) do
{objects, rest} = Enum.split(objects, 1000)
with {:ok, result} <- request_fun.(objects) do
delete_all_objects(request_fun, rest, opts, [result | acc])
end
end
def stream!(%{bucket: bucket, files: files, opts: opts}, config) do
files
|> Stream.chunk(1000, 1000, [])
|> Stream.flat_map(fn objects ->
bucket
|> ExAws.S3.delete_multiple_objects(objects, opts)
|> ExAws.request!(config)
end)
end
end
end