diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-04-06 21:32:41 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-04-06 21:33:00 -0400 |
commit | 0f4a7c9bcd613aaced968f9b23a830e6c3c04f6f (patch) | |
tree | ecfd1188ddc84d24812ac7d1b4b61fb80373629a /src | |
parent | 2302e6930d7c5814b8bbaf3a63f68e0a8562d0d1 (diff) |
we know the size (assuming the len is correct) so we can preallocate the whole array
Diffstat (limited to 'src')
-rw-r--r-- | src/saprus_message.zig | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/saprus_message.zig b/src/saprus_message.zig index 19ed58d..3d47f66 100644 --- a/src/saprus_message.zig +++ b/src/saprus_message.zig @@ -117,12 +117,12 @@ pub const SaprusMessage = union(SaprusPacketType) { fn fromBytesAux( comptime packet: SaprusPacketType, + len: u16, r: std.io.FixedBufferStream([]const u8).Reader, allocator: Allocator, ) !SaprusMessage { const Header = @field(@FieldType(SaprusMessage, @tagName(packet)), "Header"); - // Read the length of the header + base64 encoded payload. - const len = try r.readInt(u16, .big); + // Read the header for the current message type. var header_bytes: [@sizeOf(Header)]u8 = undefined; _ = try r.read(header_bytes[0 .. @bitSizeOf(Header) / 8]); @@ -130,13 +130,13 @@ pub const SaprusMessage = union(SaprusPacketType) { const header = try header_stream.reader().readStructEndian(Header, .big); // Read the base64 bytes into a list to be able to call the decoder on it. - var payload_buf = std.ArrayList(u8).init(allocator); - defer payload_buf.deinit(); - try r.readAllArrayList(&payload_buf, len); + const payload_buf = try allocator.alloc(u8, len - @bitSizeOf(Header) / 8); + defer allocator.free(payload_buf); + _ = try r.readAll(payload_buf); // Create a buffer to store the payload in, and decode the base64 bytes into the payload field. - const payload = try allocator.alloc(u8, try base64Dec.calcSizeForSlice(payload_buf.items)); - try base64Dec.decode(payload, payload_buf.items); + const payload = try allocator.alloc(u8, try base64Dec.calcSizeForSlice(payload_buf)); + try base64Dec.decode(payload, payload_buf); // Return the type of SaprusMessage specified by the `packet` argument. return @unionInit(SaprusMessage, @tagName(packet), .{ @@ -153,9 +153,12 @@ pub const SaprusMessage = union(SaprusPacketType) { // Read packet type const packet_type = @as(SaprusPacketType, @enumFromInt(try r.readInt(u16, .big))); + // Read the length of the header + base64 encoded payload. + const len = try r.readInt(u16, .big); + switch (packet_type) { - .relay => return fromBytesAux(.relay, r, allocator), - .connection => return fromBytesAux(.connection, r, allocator), + .relay => return fromBytesAux(.relay, len, r, allocator), + .connection => return fromBytesAux(.connection, len, r, allocator), .file_transfer => return SaprusError.NotImplementedSaprusType, else => return SaprusError.UnknownSaprusType, } |