From d4974fe5335ac3515077b8deff43b1e5f740f41f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 23 Apr 2026 23:27:54 +0300 Subject: [PATCH] checker: fix app timeouts once "before_request" middleware is registered. (fixes #24782) --- ..._bound_method_fn_field_return_type_err.out | 20 +++++++++++++++ ...b_bound_method_fn_field_return_type_err.vv | 25 +++++++++++++++++++ vlib/veb/tests/middleware_test.v | 16 ++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.out create mode 100644 vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv diff --git a/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.out b/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.out new file mode 100644 index 000000000..45b6d9595 --- /dev/null +++ b/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.out @@ -0,0 +1,20 @@ +vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv:14:30: notice: unused parameter: `options` + 12 | struct Middleware[T] {} + 13 | + 14 | fn (mut m Middleware[T]) use(options Options[T]) {} + | ~~~~~~~ + 15 | + 16 | struct App { +vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv:20:33: notice: unused parameter: `ctx` + 18 | } + 19 | + 20 | fn (app App) before_request(mut ctx Context) {} + | ~~~ + 21 | + 22 | fn main() { +vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv:24:10: error: cannot assign to field `handler`: expected `fn (mut Context) bool`, not `fn (mut Context)` + 22 | fn main() { + 23 | mut app := &App{} + 24 | app.use(handler: app.before_request) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 25 | } diff --git a/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv b/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv new file mode 100644 index 000000000..9d5fed52e --- /dev/null +++ b/vlib/v/checker/tests/veb_bound_method_fn_field_return_type_err.vv @@ -0,0 +1,25 @@ +import veb + +struct Context { + veb.Context +} + +@[params] +struct Options[T] { + handler fn (mut ctx T) bool @[required] +} + +struct Middleware[T] {} + +fn (mut m Middleware[T]) use(options Options[T]) {} + +struct App { + Middleware[Context] +} + +fn (app App) before_request(mut ctx Context) {} + +fn main() { + mut app := &App{} + app.use(handler: app.before_request) +} diff --git a/vlib/veb/tests/middleware_test.v b/vlib/veb/tests/middleware_test.v index 2137b588f..3cedf7744 100644 --- a/vlib/veb/tests/middleware_test.v +++ b/vlib/veb/tests/middleware_test.v @@ -105,6 +105,11 @@ pub fn (app &App) app_middleware(mut ctx Context) bool { return true } +pub fn (app &App) before_request(mut ctx Context) bool { + ctx.res.header.add_custom('X-BEFORE-REQUEST-MIDDLEWARE', 'true') or { panic(err) } + return true +} + // route_bound_middleware reads and mutates the bound app to exercise stateful middleware. pub fn (mut app App) route_bound_middleware(mut ctx Context) bool { app.bound_middleware_hits++ @@ -164,6 +169,7 @@ fn testsuite_begin() { // global middleware app.Middleware.use(handler: middleware_handler) app.Middleware.use(handler: app.app_middleware) + app.Middleware.use(handler: app.before_request) // should match only one slash app.Middleware.route_use('/bar/:foo', handler: middleware_handler) @@ -210,6 +216,16 @@ fn test_index() { assert x.body == 'from index, 2' } +fn test_bound_before_request_named_middleware_does_not_timeout() { + x := http.fetch(http.FetchConfig{ + url: localserver + read_timeout: 1500 * time.millisecond + write_timeout: 1500 * time.millisecond + })! + assert x.body == 'from index, 2' + assert x.header.get_custom('X-BEFORE-REQUEST-MIDDLEWARE')! == 'true' +} + fn test_unreachable_order() { x := http.get('${localserver}/unreachable')! assert x.body == 'unreachable, 2' -- 2.39.5