Compare commits

..

No commits in common. "e98d64f39c2ca05f43c7237733179671dcdd7522" and "b2ebc5a621dcaf966cf16e7b45e1c69e4a8ee683" have entirely different histories.

284 changed files with 228 additions and 518 deletions

6
.gitignore vendored
View File

@ -1,9 +1,7 @@
.cache
zig-cache
codegen/models/*.zig
codegen/codegen
src/codegen/models/*.zig
src/codegen/codegen
*.tgz
service_manifest.zig
demo
src/models/
smithy/zig-out/

View File

@ -1,17 +1,23 @@
# AWS SDK for Zig
Ok, so it's not actually an SDK (yet). Right now the SDK should support
any "query-based" operation and probably EC2, though this isn't tested yet.
Total service count should be around 18 services supported. If you use an
unsupported service, you'll get a compile error.
Ok, so it's not actually an SDK (yet). Right now this is SDK supports sts
get-caller-identity action only. Why? Because it's one of the easiest to
support, so I started there. From here, the next major step is to codegen
the types necessary to support the various services. Currently this code is
dynamically generating the sts types so we are somewhat codegen ready, but
current comptime limitations might trip us up. The advantage of comptime is
that only types actually used would be generated vs the whole surface area
of AWS. That said, with most of the heavy lifting now coded, the addition
of the request/response types, even if all of them are added, should not
balloon the size beyond "reasonable". Of course this still needs to be be seen.
This is my first serious zig effort, so please issue a PR if the code isn't
"ziggy" or if there's a better way.
This is designed to be built statically using the `aws_c_*` libraries, so
we inherit a lot of the goodness of the work going on there. Current
executable size is 10.3M, about half of which is due to the SSL library.
This is for x86_linux (which is all that's tested at the moment).
we inherit a lot of the goodness of the work going on there. Implementing
get-caller-identity with all dependencies statically linked gives us a stripped
executable size of 5.3M for x86_linux (which is all that's tested at the moment).
## Building
@ -25,15 +31,12 @@ I'm also hoping/expecting AWS to factor out that library sometime in
the future.
Once that's done, you'll have an alpine image with all dependencies ready
to go and zig master installed. There are some build-related things still
broken in 0.8.0 and hopefully 0.8.1 will address those and we can be on
a standard release.
to go and zig 0.7.1 installed. The build.zig currently relies on
[this PR to allow stripping -static](https://github.com/ziglang/zig/pull/8248),
so either:
* `zig build` should work. It will build the code generation project, run
the code generation, then build the main project with the generated code.
* Install make and use the included Makefile. Going this path should be fine
with zig 0.8.0 release, but code generation has not been added to the
Makefile yet (ever?), so you'll be on your own for that.
* Modify build.zig, then strip (or not) after the fact
* Install make and use the included Makefile
## Running
@ -93,7 +96,7 @@ TODO List:
* ✓ Implement codegen for services with xml structures (using Smithy models)
* ✓ Implement codegen for others (using Smithy models)
* Switch to aws-c-cal upstream once [PR for full static musl build support is merged](https://github.com/awslabs/aws-c-cal/pull/89) (see Dockerfile)
* Move to compiler on tagged release (hopefully 0.8.1)
* Remove compiler 0.7.1 shims when 0.8.0 is released
(new 2021-05-29. I will proceed in this order unless I get other requests)
* ✓ Implement [AWS query protocol](https://awslabs.github.io/smithy/1.0/spec/aws/aws-query-protocol.html). This is the protocol in use by sts.getcalleridentity. Total service count 18
* Implement [AWS Json 1.0 protocol](https://awslabs.github.io/smithy/1.0/spec/aws/aws-json-1_0-protocol.html). Includes dynamodb. Total service count 18
@ -103,6 +106,7 @@ TODO List:
Compiler wishlist/watchlist:
* Fix the weirdness we see with comptime type generation (see aws.zig around line 135)
* ~~[Allow declarations for comptime type generation](https://github.com/ziglang/zig/issues/6709)~~
This is no longer as important. The primary issue was in the return value, but

View File

@ -1,8 +1,7 @@
const std = @import("std");
const builtin = @import("builtin");
// const std = @import("std");
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) !void {
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
@ -14,45 +13,20 @@ pub fn build(b: *Builder) !void {
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("demo", "src/main.zig");
// https://github.com/ziglang/zig/issues/855
exe.addPackagePath("smithy", "smithy/src/smithy.zig");
// TODO: Support > linux
// TODO: Get a better cache in place
if (std.builtin.os.tag == .linux) {
const codegen = b.step("gen", "Generate zig service code from smithy models");
codegen.dependOn(&b.addSystemCommand(&.{ "/bin/sh", "-c", "cd codegen && zig build" }).step);
codegen.dependOn(&b.addSystemCommand(&.{
"/bin/sh", "-c",
\\ mkdir -p src/models/ && \
\\ [ -f src/models/service_manifest.zig ] || \
\\ ( cd codegen/models && ../codegen *.json && mv *.zig ../../src/models )
}).step);
b.getInstallStep().dependOn(codegen);
}
// TODO: Generate src/models.zig
exe.addCSourceFile("src/bitfield-workaround.c", &[_][]const u8{"-std=c99"});
const c_include_dirs = .{
"./src/",
"/usr/local/include",
};
inline for (c_include_dirs) |dir|
exe.addIncludeDir(dir);
const dependent_objects = .{
"/usr/local/lib64/libs2n.a",
"/usr/local/lib64/libcrypto.a",
"/usr/local/lib64/libssl.a",
"/usr/local/lib64/libaws-c-auth.a",
"/usr/local/lib64/libaws-c-cal.a",
"/usr/local/lib64/libaws-c-common.a",
"/usr/local/lib64/libaws-c-compression.a",
"/usr/local/lib64/libaws-c-http.a",
"/usr/local/lib64/libaws-c-io.a",
};
inline for (dependent_objects) |obj|
exe.addObjectFile(obj);
exe.addIncludeDir("./src/");
exe.addIncludeDir("/usr/local/include");
exe.addObjectFile("/usr/local/lib64/libs2n.a");
exe.addObjectFile("/usr/local/lib64/libcrypto.a");
exe.addObjectFile("/usr/local/lib64/libssl.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-auth.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-cal.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-common.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-compression.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-http.a");
exe.addObjectFile("/usr/local/lib64/libaws-c-io.a");
exe.linkSystemLibrary("c");
exe.setTarget(target);
exe.setBuildMode(mode);
@ -62,14 +36,9 @@ pub fn build(b: *Builder) !void {
// https://ziglang.org/builds/zig-linux-x86_64-0.9.0-dev.113+05b5e49bc.tar.xz
// exe.override_dest_dir = .{ .Custom = ".." };
exe.override_dest_dir = .{ .custom = ".." };
// Static linkage flag was nonfunctional until 2b2efa24d0855
// Did not notice this until 2021-06-28, and that nightly is:
// https://ziglang.org/builds/zig-linux-x86_64-0.9.0-dev.321+15a030ef3.tar.xz
exe.linkage = .static;
const is_strip = b.option(bool, "strip", "strip exe") orelse true;
exe.strip = !is_strip;
exe.strip = true;
exe.install();
const run_cmd = exe.run();
@ -80,20 +49,4 @@ pub fn build(b: *Builder) !void {
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const test_step = b.step("test", "Run library tests");
var build_dir = try std.fs.openDirAbsolute(b.build_root, .{});
defer build_dir.close();
var src_dir = try build_dir.openDir("src", .{ .iterate = true });
defer src_dir.close();
var iterator = src_dir.iterate();
while (try iterator.next()) |entry| {
if (std.mem.endsWith(u8, entry.name, ".zig")) {
const name = try std.fmt.allocPrint(b.allocator, "src/{s}", .{entry.name});
defer b.allocator.free(name);
const t = b.addTest(name);
t.setBuildMode(mode);
test_step.dependOn(&t.step);
}
}
}

View File

@ -1,59 +0,0 @@
const std = @import("std");
pub fn build(b: *std.build.Builder) !void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("codegen", "src/main.zig");
exe.addPackagePath("smithy", "../smithy/src/smithy.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
// This line works as of c5d412268
// Earliest nightly is 05b5e49bc on 2021-06-12
// https://ziglang.org/builds/zig-linux-x86_64-0.9.0-dev.113+05b5e49bc.tar.xz
// exe.override_dest_dir = .{ .Custom = ".." };
exe.override_dest_dir = .{ .custom = ".." };
// Static linkage flag was nonfunctional until 2b2efa24d0855
// Did not notice this until 2021-06-28, and that nightly is:
// https://ziglang.org/builds/zig-linux-x86_64-0.9.0-dev.321+15a030ef3.tar.xz
exe.linkage = .static;
const is_strip = b.option(bool, "strip", "strip exe") orelse true;
exe.strip = !is_strip;
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const test_step = b.step("test", "Run library tests");
var build_dir = try std.fs.openDirAbsolute(b.build_root, .{});
defer build_dir.close();
var src_dir = try build_dir.openDir("src", .{ .iterate = true });
defer src_dir.close();
var iterator = src_dir.iterate();
while (try iterator.next()) |entry| {
if (std.mem.endsWith(u8, entry.name, ".zig") and
!std.mem.eql(u8, entry.name, "main.zig"))
{
const name = try std.fmt.allocPrint(b.allocator, "src/{s}", .{entry.name});
defer b.allocator.free(name);
const t = b.addTest(name);
t.setBuildMode(mode);
test_step.dependOn(&t.step);
}
}
}

View File

@ -1,213 +0,0 @@
const smithy = @import("smithy.zig");
pub const sts: struct {
version: []const u8 = "2011-06-15",
sdk_id: []const u8 = "STS",
arn_namespace: []const u8 = "sts",
endpoint_prefix: []const u8 = "sts",
sigv4_name: []const u8 = "sts",
aws_protocol: smithy.AwsProtocol = smithy.AwsProtocol.query,
assume_role: struct {
action_name: []const u8 = "AssumeRole",
Request: type = struct {
role_session_name: []const u8,
transitive_tag_keys: ?[][]const u8 = null,
serial_number: ?[]const u8 = null,
token_code: ?[]const u8 = null,
tags: ?[]struct {
value: []const u8,
key: []const u8,
} = null,
policy_arns: ?[]struct {
arn: ?[]const u8 = null,
} = null,
role_arn: []const u8,
source_identity: ?[]const u8 = null,
duration_seconds: ?i64 = null,
policy: ?[]const u8 = null,
external_id: ?[]const u8 = null,
},
Response: type = struct {
credentials: struct {
access_key_id: []const u8,
secret_access_key: []const u8,
session_token: []const u8,
expiration: i64,
},
source_identity: []const u8,
assumed_role_user: struct {
assumed_role_id: []const u8,
arn: []const u8,
},
packed_policy_size: i64,
},
ServiceError: type = error{
ExpiredToken,
MalformedPolicyDocument,
PackedPolicyTooLarge,
RegionDisabled,
},
} = .{},
assume_role_with_saml: struct {
action_name: []const u8 = "AssumeRoleWithSAML",
Request: type = struct {
policy_arns: ?[]struct {
arn: ?[]const u8 = null,
} = null,
role_arn: []const u8,
principal_arn: []const u8,
saml_assertion: []const u8,
duration_seconds: ?i64 = null,
policy: ?[]const u8 = null,
},
Response: type = struct {
credentials: struct {
access_key_id: []const u8,
secret_access_key: []const u8,
session_token: []const u8,
expiration: i64,
},
packed_policy_size: i64,
subject_type: []const u8,
name_qualifier: []const u8,
source_identity: []const u8,
assumed_role_user: struct {
assumed_role_id: []const u8,
arn: []const u8,
},
issuer: []const u8,
audience: []const u8,
subject: []const u8,
},
ServiceError: type = error{
ExpiredToken,
IDPRejectedClaim,
InvalidIdentityToken,
MalformedPolicyDocument,
PackedPolicyTooLarge,
RegionDisabled,
},
} = .{},
assume_role_with_web_identity: struct {
action_name: []const u8 = "AssumeRoleWithWebIdentity",
Request: type = struct {
role_session_name: []const u8,
duration_seconds: ?i64 = null,
policy_arns: ?[]struct {
arn: ?[]const u8 = null,
} = null,
role_arn: []const u8,
provider_id: ?[]const u8 = null,
web_identity_token: []const u8,
policy: ?[]const u8 = null,
},
Response: type = struct {
subject_from_web_identity_token: []const u8,
credentials: struct {
access_key_id: []const u8,
secret_access_key: []const u8,
session_token: []const u8,
expiration: i64,
},
provider: []const u8,
packed_policy_size: i64,
source_identity: []const u8,
assumed_role_user: struct {
assumed_role_id: []const u8,
arn: []const u8,
},
audience: []const u8,
},
ServiceError: type = error{
ExpiredToken,
IDPCommunicationError,
IDPRejectedClaim,
InvalidIdentityToken,
MalformedPolicyDocument,
PackedPolicyTooLarge,
RegionDisabled,
},
} = .{},
decode_authorization_message: struct {
action_name: []const u8 = "DecodeAuthorizationMessage",
Request: type = struct {
encoded_message: []const u8,
},
Response: type = struct {
decoded_message: []const u8,
},
ServiceError: type = error{InvalidAuthorizationMessage},
} = .{},
get_access_key_info: struct {
action_name: []const u8 = "GetAccessKeyInfo",
Request: type = struct {
access_key_id: []const u8,
},
Response: type = struct {
account: []const u8,
},
} = .{},
get_caller_identity: struct {
action_name: []const u8 = "GetCallerIdentity",
Request: type = struct {
pub fn metaInfo(self: @This()) struct { service: @TypeOf(sts), action: @TypeOf(sts.get_caller_identity) } {
return .{ .service = sts, .action = sts.get_caller_identity };
}
},
Response: type = struct {
user_id: []const u8,
arn: []const u8,
account: []const u8,
},
} = .{},
get_federation_token: struct {
action_name: []const u8 = "GetFederationToken",
Request: type = struct {
policy_arns: ?[]struct {
arn: ?[]const u8 = null,
} = null,
name: []const u8,
tags: ?[]struct {
value: []const u8,
key: []const u8,
} = null,
duration_seconds: ?i64 = null,
policy: ?[]const u8 = null,
},
Response: type = struct {
credentials: struct {
access_key_id: []const u8,
secret_access_key: []const u8,
session_token: []const u8,
expiration: i64,
},
federated_user: struct {
arn: []const u8,
federated_user_id: []const u8,
},
packed_policy_size: i64,
},
ServiceError: type = error{
MalformedPolicyDocument,
PackedPolicyTooLarge,
RegionDisabled,
},
} = .{},
get_session_token: struct {
action_name: []const u8 = "GetSessionToken",
Request: type = struct {
duration_seconds: ?i64 = null,
serial_number: ?[]const u8 = null,
token_code: ?[]const u8 = null,
},
Response: type = struct {
credentials: struct {
access_key_id: []const u8,
secret_access_key: []const u8,
session_token: []const u8,
expiration: i64,
},
},
ServiceError: type = error{RegionDisabled},
} = .{},
} = .{}; // end of service: sts

View File

@ -1,17 +0,0 @@
const std = @import("std");
pub fn build(b: *std.build.Builder) void {
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const lib = b.addStaticLibrary("smithy", "src/smithy.zig");
lib.setBuildMode(mode);
lib.install();
var main_tests = b.addTest("src/smithy.zig");
main_tests.setBuildMode(mode);
const test_step = b.step("test", "Run library tests");
test_step.dependOn(&main_tests.step);
}

View File

@ -45,6 +45,7 @@ pub const Aws = struct {
const meta_info = request.metaInfo();
const service = meta_info.service;
const action = meta_info.action;
const R = Response(request);
log.debug("call: prefix {s}, sigv4 {s}, version {s}, action {s}", .{
service.endpoint_prefix,

View File

@ -103,7 +103,7 @@ const EndPoint = struct {
}
};
fn cInit(_: *std.mem.Allocator) void {
fn cInit(allocator: *std.mem.Allocator) void {
// TODO: what happens if we actually get an allocator?
httplog.debug("auth init", .{});
c_allocator = c.aws_default_allocator();
@ -121,7 +121,7 @@ fn cInit(_: *std.mem.Allocator) void {
// .level = .AWS_LL_INFO,
// .level = .AWS_LL_DEBUG,
// .level = .AWS_LL_TRACE,
.level = 1, //.AWS_LL_FATAL, // https://github.com/awslabs/aws-c-common/blob/057746b2e094f4b7a31743d8ba5a9fd0155f69f3/include/aws/common/logging.h#L33
.level = .AWS_LL_FATAL,
.file = c.get_std_err(),
.filename = null,
};
@ -143,7 +143,7 @@ fn cDeinit() void { // probably the wrong name
c.aws_tls_ctx_release(ctx);
httplog.debug("tls_ctx deinit end", .{});
}
if (tls_ctx_options != null) {
if (tls_ctx_options) |opts| {
// See:
// https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/source/tls_channel_handler.c#L25
//
@ -311,13 +311,10 @@ pub const AwsHttp = struct {
// tls_connection_options = try self.setupTls(host);
if (tls_ctx_options == null) {
httplog.debug("Setting up tls options", .{});
// Language change - translate_c no longer translates c enums
// to zig enums as there were too many edge cases:
// https://github.com/ziglang/zig/issues/2115#issuecomment-827968279
var opts: c.aws_tls_ctx_options = .{
.allocator = c_allocator,
.minimum_tls_version = 128, // @intToEnum(c.aws_tls_versions, c.AWS_IO_TLS_VER_SYS_DEFAULTS), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/tls_channel_handler.h#L21
.cipher_pref = 0, // @intToEnum(c.aws_tls_cipher_pref, c.AWS_IO_TLS_CIPHER_PREF_SYSTEM_DEFAULT), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/tls_channel_handler.h#L25
.minimum_tls_version = @intToEnum(c.aws_tls_versions, c.AWS_IO_TLS_VER_SYS_DEFAULTS),
.cipher_pref = @intToEnum(c.aws_tls_cipher_pref, c.AWS_IO_TLS_CIPHER_PREF_SYSTEM_DEFAULT),
.ca_file = c.aws_byte_buf_from_c_str(""),
.ca_path = c.aws_string_new_from_c_str(c_allocator, ""),
.alpn_list = null,
@ -364,8 +361,8 @@ pub const AwsHttp = struct {
}
if (signing_options) |opts| try self.signRequest(http_request.?, opts);
const socket_options = c.aws_socket_options{
.type = 0, // @intToEnum(c.aws_socket_type, c.AWS_SOCKET_STREAM), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/socket.h#L24
.domain = 0, // @intToEnum(c.aws_socket_domain, c.AWS_SOCKET_IPV4), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/socket.h#L12
.type = @intToEnum(c.aws_socket_type, c.AWS_SOCKET_STREAM),
.domain = @intToEnum(c.aws_socket_domain, c.AWS_SOCKET_IPV4),
.connect_timeout_ms = 3000, // TODO: change hardcoded 3s value
.keep_alive_timeout_sec = 0,
.keepalive = false,
@ -475,13 +472,13 @@ pub const AwsHttp = struct {
// TODO: Re-encapsulate or delete this function. It is not currently
// used and will not be touched by the compiler
fn setupTls(_: Self, host: []const u8) !*c.aws_tls_connection_options {
fn setupTls(self: Self, host: []const u8) !*c.aws_tls_connection_options {
if (tls_ctx_options == null) {
httplog.debug("Setting up tls options", .{});
var opts: c.aws_tls_ctx_options = .{
.allocator = c_allocator,
.minimum_tls_version = 128, // @intToEnum(c.aws_tls_versions, c.AWS_IO_TLS_VER_SYS_DEFAULTS), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/tls_channel_handler.h#L21
.cipher_pref = 0, // @intToEnum(c.aws_tls_cipher_pref, c.AWS_IO_TLS_CIPHER_PREF_SYSTEM_DEFAULT), // https://github.com/awslabs/aws-c-io/blob/6c7bae503961545c5e99c6c836c4b37749cfc4ad/include/aws/io/tls_channel_handler.h#L25
.minimum_tls_version = @intToEnum(c.aws_tls_versions, c.AWS_IO_TLS_VER_SYS_DEFAULTS),
.cipher_pref = @intToEnum(c.aws_tls_cipher_pref, c.AWS_IO_TLS_CIPHER_PREF_SYSTEM_DEFAULT),
.ca_file = c.aws_byte_buf_from_c_str(""),
.ca_path = c.aws_string_new_from_c_str(c_allocator, ""),
.alpn_list = null,
@ -556,9 +553,9 @@ pub const AwsHttp = struct {
const signing_service = try std.fmt.allocPrintZ(self.allocator, "{s}", .{options.service});
defer self.allocator.free(signing_service);
const temp_signing_config = c.bitfield_workaround_aws_signing_config_aws{
.algorithm = 0, // .AWS_SIGNING_ALGORITHM_V4, // https://github.com/awslabs/aws-c-auth/blob/ace1311f8ef6ea890b26dd376031bed2721648eb/include/aws/auth/signing_config.h#L38
.config_type = 1, // .AWS_SIGNING_CONFIG_AWS, // https://github.com/awslabs/aws-c-auth/blob/ace1311f8ef6ea890b26dd376031bed2721648eb/include/aws/auth/signing_config.h#L24
.signature_type = 0, // .AWS_ST_HTTP_REQUEST_HEADERS, // https://github.com/awslabs/aws-c-auth/blob/ace1311f8ef6ea890b26dd376031bed2721648eb/include/aws/auth/signing_config.h#L49
.algorithm = .AWS_SIGNING_ALGORITHM_V4,
.config_type = .AWS_SIGNING_CONFIG_AWS,
.signature_type = .AWS_ST_HTTP_REQUEST_HEADERS,
.region = c.aws_byte_cursor_from_c_str(@ptrCast([*c]const u8, signing_region)),
.service = c.aws_byte_cursor_from_c_str(@ptrCast([*c]const u8, signing_service)),
.should_sign_header = null,
@ -569,7 +566,7 @@ pub const AwsHttp = struct {
.omit_session_token = 1,
},
.signed_body_value = c.aws_byte_cursor_from_c_str(""),
.signed_body_header = 1, // .AWS_SBHT_X_AMZ_CONTENT_SHA256, //or 0 = AWS_SBHT_NONE // https://github.com/awslabs/aws-c-auth/blob/ace1311f8ef6ea890b26dd376031bed2721648eb/include/aws/auth/signing_config.h#L131
.signed_body_header = .AWS_SBHT_X_AMZ_CONTENT_SHA256, //or AWS_SBHT_NONE
.credentials = creds,
.credentials_provider = self.credentialsProvider,
.expiration_in_seconds = 0,
@ -604,7 +601,7 @@ pub const AwsHttp = struct {
async_result.count += 1;
async_result.result.error_code = error_code;
if (result != null) {
if (result) |res| {
if (c.aws_apply_signing_result_to_http_request(http_request, c_allocator, result) != c.AWS_OP_SUCCESS) {
httplog.alert("Could not apply signing request to http request: {s}", .{c.aws_error_debug_str(c.aws_last_error())});
}
@ -619,7 +616,7 @@ pub const AwsHttp = struct {
const accept_header = c.aws_http_header{
.name = c.aws_byte_cursor_from_c_str("Accept"),
.value = c.aws_byte_cursor_from_c_str("application/json"),
.compression = 0, // .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE, // https://github.com/awslabs/aws-c-http/blob/ec42882310900f2b414b279fc24636ba4653f285/include/aws/http/request_response.h#L37
.compression = .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
};
if (c.aws_http_message_add_header(request, accept_header) != c.AWS_OP_SUCCESS)
return AwsError.AddHeaderError;
@ -627,7 +624,7 @@ pub const AwsHttp = struct {
const host_header = c.aws_http_header{
.name = c.aws_byte_cursor_from_c_str("Host"),
.value = c.aws_byte_cursor_from_c_str(@ptrCast([*c]const u8, host)),
.compression = 0, // .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
.compression = .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
};
if (c.aws_http_message_add_header(request, host_header) != c.AWS_OP_SUCCESS)
return AwsError.AddHeaderError;
@ -635,7 +632,7 @@ pub const AwsHttp = struct {
const user_agent_header = c.aws_http_header{
.name = c.aws_byte_cursor_from_c_str("User-Agent"),
.value = c.aws_byte_cursor_from_c_str("zig-aws 1.0, Powered by the AWS Common Runtime."),
.compression = 0, // .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
.compression = .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
};
if (c.aws_http_message_add_header(request, user_agent_header) != c.AWS_OP_SUCCESS)
return AwsError.AddHeaderError;
@ -657,7 +654,7 @@ pub const AwsHttp = struct {
const content_type_header = c.aws_http_header{
.name = c.aws_byte_cursor_from_c_str("Content-Type"),
.value = c.aws_byte_cursor_from_c_str("application/x-www-form-urlencoded"),
.compression = 0, // .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
.compression = .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
};
if (c.aws_http_message_add_header(request, content_type_header) != c.AWS_OP_SUCCESS)
return AwsError.AddHeaderError;
@ -669,7 +666,7 @@ pub const AwsHttp = struct {
const content_length_header = c.aws_http_header{
.name = c.aws_byte_cursor_from_c_str("Content-Length"),
.value = c.aws_byte_cursor_from_c_str(@ptrCast([*c]const u8, len)),
.compression = 0, // .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
.compression = .AWS_HTTP_HEADER_COMPRESSION_USE_CACHE,
};
if (c.aws_http_message_add_header(request, content_length_header) != c.AWS_OP_SUCCESS)
return AwsError.AddHeaderError;
@ -688,13 +685,12 @@ pub const AwsHttp = struct {
httplog.debug("connection setup callback end", .{});
}
fn connectionShutdownCallback(connection: ?*c.aws_http_connection, error_code: c_int, _: ?*c_void) callconv(.C) void {
// ^^ error_code ^^ user_data
httplog.debug("connection shutdown callback start ({*}). error_code: {d}", .{ connection, error_code });
fn connectionShutdownCallback(connection: ?*c.aws_http_connection, error_code: c_int, user_data: ?*c_void) callconv(.C) void {
httplog.debug("connection shutdown callback start", .{});
httplog.debug("connection shutdown callback end", .{});
}
fn incomingHeadersCallback(stream: ?*c.aws_http_stream, _: c.aws_http_header_block, headers: [*c]const c.aws_http_header, num_headers: usize, user_data: ?*c_void) callconv(.C) c_int {
fn incomingHeadersCallback(stream: ?*c.aws_http_stream, header_block: c.aws_http_header_block, headers: [*c]const c.aws_http_header, num_headers: usize, user_data: ?*c_void) callconv(.C) c_int {
var context = userDataTo(RequestContext, user_data);
if (context.response_code == null) {
@ -716,7 +712,7 @@ pub const AwsHttp = struct {
}
return c.AWS_OP_SUCCESS;
}
fn incomingBodyCallback(_: ?*c.aws_http_stream, data: [*c]const c.aws_byte_cursor, user_data: ?*c_void) callconv(.C) c_int {
fn incomingBodyCallback(stream: ?*c.aws_http_stream, data: [*c]const c.aws_byte_cursor, user_data: ?*c_void) callconv(.C) c_int {
var context = userDataTo(RequestContext, user_data);
httplog.debug("inbound body, len {d}", .{data.*.len});
@ -727,8 +723,7 @@ pub const AwsHttp = struct {
httplog.alert("could not append to body!", .{});
return c.AWS_OP_SUCCESS;
}
fn requestCompleteCallback(stream: ?*c.aws_http_stream, _: c_int, user_data: ?*c_void) callconv(.C) void {
// ^^ error_code
fn requestCompleteCallback(stream: ?*c.aws_http_stream, error_code: c_int, user_data: ?*c_void) callconv(.C) void {
var context = userDataTo(RequestContext, user_data);
context.request_complete.store(true, .SeqCst);
c.aws_http_stream_release(stream);
@ -740,9 +735,8 @@ pub const AwsHttp = struct {
var callback_results = AsyncResult(AwsAsyncCallbackResult(c.aws_credentials)){ .result = &credential_result };
const callback = awsAsyncCallbackResult(c.aws_credentials, "got credentials", assignCredentialsOnCallback);
// const get_async_result =
_ = c.aws_credentials_provider_get_credentials(self.credentialsProvider, callback, &callback_results);
// TODO: do we care about the return value from get_creds?
const get_async_result =
c.aws_credentials_provider_get_credentials(self.credentialsProvider, callback, &callback_results);
waitOnCallback(c.aws_credentials, &callback_results);
if (credential_result.error_code != c.AWS_ERROR_SUCCESS) {

28
src/codegen/build.zig Normal file
View File

@ -0,0 +1,28 @@
const std = @import("std");
pub fn build(b: *std.build.Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("codegen", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.override_dest_dir = .{ .Custom = ".." };
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

Some files were not shown because too many files have changed in this diff Show More