Skip to content

Commit

Permalink
Fix possible dangling pointer to middleware array
Browse files Browse the repository at this point in the history
  • Loading branch information
karlseguin committed Feb 28, 2025
1 parent d2b7f75 commit eced2d8
Show file tree
Hide file tree
Showing 10 changed files with 24 additions and 22 deletions.
2 changes: 1 addition & 1 deletion examples/01_basic.zig
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

// Register routes. The last parameter is a Route Config. For these basic
// examples, we aren't using it.
Expand Down
2 changes: 1 addition & 1 deletion examples/02_handler.zig
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

// Register routes.

Expand Down
2 changes: 1 addition & 1 deletion examples/03_dispatch.zig
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

router.get("/", index, .{});
std.debug.print("listening http://localhost:{d}/\n", .{PORT});
Expand Down
2 changes: 1 addition & 1 deletion examples/04_action_context.zig
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

const restricted_route = &RouteData{ .restricted = true };

Expand Down
2 changes: 1 addition & 1 deletion examples/06_middleware.zig
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn main() !void {
// see example/middleware/Logger.zig
const logger = try server.middleware(Logger, .{ .query = true });

var router = server.router(.{});
var router = try server.router(.{});

// Apply middleware to all routes created from this point on
router.middlewares = &.{logger};
Expand Down
2 changes: 1 addition & 1 deletion examples/07_advanced_routing.zig
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

router.get("/", index, .{});

Expand Down
2 changes: 1 addition & 1 deletion examples/08_websocket.zig
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ pub fn main() !void {
// see 09_shutdown.zig for how to to break server.listen with an interrupt
defer server.stop();

var router = server.router(.{});
var router = try server.router(.{});

router.get("/", index, .{});

Expand Down
2 changes: 1 addition & 1 deletion examples/09_shutdown.zig
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub fn main() !void {
var server = try httpz.Server(void).init(allocator, .{.port = PORT}, {});
defer server.deinit();

var router = server.router(.{});
var router = try server.router(.{});
router.get("/", index, .{});

std.debug.print("listening http://localhost:{d}/\n", .{PORT});
Expand Down
10 changes: 5 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub fn main() !void {
server.deinit();
}
var router = server.router(.{});
var router = try server.router(.{});
router.get("/api/user/:id", getUser, .{});
// blocks
Expand Down Expand Up @@ -120,7 +120,7 @@ pub fn main() !void {
};
var server = try httpz.Server(*App).init(allocator, .{.port = 5882}, &app);
var router = server.router(.{});
var router = try server.router(.{});
router.get("/api/user/:id", getUser, .{});
try server.listen();
}
Expand Down Expand Up @@ -262,7 +262,7 @@ pub fn main() !void {
// overwrite the default error handler
server.errorHandler(errorHandler);
var router = server.router(.{});
var router = try server.router(.{});
// use get/post/put/head/patch/options/delete
// you can also use "all" to attach to all methods
Expand Down Expand Up @@ -659,7 +659,7 @@ You can specify a separate configuration for each route. To change the configura
```zig
var server = try httpz.Server(Handler).init(allocator, .{.port = 5882}, &handler);
var router = server.router(.{});
var router = try server.router(.{});
// Will use Handler.dispatch on the &handler instance passed to init
// No middleware
Expand Down Expand Up @@ -762,7 +762,7 @@ const cors = try server.middleware(httpz.middleware.Cors, .{
// apply this middleware to all routes (unless the route
// explicitly opts out)
var router = server.router(.{.middlewares = &.{cors}});
var router = try server.router(.{.middlewares = &.{cors}});
// or we could add middleware on a route-per-route bassis
router.get("/v1/users", user, .{.middlewares = &.{cors}});
Expand Down
20 changes: 11 additions & 9 deletions src/httpz.zig
Original file line number Diff line number Diff line change
Expand Up @@ -466,13 +466,15 @@ pub fn Server(comptime H: type) type {
}
}

pub fn router(self: *Self, config: RouterConfig) *Router(H, ActionArg) {
pub fn router(self: *Self, config: RouterConfig) !*Router(H, ActionArg) {
// we store this in self for us when no route is found (these will
// still be executed).
self._middlewares = config.middlewares;

const owned = try self.arena.dupe(Middleware(H), config.middlewares);
self._middlewares = owned;

// we store this in router to append to add/append to created routes
self._router.middlewares = config.middlewares;
self._router.middlewares = owned;

return &self._router;
}
Expand Down Expand Up @@ -806,7 +808,7 @@ test "tests:beforeAll" {
middlewares[0] = try default_server.middleware(TestMiddleware, .{ .id = 100 });
middlewares[1] = cors[0];

var router = default_server.router(.{});
var router = try default_server.router(.{});
// router.get("/test/ws", testWS);
router.get("/fail", TestDummyHandler.fail, .{});
router.get("/test/json", TestDummyHandler.jsonRes, .{});
Expand All @@ -827,7 +829,7 @@ test "tests:beforeAll" {

{
dispatch_default_server = try Server(*TestHandlerDefaultDispatch).init(ga, .{ .port = 5993 }, &test_handler_default_dispatch1);
var router = dispatch_default_server.router(.{});
var router = try dispatch_default_server.router(.{});
router.get("/", TestHandlerDefaultDispatch.echo, .{});
router.get("/write/*", TestHandlerDefaultDispatch.echoWrite, .{});
router.get("/fail", TestHandlerDefaultDispatch.fail, .{});
Expand All @@ -849,14 +851,14 @@ test "tests:beforeAll" {

{
dispatch_server = try Server(*TestHandlerDispatch).init(ga, .{ .port = 5994 }, &test_handler_dispatch);
var router = dispatch_server.router(.{});
var router = try dispatch_server.router(.{});
router.get("/", TestHandlerDispatch.root, .{});
test_server_threads[2] = try dispatch_server.listenInNewThread();
}

{
dispatch_action_context_server = try Server(*TestHandlerDispatchContext).init(ga, .{ .port = 5995 }, &test_handler_disaptch_context);
var router = dispatch_action_context_server.router(.{});
var router = try dispatch_action_context_server.router(.{});
router.get("/", TestHandlerDispatchContext.root, .{});
test_server_threads[3] = try dispatch_action_context_server.listenInNewThread();
}
Expand All @@ -865,7 +867,7 @@ test "tests:beforeAll" {
// with only 1 worker, and a min/max conn of 1, each request should
// hit our reset path.
reuse_server = try Server(void).init(ga, .{ .port = 5996, .workers = .{ .count = 1, .min_conn = 1, .max_conn = 1 } }, {});
var router = reuse_server.router(.{});
var router = try reuse_server.router(.{});
router.get("/test/writer", TestDummyHandler.reuseWriter, .{});
test_server_threads[4] = try reuse_server.listenInNewThread();
}
Expand All @@ -877,7 +879,7 @@ test "tests:beforeAll" {

{
websocket_server = try Server(TestWebsocketHandler).init(ga, .{ .port = 5998 }, TestWebsocketHandler{});
var router = websocket_server.router(.{});
var router = try websocket_server.router(.{});
router.get("/ws", TestWebsocketHandler.upgrade, .{});
test_server_threads[6] = try websocket_server.listenInNewThread();
}
Expand Down

0 comments on commit eced2d8

Please sign in to comment.