From 737691581ae458c8855fe7f1b23f055c4cebeadf Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 9 Jan 2024 11:57:48 +0100 Subject: [PATCH] added setContentTypeFromFilename thx @hauleth. --- examples/hello_json/hello_json.zig | 1 + src/zap.zig | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/examples/hello_json/hello_json.zig b/examples/hello_json/hello_json.zig index 329f7d4..6de3aba 100644 --- a/examples/hello_json/hello_json.zig +++ b/examples/hello_json/hello_json.zig @@ -27,6 +27,7 @@ fn on_request(r: zap.SimpleRequest) void { } std.debug.print("<< json: {s}\n", .{json_to_send}); r.setContentType(.JSON) catch return; + r.setContentTypeFromFilename("test.json") catch return; r.sendBody(json_to_send) catch return; } } diff --git a/src/zap.zig b/src/zap.zig index 95aba96..1a30e76 100644 --- a/src/zap.zig +++ b/src/zap.zig @@ -204,6 +204,7 @@ pub const SimpleRequest = struct { return self.setHeader("content-type", s); } + /// Tries to determine the content type by file extension of request path, and sets it. pub fn setContentTypeFromPath(self: *const Self) !void { const t = fio.http_mimetype_find2(self.h.*.path); if (fio.is_invalid(t) == 1) return error.HttpSetContentType; @@ -215,6 +216,26 @@ pub const SimpleRequest = struct { if (ret == -1) return error.HttpSetContentType; } + /// Tries to determine the content type by filename extension, and sets it. + /// If the extension cannot be determined, NoExtensionInFilename error is + /// returned. + pub fn setContentTypeFromFilename(self: *const Self, filename: []const u8) !void { + const ext = std.fs.path.extension(filename); + + if (ext.len > 1) { + var e = ext[1..]; + var obj = fio.http_mimetype_find(@constCast(e.ptr), e.len); + + if (util.fio2str(obj)) |mime_str| { + try self.setHeader("content-type", mime_str); + } + } else { + return error.NoExtensionInFilename; + } + } + + /// Returns the header value of given key name. Returned mem is temp. + /// Do not free it. pub fn getHeader(self: *const Self, name: []const u8) ?[]const u8 { const hname = fio.fiobj_str_new(util.toCharPtr(name), name.len); defer fio.fiobj_free_wrapped(hname);