mirror of
https://github.com/actix/actix-web.git
synced 2024-12-02 22:36:34 +00:00
fix NormalizePath helper
This commit is contained in:
parent
d4611f8bb9
commit
8f2d3a0a76
1 changed files with 31 additions and 14 deletions
|
@ -287,6 +287,7 @@ impl<S, H, F, R, E> RouteHandler<S> for AsyncHandler<S, H, F, R, E>
|
||||||
/// By normalizing it means:
|
/// By normalizing it means:
|
||||||
///
|
///
|
||||||
/// - Add a trailing slash to the path.
|
/// - Add a trailing slash to the path.
|
||||||
|
/// - Remove a trailing slash from the path.
|
||||||
/// - Double slashes are replaced by one.
|
/// - Double slashes are replaced by one.
|
||||||
///
|
///
|
||||||
/// The handler returns as soon as it finds a path that resolves
|
/// The handler returns as soon as it finds a path that resolves
|
||||||
|
@ -393,6 +394,19 @@ impl<S> Handler<S> for NormalizePath {
|
||||||
.body(Body::Empty);
|
.body(Body::Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if p.ends_with('/') {
|
||||||
|
println!("=== {:?}", p);
|
||||||
|
// try to remove trailing slash
|
||||||
|
let p = p.as_ref().trim_right_matches('/');
|
||||||
|
if router.has_route(p) {
|
||||||
|
let mut req = HttpResponse::build(self.redirect);
|
||||||
|
return if !query.is_empty() {
|
||||||
|
req.header(header::LOCATION, (p.to_owned() + "?" + query).as_str())
|
||||||
|
} else {
|
||||||
|
req.header(header::LOCATION, p)
|
||||||
|
}
|
||||||
|
.body(Body::Empty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// append trailing slash
|
// append trailing slash
|
||||||
|
@ -430,16 +444,17 @@ mod tests {
|
||||||
.finish();
|
.finish();
|
||||||
|
|
||||||
// trailing slashes
|
// trailing slashes
|
||||||
let params = vec![("/resource1", "", StatusCode::OK),
|
let params =
|
||||||
("/resource1/", "", StatusCode::NOT_FOUND),
|
vec![("/resource1", "", StatusCode::OK),
|
||||||
("/resource2", "/resource2/", StatusCode::MOVED_PERMANENTLY),
|
("/resource1/", "/resource1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource2/", "", StatusCode::OK),
|
("/resource2", "/resource2/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource1?p1=1&p2=2", "", StatusCode::OK),
|
("/resource2/", "", StatusCode::OK),
|
||||||
("/resource1/?p1=1&p2=2", "", StatusCode::NOT_FOUND),
|
("/resource1?p1=1&p2=2", "", StatusCode::OK),
|
||||||
("/resource2?p1=1&p2=2", "/resource2/?p1=1&p2=2",
|
("/resource1/?p1=1&p2=2", "/resource1?p1=1&p2=2", StatusCode::MOVED_PERMANENTLY),
|
||||||
StatusCode::MOVED_PERMANENTLY),
|
("/resource2?p1=1&p2=2", "/resource2/?p1=1&p2=2",
|
||||||
("/resource2/?p1=1&p2=2", "", StatusCode::OK)
|
StatusCode::MOVED_PERMANENTLY),
|
||||||
];
|
("/resource2/?p1=1&p2=2", "", StatusCode::OK)
|
||||||
|
];
|
||||||
for (path, target, code) in params {
|
for (path, target, code) in params {
|
||||||
let req = app.prepare_request(TestRequest::with_uri(path).finish());
|
let req = app.prepare_request(TestRequest::with_uri(path).finish());
|
||||||
let resp = app.run(req);
|
let resp = app.run(req);
|
||||||
|
@ -464,11 +479,11 @@ mod tests {
|
||||||
|
|
||||||
// trailing slashes
|
// trailing slashes
|
||||||
let params = vec![("/resource1", StatusCode::OK),
|
let params = vec![("/resource1", StatusCode::OK),
|
||||||
("/resource1/", StatusCode::NOT_FOUND),
|
("/resource1/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource2", StatusCode::NOT_FOUND),
|
("/resource2", StatusCode::NOT_FOUND),
|
||||||
("/resource2/", StatusCode::OK),
|
("/resource2/", StatusCode::OK),
|
||||||
("/resource1?p1=1&p2=2", StatusCode::OK),
|
("/resource1?p1=1&p2=2", StatusCode::OK),
|
||||||
("/resource1/?p1=1&p2=2", StatusCode::NOT_FOUND),
|
("/resource1/?p1=1&p2=2", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource2?p1=1&p2=2", StatusCode::NOT_FOUND),
|
("/resource2?p1=1&p2=2", StatusCode::NOT_FOUND),
|
||||||
("/resource2/?p1=1&p2=2", StatusCode::OK)
|
("/resource2/?p1=1&p2=2", StatusCode::OK)
|
||||||
];
|
];
|
||||||
|
@ -491,6 +506,8 @@ mod tests {
|
||||||
// trailing slashes
|
// trailing slashes
|
||||||
let params = vec![
|
let params = vec![
|
||||||
("/resource1/a/b", "", StatusCode::OK),
|
("/resource1/a/b", "", StatusCode::OK),
|
||||||
|
("/resource1/", "/resource1", StatusCode::MOVED_PERMANENTLY),
|
||||||
|
("/resource1//", "/resource1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource1//a//b", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
("//resource1//a//b", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource1//a//b/", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
("//resource1//a//b/", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource1//a//b//", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
("//resource1//a//b//", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
|
@ -531,7 +548,7 @@ mod tests {
|
||||||
// trailing slashes
|
// trailing slashes
|
||||||
let params = vec![
|
let params = vec![
|
||||||
("/resource1/a/b", "", StatusCode::OK),
|
("/resource1/a/b", "", StatusCode::OK),
|
||||||
("/resource1/a/b/", "", StatusCode::NOT_FOUND),
|
("/resource1/a/b/", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource2//a//b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource2//a//b/", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b/", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource2//a//b//", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b//", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
|
@ -548,7 +565,7 @@ mod tests {
|
||||||
("/////resource2/a///b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("/////resource2/a///b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/////resource2/a///b/", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("/////resource2/a///b/", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource1/a/b?p=1", "", StatusCode::OK),
|
("/resource1/a/b?p=1", "", StatusCode::OK),
|
||||||
("/resource1/a/b/?p=1", "", StatusCode::NOT_FOUND),
|
("/resource1/a/b/?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource2//a//b?p=1", "/resource2/a/b/?p=1", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b?p=1", "/resource2/a/b/?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource2//a//b/?p=1", "/resource2/a/b/?p=1", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b/?p=1", "/resource2/a/b/?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("///resource1//a//b?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
("///resource1//a//b?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
|
|
Loading…
Reference in a new issue