From 402888423de9764c22175df4cc41d79157895f3d Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Tue, 11 Nov 2025 10:34:59 +0100 Subject: add basic server --- src/http.zig | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/http.zig (limited to 'src/http.zig') diff --git a/src/http.zig b/src/http.zig new file mode 100644 index 0000000..e8ecfcf --- /dev/null +++ b/src/http.zig @@ -0,0 +1,101 @@ +const std = @import("std"); + +pub fn respond_file( + request: *std.http.Server.Request, + file: std.fs.File, + file_name: []const u8, + allocator: std.mem.Allocator, +) !void { + const buffer = try file.readToEndAlloc(allocator, std.math.maxInt(usize)); + defer allocator.free(buffer); + + const suffix_pos = std.mem.lastIndexOfScalar(u8, file_name, '.') orelse file_name.len; + const suffix = file_name[suffix_pos..]; + std.debug.print("{s}, {}, suffix: {s}\n", .{file_name, suffix_pos, suffix}); + + try request.respond(buffer, .{ + .extra_headers = &.{ + .{ .name = "Content-Type", .value = content_types.get(suffix) orelse "text/plain" }, + } + }); +} + +pub const content_types = std.StaticStringMap([]const u8).initComptime(.{ + .{ ".aac", "audio/aac" }, + .{ ".abw", "application/x-abiword" }, + .{ ".apng", "image/apng" }, + .{ ".arc", "application/x-freearc" }, + .{ ".avif", "image/avif" }, + .{ ".avi", "video/x-msvideo" }, + .{ ".azw", "application/vnd.amazon.ebook" }, + .{ ".bin", "application/octet-stream" }, + .{ ".bmp", "image/bmp" }, + .{ ".bz", "application/x-bzip" }, + .{ ".bz2", "application/x-bzip2" }, + .{ ".cda", "application/x-cdf" }, + .{ ".csh", "application/x-csh" }, + .{ ".css", "text/css" }, + .{ ".csv", "text/csv" }, + .{ ".doc", "application/msword" }, + .{ ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, + .{ ".eot", "application/vnd.ms-fontobject" }, + .{ ".epub", "application/epub+zip" }, + .{ ".gz", "application/gzip." }, + .{ ".gif", "image/gif" }, + .{ ".htm", "text/html" }, + .{ ".html", "text/html" }, + .{ ".ico", "image/vnd.microsoft.icon" }, + .{ ".ics", "text/calendar" }, + .{ ".jar", "application/java-archive" }, + .{ ".jpeg, .jpg", "image/jpeg" }, + .{ ".js", "text/javascript" }, + .{ ".json", "application/json" }, + .{ ".jsonld", "application/ld+json" }, + .{ ".md", "text/markdown" }, + .{ ".mid, .midi", "audio/midi," }, + .{ ".mjs", "text/javascript" }, + .{ ".mp3", "audio/mpeg" }, + .{ ".mp4", "video/mp4" }, + .{ ".mpeg", "video/mpeg" }, + .{ ".mpkg", "application/vnd.apple.installer+xml" }, + .{ ".odp", "application/vnd.oasis.opendocument.presentation" }, + .{ ".ods", "application/vnd.oasis.opendocument.spreadsheet" }, + .{ ".odt", "application/vnd.oasis.opendocument.text" }, + .{ ".oga", "audio/ogg" }, + .{ ".ogv", "video/ogg" }, + .{ ".ogx", "application/ogg" }, + .{ ".opus", "audio/ogg" }, + .{ ".otf", "font/otf" }, + .{ ".png", "image/png" }, + .{ ".pdf", "application/pdf" }, + .{ ".php", "application/x-httpd-php" }, + .{ ".ppt", "application/vnd.ms-powerpoint" }, + .{ ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, + .{ ".rar", "application/vnd.rar" }, + .{ ".rtf", "application/rtf" }, + .{ ".sh", "application/x-sh" }, + .{ ".svg", "image/svg+xml" }, + .{ ".tar", "application/x-tar" }, + .{ ".tif, .tiff", "image/tiff" }, + .{ ".ts", "video/mp2t" }, + .{ ".ttf", "font/ttf" }, + .{ ".txt", "text/plain" }, + .{ ".vsd", "application/vnd.visio" }, + .{ ".wav", "audio/wav" }, + .{ ".weba", "audio/webm" }, + .{ ".webm", "video/webm" }, + .{ ".webmanifest", "application/manifest+json" }, + .{ ".webp", "image/webp" }, + .{ ".woff", "font/woff" }, + .{ ".woff2", "font/woff2" }, + .{ ".xhtml", "application/xhtml+xml" }, + .{ ".xls", "application/vnd.ms-excel" }, + .{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, + .{ ".xml", "application/xml" }, + .{ ".xul", "application/vnd.mozilla.xul+xml" }, + .{ ".zip", "application/zip." }, + .{ ".3gp", "video/3gpp;" }, + .{ ".3g2", "video/3gpp2;" }, + .{ ".7z", "application/x-7z-compressed" }, +}); + -- cgit v1.2.3-70-g09d2