diff --git a/src/jetzig/middleware.zig b/src/jetzig/middleware.zig index 89b27a6..f392dde 100644 --- a/src/jetzig/middleware.zig +++ b/src/jetzig/middleware.zig @@ -2,6 +2,7 @@ const std = @import("std"); const jetzig = @import("../jetzig.zig"); pub const HtmxMiddleware = @import("middleware/HtmxMiddleware.zig"); +pub const GzipMiddleware = @import("middleware/Gzip.zig"); const RouteOptions = struct { content: ?[]const u8 = null, diff --git a/src/jetzig/middleware/Gzip.zig b/src/jetzig/middleware/Gzip.zig new file mode 100644 index 0000000..9f2bacb --- /dev/null +++ b/src/jetzig/middleware/Gzip.zig @@ -0,0 +1,13 @@ +const std = @import("std"); +const jetzig = @import("jetzig"); + +const err_msg = "Response was not compressed due to error: {s}"; +pub fn beforeResponse(request: *jetzig.http.Request, response: *jetzig.http.Response) !void { + var compressed = std.ArrayList(u8).init(request.allocator); + var reader = std.io.fixedBufferStream(response.content); + std.compress.gzip.compress(reader.reader(), compressed.writer(), .{ .level = .fast }) catch |err| + return request.server.logger.ERROR(err_msg, .{@errorName(err)}); + response.headers.append("Content-Encoding", "gzip") catch |err| + return request.server.logger.ERROR(err_msg, .{@errorName(err)}); + response.content = compressed.items; +}