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{}
for m, path in middlewares {
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{
method: m
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{
method: m
params: params
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 {
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) {
$for method in T.methods {
if method_name == method.name {
if params.len != method.args.len {
if method.args.len > 0 && params.len == method.args.len {
app.$method(params)
} else {
app.$method()