From 5a09d7c3e9908c4a503e5daaaef3b605e975e49f Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Thu, 20 Jan 2022 03:18:02 -0800 Subject: [PATCH] zig/handler- add helpers to gracefully handle invalid paths --- src/handler/_internal.zig | 21 +++++++++++++++++++-- src/handler/package.zig | 14 +++++++------- src/handler/user.zig | 10 +++++----- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/handler/_internal.zig b/src/handler/_internal.zig index 1653d57..4cc9f00 100644 --- a/src/handler/_internal.zig +++ b/src/handler/_internal.zig @@ -138,8 +138,7 @@ pub fn fileList(alloc: std.mem.Allocator, path: string) ![]const string { pub fn assert(cond: bool, response: *http.Response, comptime fmt: string, args: anytype) !void { if (!cond) { - try response.writer().print(fmt, args); - return error.HttpNoOp; + return fail(response, fmt, args); } } @@ -147,3 +146,21 @@ pub fn fail(response: *http.Response, comptime fmt: string, args: anytype) (http try response.writer().print(fmt, args); return error.HttpNoOp; } + +pub fn reqRemote(request: http.Request, response: *http.Response, id: u64) !db.Remote { + const alloc = request.arena; + const r = try db.Remote.byKey(alloc, .id, id); + return r orelse fail(response, "error: remote by id '{d}' not found\n", .{id}); +} + +pub fn reqUser(request: http.Request, response: *http.Response, r: db.Remote, name: string) !db.User { + const alloc = request.arena; + const u = try r.findUserBy(alloc, .name, name); + return u orelse fail(response, "error: user by name '{s}' not found\n", .{name}); +} + +pub fn reqPackage(request: http.Request, response: *http.Response, u: db.User, name: string) !db.Package { + const alloc = request.arena; + const p = try u.findPackageBy(alloc, .name, name); + return p orelse fail(response, "error: package by name '{s}' not found\n", .{name}); +} diff --git a/src/handler/package.zig b/src/handler/package.zig index c997c91..bddcd1c 100644 --- a/src/handler/package.zig +++ b/src/handler/package.zig @@ -9,17 +9,17 @@ const _internal = @import("./_internal.zig"); pub fn get(_: void, response: *http.Response, request: http.Request, args: struct { remote: u64, user: string, package: string }) !void { const alloc = request.arena; const u = try _internal.getUserOp(response, request); - const r = try db.Remote.byKey(alloc, .id, args.remote); - const o = try r.?.findUserBy(alloc, .name, args.user); - const p = try o.?.findPackageBy(alloc, .name, args.package); - const v = try p.?.versions(alloc); + const r = try _internal.reqRemote(request, response, args.remote); + const o = try _internal.reqUser(request, response, r, args.user); + const p = try _internal.reqPackage(request, response, o, args.package); + const v = try p.versions(alloc); try _internal.writePageResponse(alloc, response, request, "/package.pek", .{ .aquila_version = @import("root").version, .user = u, - .repo = r.?, - .owner = o.?, - .pkg = p.?, + .repo = r, + .owner = o, + .pkg = p, .versions = v, }); } diff --git a/src/handler/user.zig b/src/handler/user.zig index 560bca3..1283a92 100644 --- a/src/handler/user.zig +++ b/src/handler/user.zig @@ -9,15 +9,15 @@ const _internal = @import("./_internal.zig"); pub fn get(_: void, response: *http.Response, request: http.Request, args: struct { remote: u64, user: string }) !void { const alloc = request.arena; const u = try _internal.getUserOp(response, request); - const r = try db.Remote.byKey(alloc, .id, args.remote); - const o = try r.?.findUserBy(alloc, .name, args.user); - const p = try o.?.packages(alloc); + const r = try _internal.reqRemote(request, response, args.remote); + const o = try _internal.reqUser(request, response, r, args.user); + const p = try o.packages(alloc); try _internal.writePageResponse(alloc, response, request, "/user.pek", .{ .aquila_version = @import("root").version, .user = u, - .repo = r.?, - .owner = o.?, + .repo = r, + .owner = o, .pkgs = p, }); }