Skip to content

Commit ca295e6

Browse files
Nemo157Joshua Nelson
authored and
Joshua Nelson
committed
Only chain to different handlers for 404 errors
1 parent d4089ba commit ca295e6

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/web/mod.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -138,19 +138,24 @@ impl CratesfyiHandler {
138138

139139
impl Handler for CratesfyiHandler {
140140
fn handle(&self, req: &mut Request) -> IronResult<Response> {
141+
fn if_404(
142+
e: IronError,
143+
handle: impl FnOnce() -> IronResult<Response>,
144+
) -> IronResult<Response> {
145+
if e.response.status == Some(status::NotFound) {
146+
handle()
147+
} else {
148+
Err(e)
149+
}
150+
};
151+
141152
// try serving shared rustdoc resources first, then router, then db/static file handler
142153
// return 404 if none of them return Ok
143154
self.shared_resource_handler
144155
.handle(req)
145-
.or_else(|e| self.router_handler.handle(req).or(Err(e)))
146-
.or_else(|e| {
147-
// if router fails try to serve files from database first
148-
self.database_file_handler.handle(req).or(Err(e))
149-
})
150-
.or_else(|e| {
151-
// and then try static handler. if all of them fails, return 404
152-
self.static_handler.handle(req).or(Err(e))
153-
})
156+
.or_else(|e| if_404(e, || self.router_handler.handle(req)))
157+
.or_else(|e| if_404(e, || self.database_file_handler.handle(req)))
158+
.or_else(|e| if_404(e, || self.static_handler.handle(req)))
154159
.or_else(|e| {
155160
let err = if let Some(err) = e.error.downcast::<error::Nope>() {
156161
*err

0 commit comments

Comments
 (0)