I’m using the std.http.Headers
to represent headers in a received request where there will be at least a signature entry expected. When I isolated the panic, at first I wondered whether it was related to my target. However, I can see it reproduce on both linux-aarch64 and FreeBSD (x86). How do I correct the alignment for the map in the headers?
Here is the main.zig and build.zig where issuing zig build test
causes the panic:
////main.zig
const std = @import(“std”);
const testing = std.testing;
const Allocator = std.mem.Allocator;export fn add(a: i32, b: i32) i32 {
return a + b;
}test “basic add functionality” {
try testing.expect(add(3, 7) == 10);
}test "headers contains " {
const ally = std.testing.allocator;
var raw = try minRawHeaders(ally);
raw.deinit();// show headers //var w = std.ArrayList(u8).init(ally); //defer w.deinit(); //raw.format("{s}", .{}, w.writer()) catch @panic("headers fmt"); //std.debug.print("\nh {s}", .{w.items}); try testing.expect(raw.contains("signature"));
}
// simulate raw header fields
fn minRawHeaders(ally: Allocator) !std.http.Headers {
var h2 = std.http.Headers.init(ally);
try h2.append(“host”, “example.com” ) ;
try h2.append(“date”, “Sun, 05 Jan 2014 21:31:40 GMT” ) ;
try h2.append(“content-type”, “application/json” ) ;
try h2.append(“digest”, “SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=” ) ;
try h2.append(“content-length”, “18” ) ;try h2.append("signature", "keyId=\x22Test\x22,algorithm=\x22rsa-sha256\x22,headers=\x22(request-target) host date\x22,signature=\x22qdx+H7PHHDZgy4y/Ahn9Tny9V3GP6YgBPyUXMmoxWtLbHpUnXS2mg2+SbrQDMCJypxBLSPQR2aAjn7ndmw2iicw3HMbe8VfEdKFYRqzic+efkb3nndiv/x1xSHDJWeSWkx3ButlYSuBskLu6kd9Fswtemr3lgdDEmn04swr2Os0=\x22", ) ; return h2;
}
////build.zig
const std = @import(“std”);
// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
// Standard target options allows the person runningzig 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 optimization options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); const lib = b.addStaticLibrary(.{ .name = "learn-headers", // In this case the main source file is merely a path, however, in more // complicated build scripts, this could be a generated file. .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); // This declares intent for the library to be installed into the standard // location when the user invokes the "install" step (the default step when // running `zig build`). b.installArtifact(lib); // Creates a step for unit testing. This only builds the test executable // but does not run it. const main_tests = b.addTest(.{ .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); const run_main_tests = b.addRunArtifact(main_tests); // This creates a build step. It will be visible in the `zig build --help` menu, // and can be selected like this: `zig build test` // This will evaluate the `test` step rather than the default, which is "install". const test_step = b.step("test", "Run library tests"); test_step.dependOn(&run_main_tests.step);
}