dhttp/services/
errorpage.rs

1use crate::core::{HttpError, HttpErrorHandler};
2use crate::reqres::{res, HttpRequest, HttpResponse, StatusCode};
3
4fn error_page(code: u16, code_desc: &str, desc: &str, name: &str) -> String {
5format!(r#"<!doctype html>
6<html><title>{code} {code_desc}</title><meta name="viewport" content="width=device-width"><style>*{{font-family:sans-serif;color:#0e1219;border-color:#0e1219;background:#f9f9f9}}@media(prefers-color-scheme:dark){{*{{color:#47d8bb;border-color:#47d8bb;background:#0e1219}}}}h1{{margin:0;}}div{{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);padding:8px;border:4px solid}}</style><div>
7
8<h1>    {code} {code_desc}    </h1>
9        {desc}
10<hr><!--------------------------->
11<center>    {name}    </center>
12
13</div></html>
14"#)
15}
16
17/// Default error handler, shows a nice error page
18pub struct ErrorPageHandler {
19    pub name: String,
20}
21
22impl HttpErrorHandler for ErrorPageHandler {
23    fn error(&self, req: &HttpRequest, error: &dyn HttpError) -> HttpResponse {
24        let code = error.status_code();
25        let desc = error.http_description();
26        res::html(req, error_page(code.0, code.as_str(), &desc, &self.name))
27    }
28
29    fn plain_code(&self, code: StatusCode) -> HttpResponse {
30        res::html(&HttpRequest::default(), error_page(code.0, code.as_str(), "", &self.name))
31    }
32}