Skip to content

Jcho114/personal-http-zig

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Practice Project Http Server In Zig

This is a side project for my own learning. If you really want me to be real, I would say to not use it. What I have at the moment is very likely to change.

Usage

const std = @import("std");
const http = @import("http");
const JsonObject = http.JsonObject;

pub fn rootHandler(request: *http.Request, response: *http.Response) !void {
    response.status(200);
    response.send(request.target);
}

pub fn testGetHandler(_: *http.Request, response: *http.Response) !void {
    const object = try JsonObject.init(response.allocator);
    defer object.deinit();
    try object.put(.string, "message", "test get handler");
    response.status(200);
    try response.jsonObject(object);
}

pub fn testParamHandler(request: *http.Request, response: *http.Response) !void {
    response.status(200);
    response.send(request.param("param") orelse "unknown");
}

pub fn testJsonEchoHandler(request: *http.Request, response: *http.Response) !void {
    const resobj = try JsonObject.init(response.allocator);
    defer resobj.deinit();

    const reqobj = JsonObject.parse(request.body, request.allocator) catch {
        try resobj.put(.string, "message", "no json provided");
        response.status(400);
        return try response.jsonObject(resobj);
    };

    const reqmes = reqobj.get(.string, "message") catch {
        try resobj.put(.string, "message", "request json has no field message");
        response.status(400);
        return try response.jsonObject(resobj);
    };

    try resobj.put(.string, "message", reqmes);
    response.status(200);
    try response.jsonObject(resobj);
}

pub fn main() !void {
    var gpa: std.heap.GeneralPurposeAllocator(.{}) = .{};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    const options = try http.HttpServer.HttpServerOptions.default(allocator);
    var httpServer = try http.HttpServer.init(options);
    defer httpServer.deinit();

    try httpServer.route("/", rootHandler);
    try httpServer.route("GET /test", testGetHandler);
    try httpServer.route("POST /test/json", testJsonEchoHandler);
    try httpServer.route("/:param/test", testParamHandler);

    try httpServer.run();
}

About

Side project to learn more about http routing and library development

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages