mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-24 08:22:59 +01:00
try to remove trailing slash for normalize path handler
This commit is contained in:
parent
360ffbba68
commit
ddc82395e8
@ -65,7 +65,7 @@ impl<S: 'static> PipelineHandler<S> for Inner<S> {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
impl<S: 'static> HttpApplication<S> {
|
impl<S: 'static> HttpApplication<S> {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub(crate) fn run(&mut self, req: HttpRequest<S>) -> Reply {
|
pub(crate) fn run(&mut self, req: HttpRequest<S>) -> Reply {
|
||||||
self.inner.borrow_mut().handle(req)
|
self.inner.borrow_mut().handle(req)
|
||||||
}
|
}
|
||||||
|
@ -379,6 +379,18 @@ impl<S> Handler<S> for NormalizePath {
|
|||||||
.body(Body::Empty);
|
.body(Body::Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try to remove trailing slash
|
||||||
|
if p.ends_with('/') {
|
||||||
|
let p = p.as_ref().trim_right_matches('/');
|
||||||
|
if router.has_route(&p) {
|
||||||
|
let p = p.to_owned();
|
||||||
|
let p = if !query.is_empty() { p + "?" + query } else { p };
|
||||||
|
return HttpResponse::build(self.redirect)
|
||||||
|
.header(header::LOCATION, p.as_str())
|
||||||
|
.body(Body::Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// append trailing slash
|
// append trailing slash
|
||||||
@ -478,16 +490,16 @@ mod tests {
|
|||||||
let params = vec![
|
let params = vec![
|
||||||
("/resource1/a/b", "", StatusCode::OK),
|
("/resource1/a/b", "", StatusCode::OK),
|
||||||
("//resource1//a//b", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
("//resource1//a//b", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("//resource1//a//b/", "", StatusCode::NOT_FOUND),
|
("//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/", "", StatusCode::NOT_FOUND),
|
("/////resource1/a//b/", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/resource1/a/b?p=1", "", StatusCode::OK),
|
("/resource1/a/b?p=1", "", StatusCode::OK),
|
||||||
("//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),
|
||||||
("//resource1//a//b/?p=1", "", StatusCode::NOT_FOUND),
|
("//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),
|
("///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),
|
("/////resource1/a///b?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/////resource1/a//b/?p=1", "", StatusCode::NOT_FOUND),
|
("/////resource1/a//b/?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
];
|
];
|
||||||
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());
|
||||||
@ -519,9 +531,9 @@ 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", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
("///resource1//a//b", "/resource1/a/b", StatusCode::MOVED_PERMANENTLY),
|
||||||
("///resource1//a//b/", "", StatusCode::NOT_FOUND),
|
("///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/", "", 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/", "", StatusCode::OK),
|
("/resource2/a/b/", "", StatusCode::OK),
|
||||||
("//resource2//a//b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
("//resource2//a//b", "/resource2/a/b/", StatusCode::MOVED_PERMANENTLY),
|
||||||
@ -535,9 +547,9 @@ mod tests {
|
|||||||
("//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),
|
||||||
("///resource1//a//b/?p=1", "", StatusCode::NOT_FOUND),
|
("///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),
|
("/////resource1/a///b?p=1", "/resource1/a/b?p=1", StatusCode::MOVED_PERMANENTLY),
|
||||||
("/////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),
|
||||||
("//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),
|
||||||
|
Loading…
Reference in New Issue
Block a user