fix: undefined behaviour for responses with no body
This commit is contained in:
parent
0ac10d5798
commit
dc05b20bda
1 changed files with 22 additions and 3 deletions
25
src/aws.zig
25
src/aws.zig
|
@ -493,7 +493,8 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
// First, we need to determine if we care about a response at all
|
// First, we need to determine if we care about a response at all
|
||||||
// If the expected result has no fields, there's no sense in
|
// If the expected result has no fields, there's no sense in
|
||||||
// doing any more work. Let's bail early
|
// doing any more work. Let's bail early
|
||||||
comptime var expected_body_field_len = std.meta.fields(action.Response).len;
|
const fields = @typeInfo(action.Response).@"struct".fields;
|
||||||
|
var expected_body_field_len = fields.len;
|
||||||
|
|
||||||
if (@hasDecl(action.Response, "http_header")) {
|
if (@hasDecl(action.Response, "http_header")) {
|
||||||
expected_body_field_len -= std.meta.fields(@TypeOf(action.Response.http_header)).len;
|
expected_body_field_len -= std.meta.fields(@TypeOf(action.Response.http_header)).len;
|
||||||
|
@ -525,15 +526,33 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't care about the body if there are no fields we expect there...
|
// We don't care about the body if there are no fields we expect there...
|
||||||
if (std.meta.fields(action.Response).len == 0 or expected_body_field_len == 0 or response.body.len == 0) {
|
if (fields.len == 0 or expected_body_field_len == 0 or response.body.len == 0) {
|
||||||
|
// Makes sure we can't get here with an `action.Response` that has required fields
|
||||||
|
// Without this block there is a compilation error when running tests
|
||||||
|
// Perhaps there is a better way to handle this
|
||||||
|
{
|
||||||
|
comptime var required_fields = 0;
|
||||||
|
|
||||||
|
inline for (fields) |field| {
|
||||||
|
const field_type_info = @typeInfo(field.type);
|
||||||
|
if (field_type_info != .optional and field.defaultValue() == null) {
|
||||||
|
required_fields += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (required_fields > 0) unreachable;
|
||||||
|
}
|
||||||
|
|
||||||
// Do we care if an unexpected body comes in?
|
// Do we care if an unexpected body comes in?
|
||||||
return try FullResponseType.init(.{
|
return try FullResponseType.init(.{
|
||||||
.arena = arena,
|
.arena = arena,
|
||||||
.request_id = request_id,
|
.request_id = request_id,
|
||||||
|
.response = .{},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return switch (try getContentType(response.headers)) {
|
const content_type = try getContentType(response.headers);
|
||||||
|
return switch (content_type) {
|
||||||
.json => try jsonReturn(aws_request, options, response),
|
.json => try jsonReturn(aws_request, options, response),
|
||||||
.xml => try xmlReturn(aws_request, options, response),
|
.xml => try xmlReturn(aws_request, options, response),
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue