From 90eb7ea55a17eee3d18688610a5b120cb849e39b Mon Sep 17 00:00:00 2001 From: Madeorsk Date: Sat, 12 Apr 2025 12:15:37 +0200 Subject: [PATCH] Support zig 0.14.0 and zap 0.10.1, fix memory management issue. --- src/route.zig | 32 ++++++++++++++++++++------------ src/router.zig | 12 ++++++------ tests/simple_routes.zig | 3 +-- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/route.zig b/src/route.zig index 0ece35b..8aba123 100644 --- a/src/route.zig +++ b/src/route.zig @@ -28,8 +28,16 @@ pub const RoutingResult = struct { // Move bytes from the end to the beginning of the buffer. std.mem.copyForwards(u8, buffer[0..(decodedValue.len)], buffer[(buffer.len - decodedValue.len)..]); // Resize the buffer to free remaining bytes. - _ = self.allocator.resize(buffer, decodedValue.len); - buffer = buffer[0..decodedValue.len]; + if (self.allocator.resize(buffer, decodedValue.len)) + { // The buffer could have been resized, change variable length. + buffer = buffer[0..decodedValue.len]; + } + else + { // Could not resize the buffer, allocate a new one and free the old one. + const originalBuffer = buffer; + defer self.allocator.free(originalBuffer); + buffer = try self.allocator.dupe(u8, originalBuffer[0..decodedValue.len]); + } // Add value to params. try self.params.put(try self.allocator.dupe(u8, key), buffer); @@ -219,17 +227,17 @@ pub const RouteNode = struct { } /// Get request handler depending on the request method. - pub fn getMethodHandler(self: Self, requestMethod: zap.Method) ?router.RouteHandler + pub fn getMethodHandler(self: Self, requestMethod: zap.http.Method) ?router.RouteHandler { if (self.handle) |handle| { // A handle object is defined, getting the right handler from it. return switch (requestMethod) { // Return the defined request handler from the request method. - zap.Method.GET => handle.get orelse handle.any, - zap.Method.POST => handle.post orelse handle.any, - zap.Method.PATCH => handle.patch orelse handle.any, - zap.Method.PUT => handle.put orelse handle.any, - zap.Method.DELETE => handle.delete orelse handle.any, + zap.http.Method.GET => handle.get orelse handle.any, + zap.http.Method.POST => handle.post orelse handle.any, + zap.http.Method.PATCH => handle.patch orelse handle.any, + zap.http.Method.PUT => handle.put orelse handle.any, + zap.http.Method.DELETE => handle.delete orelse handle.any, else => handle.any, }; } @@ -272,7 +280,7 @@ pub const RouteNode = struct { /// Try to find a matching handler in the current route for the given path. /// Return true when a route is matching the request correctly. - pub fn match(self: *Self, requestMethod: zap.Method, path: *std.mem.SplitIterator(u8, std.mem.DelimiterType.scalar), result: *RoutingResult) !bool + pub fn match(self: *Self, requestMethod: zap.http.Method, path: *std.mem.SplitIterator(u8, std.mem.DelimiterType.scalar), result: *RoutingResult) !bool { // Add pre, post, error and not found handlers, if defined. try self.addHandlers(result); @@ -280,9 +288,9 @@ pub const RouteNode = struct { if (path.next()) |nextPath| { // Trying to follow the path by finding a matching children. if (self.staticChildren.get(nextPath)) |child| - { // There is a matching static child, continue to match the path on it. - return try child.match(requestMethod, path, result); - } + { // There is a matching static child, continue to match the path on it. + return try child.match(requestMethod, path, result); + } const currentIndex = path.index; // No matching static child, trying dynamic children. diff --git a/src/router.zig b/src/router.zig index 4e825c9..60a8fa0 100644 --- a/src/router.zig +++ b/src/router.zig @@ -99,7 +99,7 @@ pub const Router = struct { var errorHandlersIterator = std.mem.reverseIterator(routingResult.errorHandlers.items); while (errorHandlersIterator.next()) |errorHandler| { // For each error handler, try to run it with the given error. - errorHandler(.{ + errorHandler(MatchedRoute{ .route = routingResult.route, .params = routingResult.params, }, request, err) catch { @@ -121,12 +121,12 @@ pub const Router = struct { self.root.handleError.?(.{}, request, err) catch {}; return; }; + defer routingResult.deinit(); // Matching the requested route. Put the result in routingResult pointer. _ = self.root.match(request.methodAsEnum(), &path, routingResult) catch |err| { Self.handleError(request, err, routingResult); return; }; - defer routingResult.deinit(); // Try to run matched route handling. Self.runMatchedRouteHandling(routingResult, request) @@ -138,7 +138,7 @@ pub const Router = struct { fn runMatchedRouteHandling(routingResult: *routeManager.RoutingResult, request: zap.Request) !void { // Initialized route data passed to handlers from the routing result. - const routeData = .{ + const routeData = MatchedRoute{ .route = routingResult.route, .params = routingResult.params, }; @@ -165,7 +165,7 @@ pub const Router = struct { } /// The on_request function of the HTTP listener. - pub fn onRequest(request: zap.Request) void + pub fn onRequest(request: zap.Request) anyerror!void { // Call handle of the current router instance. routerInstance.handle(request); @@ -182,7 +182,7 @@ fn impossible(_: MatchedRoute, _: zap.Request) !void fn defaultNotFoundHandler(_: MatchedRoute, request: zap.Request) !void { try request.setContentType(zap.ContentType.TEXT); - request.setStatus(zap.StatusCode.not_found); + request.setStatus(zap.http.StatusCode.not_found); try request.sendBody("404: Not Found"); } @@ -190,6 +190,6 @@ fn defaultNotFoundHandler(_: MatchedRoute, request: zap.Request) !void fn defaultErrorHandler(_: MatchedRoute, request: zap.Request, _: anyerror) !void { try request.setContentType(zap.ContentType.TEXT); - request.setStatus(zap.StatusCode.internal_server_error); + request.setStatus(zap.http.StatusCode.internal_server_error); try request.sendBody("500: Internal Server Error"); } diff --git a/tests/simple_routes.zig b/tests/simple_routes.zig index 0234fe6..344ea67 100644 --- a/tests/simple_routes.zig +++ b/tests/simple_routes.zig @@ -127,11 +127,10 @@ fn runHttp() !void { var listener = zap.HttpListener.init(.{ .interface = "127.0.0.1", .port = 8112, - .log = false, + .log = true, // Add zouter to the listener. .on_request = zouter.Router.onRequest, }); - zap.enableDebugLog(); try listener.listen(); const notFoundThread = try makeRequestThread(allocator, std.http.Method.GET, "http://127.0.0.1:8112/notfound/query", ¬FoundResponse);