fix: path matching, middleware firing args len

pull/12916/head
Anton Zavodchikov 2021-12-21 08:52:12 +05:00
parent 885d7dfbe9
commit 6a1e62528f
1 changed files with 29 additions and 6 deletions

View File

@ -567,23 +567,46 @@ fn fire_middlewares<T>(mut app T, url_words []string, middlewares map[string]str
mut fire_those := []Firable_middleware{} mut fire_those := []Firable_middleware{}
for m, path in middlewares { for m, path in middlewares {
path_words := path.split('/').filter(it != '') path_words := path.split('/').filter(it != '')
ext_words := url_words[..path_words.len]
if (path_words.len == 0 && url_words.len == 0) || (!path.contains('/:') && path_words == ext_words) { if path_words.len == 0 {
fire_those << Firable_middleware{ fire_those << Firable_middleware{
method: m method: m
path_len: path_words.len path_len: path_words.len
} }
} else if params := route_matches(ext_words, path_words) { continue
}
if path_words.len > url_words.len {
continue
}
ext_words := url_words[..path_words.len]
if !path.contains('/:') && path_words == ext_words {
fire_those << Firable_middleware{ fire_those << Firable_middleware{
method: m method: m
params: params
path_len: path_words.len path_len: path_words.len
} }
} else if path_words.last().starts_with(':') && path_words.last().ends_with('...') {
if params := route_matches(url_words, path_words) {
fire_those << Firable_middleware{
method: m
params: params
path_len: path_words.len
}
}
} else {
if params := route_matches(ext_words, path_words) {
fire_those << Firable_middleware{
method: m
params: params
path_len: path_words.len
}
}
} }
} }
fire_those.sort(a.path_len < b.path_len) fire_those.sort(a.path_len > b.path_len)
for f in fire_those { for f in fire_those {
fire_middleware(mut app, f.method, f.params) fire_middleware(mut app, f.method, f.params)
@ -593,7 +616,7 @@ fn fire_middlewares<T>(mut app T, url_words []string, middlewares map[string]str
fn fire_middleware<T>(mut app T, method_name string, params []string) { fn fire_middleware<T>(mut app T, method_name string, params []string) {
$for method in T.methods { $for method in T.methods {
if method_name == method.name { if method_name == method.name {
if params.len != method.args.len { if method.args.len > 0 && params.len == method.args.len {
app.$method(params) app.$method(params)
} else { } else {
app.$method() app.$method()