Skip to content

Commit 0ff0e28

Browse files
author
Ryan Miville
authored
Merge pull request #1 from ryanmiville/aws4_request_v1
aws4 request v1
2 parents 5666f3e + 3103ca5 commit 0ff0e28

File tree

324 files changed

+37360
-29016
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

324 files changed

+37360
-29016
lines changed

gleam.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ version = "0.1.0"
1515
[dependencies]
1616
gleam_stdlib = ">= 0.34.0 and < 2.0.0"
1717
envoy = ">= 1.0.1 and < 2.0.0"
18-
aws4_request = ">= 0.1.1 and < 1.0.0"
18+
aws4_request = ">= 1.0.0 and < 2.0.0"
1919
gleam_http = ">= 3.6.0 and < 4.0.0"
2020

2121
[dev-dependencies]

manifest.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# You typically do not need to edit this file
33

44
packages = [
5-
{ name = "aws4_request", version = "0.1.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_http", "gleam_stdlib"], otp_app = "aws4_request", source = "hex", outer_checksum = "90B1DB6E2A7F0396CD4713850B14B3A910331B5BA76D051E411D1499AAA2EA9A" },
5+
{ name = "aws4_request", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_http", "gleam_stdlib"], otp_app = "aws4_request", source = "hex", outer_checksum = "F2A0A4A7A04118421AF2F8FB33E3A9D514118A32F4A6560600D4217F9B664C66" },
66
{ name = "envoy", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "CFAACCCFC47654F7E8B75E614746ED924C65BD08B1DE21101548AC314A8B6A41" },
77
{ name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" },
88
{ name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" },
@@ -11,7 +11,7 @@ packages = [
1111
]
1212

1313
[requirements]
14-
aws4_request = { version = ">= 0.1.1 and < 1.0.0" }
14+
aws4_request = { version = ">= 1.0.0 and < 2.0.0" }
1515
envoy = { version = ">= 1.0.1 and < 2.0.0" }
1616
gleam_http = { version = ">= 3.6.0 and < 4.0.0" }
1717
gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" }

src/aws_request/config.gleam

-100
This file was deleted.

src/aws_request/internal/endpoint.gleam

+21-42
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,35 @@
1-
import aws_request/config.{type Config}
1+
import aws4_request.{type Signer, Signer}
22
import aws_request/internal/metadata.{type Metadata, Global}
33
import gleam/option.{None, Some}
44
import gleam/string
55

6-
pub type Endpoint {
7-
Endpoint(
8-
hostname: String,
9-
protocol: String,
10-
signing_region: String,
11-
signing_name: String,
12-
)
13-
}
14-
15-
pub fn from(config: Config, metadata: Metadata) -> Endpoint {
16-
case config.endpoint {
17-
Some(ep) -> {
18-
let #(protocol, hostname) = split_scheme(ep)
19-
Endpoint(hostname, protocol, config.region, metadata.signing_name)
6+
pub fn resolve(signer: Signer, metadata: Metadata) -> #(Signer, String) {
7+
case signer.region {
8+
"local" -> #(
9+
Signer(..signer, region: "us-east-1", service: metadata.signing_name),
10+
"http://localhost:8000/",
11+
)
12+
region -> {
13+
case metadata.global {
14+
Some(Global(region, hostname)) -> #(
15+
Signer(..signer, region: region, service: metadata.signing_name),
16+
"https://" <> hostname <> "/",
17+
)
18+
None -> #(
19+
Signer(..signer, service: metadata.signing_name),
20+
default(region, metadata),
21+
)
22+
}
2023
}
21-
None -> resolve(config, metadata)
22-
}
23-
}
24-
25-
fn split_scheme(uri: String) {
26-
case uri {
27-
"https://" <> host -> #("https", host)
28-
"http://" <> host -> #("http", host)
29-
other -> #("https", other)
30-
}
31-
}
32-
33-
fn resolve(config: Config, metadata: Metadata) -> Endpoint {
34-
case config.region, metadata.global {
35-
"local", _ ->
36-
Endpoint("localhost:8000", "http", "us-east-1", metadata.signing_name)
37-
_, Some(Global(region, hostname)) ->
38-
Endpoint(hostname, "https", region, metadata.signing_name)
39-
region, None ->
40-
Endpoint(
41-
default(config, metadata),
42-
"https",
43-
region,
44-
metadata.signing_name,
45-
)
4624
}
4725
}
4826

49-
fn default(config: Config, metadata: Metadata) {
27+
fn default(region: String, metadata: Metadata) {
5028
string.concat([
29+
"https://",
5130
metadata.endpoint_prefix,
5231
".",
53-
config.region,
32+
region,
5433
".",
5534
"amazonaws.com",
5635
])
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,25 @@
1-
import aws4_request
2-
import aws_request/internal/endpoint.{type Endpoint}
3-
import aws_request/internal/time
1+
import aws4_request.{type Signer, Signer}
42
import gleam/bit_array
53
import gleam/http.{type Header}
64
import gleam/http/request.{type Request, Request}
75
import gleam/option.{type Option}
86

9-
pub type RequestBuilder {
10-
RequestBuilder(
11-
access_key_id: String,
12-
secret_access_key: String,
13-
service_id: String,
14-
endpoint: Endpoint,
15-
)
16-
}
17-
18-
fn sign_v4(builder: RequestBuilder, request: Request(BitArray)) {
19-
let date_time = time.utc_now() |> time.to_parts
20-
aws4_request.sign(
21-
request,
22-
date_time,
23-
builder.access_key_id,
24-
builder.secret_access_key,
25-
builder.endpoint.signing_region,
26-
builder.endpoint.signing_name,
27-
)
28-
}
29-
307
pub fn build(
31-
builder: RequestBuilder,
8+
signer: Signer,
9+
endpoint: String,
3210
method: http.Method,
3311
path: String,
34-
headers: List(Header),
12+
extra_headers: List(Header),
3513
query: Option(String),
3614
body: Option(BitArray),
3715
) -> Request(BitArray) {
38-
let assert Ok(request) = request.to(url(builder.endpoint) <> path)
39-
let headers = [#("host", builder.endpoint.hostname), ..headers]
16+
let assert Ok(request) = request.to(endpoint <> path)
4017

4118
let body = option.unwrap(body, bit_array.from_string(""))
4219
let request =
43-
request.Request(..request, headers: headers, query: query)
20+
request.Request(..request, headers: extra_headers, query: query)
4421
|> request.set_method(method)
4522
|> request.set_body(body)
4623

47-
sign_v4(builder, request)
48-
}
49-
50-
fn url(endpoint: Endpoint) -> String {
51-
endpoint.protocol <> "://" <> endpoint.hostname <> "/"
24+
aws4_request.sign_bits(signer, request)
5225
}

src/aws_request/internal/time.gleam

-45
This file was deleted.

0 commit comments

Comments
 (0)