Add custom error pages

This commit is contained in:
Valentin Brandl 2019-04-21 17:57:57 +02:00
parent 685b92a654
commit f832e10fac
No known key found for this signature in database
GPG Key ID: 30D341DD34118D7D
4 changed files with 109 additions and 13 deletions

View File

@ -1,4 +1,6 @@
use crate::P500;
use actix_web::{HttpResponse, ResponseError}; use actix_web::{HttpResponse, ResponseError};
use std::fmt;
#[derive(Debug)] #[derive(Debug)]
pub(crate) enum Error { pub(crate) enum Error {
@ -9,8 +11,9 @@ pub(crate) enum Error {
Serial(serde_json::Error), Serial(serde_json::Error),
} }
impl std::fmt::Display for Error { impl fmt::Display for Error {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
// write!(fmt, "{}", P500)
match self { match self {
Error::Badge(s) => write!(fmt, "Badge({})", s), Error::Badge(s) => write!(fmt, "Badge({})", s),
Error::Git(e) => write!(fmt, "Git({})", e), Error::Git(e) => write!(fmt, "Git({})", e),
@ -23,7 +26,9 @@ impl std::fmt::Display for Error {
impl ResponseError for Error { impl ResponseError for Error {
fn error_response(&self) -> HttpResponse { fn error_response(&self) -> HttpResponse {
HttpResponse::InternalServerError().finish() HttpResponse::InternalServerError()
.content_type("text/html")
.body(P500)
} }
} }

View File

@ -35,6 +35,8 @@ struct State {
} }
const INDEX: &str = include_str!("../static/index.html"); const INDEX: &str = include_str!("../static/index.html");
const P404: &str = include_str!("../static/404.html");
const P500: &str = include_str!("../static/500.html");
const CSS: &str = include_str!("../static/tacit-css.min.css"); const CSS: &str = include_str!("../static/tacit-css.min.css");
#[derive(StructOpt, Debug)] #[derive(StructOpt, Debug)]
@ -194,22 +196,18 @@ fn overview(_: web::Path<(String, String)>) -> HttpResponse {
#[get("/")] #[get("/")]
fn index() -> HttpResponse { fn index() -> HttpResponse {
let (tx, rx_body) = mpsc::unbounded(); HttpResponse::Ok().content_type("text/html").body(INDEX)
let _ = tx.unbounded_send(Bytes::from(INDEX.as_bytes())); }
HttpResponse::Ok() fn p404() -> HttpResponse {
HttpResponse::NotFound()
.content_type("text/html") .content_type("text/html")
.streaming(rx_body.map_err(|_| ErrorBadRequest("bad request"))) .body(P404)
} }
#[get("/tacit-css.min.css")] #[get("/tacit-css.min.css")]
fn css() -> HttpResponse { fn css() -> HttpResponse {
let (tx, rx_body) = mpsc::unbounded(); HttpResponse::Ok().content_type("text/css").body(CSS)
let _ = tx.unbounded_send(Bytes::from(CSS.as_bytes()));
HttpResponse::Ok()
.content_type("text/css")
.streaming(rx_body.map_err(|_| ErrorBadRequest("bad request")))
} }
fn main() -> std::io::Result<()> { fn main() -> std::io::Result<()> {
@ -234,6 +232,7 @@ fn main() -> std::io::Result<()> {
.service(web::resource("/view/github/{user}/{repo}").to(overview)) .service(web::resource("/view/github/{user}/{repo}").to(overview))
.service(web::resource("/view/gitlab/{user}/{repo}").to(overview)) .service(web::resource("/view/gitlab/{user}/{repo}").to(overview))
.service(web::resource("/view/github/{user}/{repo}").to(overview)) .service(web::resource("/view/github/{user}/{repo}").to(overview))
.default_service(web::resource("").route(web::get().to(p404)))
}) })
.bind(interface)? .bind(interface)?
.run() .run()

46
static/404.html Normal file
View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="Hits-of-Code, GitHub, Badge" />
<meta name="description" content="Hits-of-Code Badges for Git repositories" />
<link rel="stylesheet" href="/tacit-css.min.css" />
<title>Page Not Found - Hits-of-Code Badges</title>
</head>
<body>
<section>
<header>
<h1>404 - Page Not Found</h1>
</header>
<article>
<p>
<big>Sorry</big>. I couldn't find the page you are looking for. Please go <a href="/">back to the homepage</a>.
</p>
<p>
If you think, this is a mistake on my side, please <a href="mailto:mail+hoc@vbrandl.net">drop me a mail</a>.
</p>
</article>
<footer>
<nav>
<ul>
<li>
<small>Created by <a href="https://www.vbrandl.net">Valentin Brandl</a>.</small>
</li>
</ul>
</nav>
<nav>
<ul>
<li><small><a href="https://github.com/vbrandl/hoc">GitHub</a></small></li>
<li><small><a href="https://opensource.org/licenses/MIT">MIT License</a></small></li>
</ul>
</nav>
</footer>
</section>
</body>
</html>

46
static/500.html Normal file
View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="Hits-of-Code, GitHub, Badge" />
<meta name="description" content="Hits-of-Code Badges for Git repositories" />
<link rel="stylesheet" href="/tacit-css.min.css" />
<title>Internal Server Error - Hits-of-Code Badges</title>
</head>
<body>
<section>
<header>
<h1>500 - Internal Server Error</h1>
</header>
<article>
<p>
<big>Oops</big>. Looks like a made a mistake. Please go <a href="/">back to the homepage</a> and try again.
</p>
<p>
If you think, this is a bug, please <a href="mailto:mail+hoc@vbrandl.net">drop me a mail</a>.
</p>
</article>
<footer>
<nav>
<ul>
<li>
<small>Created by <a href="https://www.vbrandl.net">Valentin Brandl</a>.</small>
</li>
</ul>
</nav>
<nav>
<ul>
<li><small><a href="https://github.com/vbrandl/hoc">GitHub</a></small></li>
<li><small><a href="https://opensource.org/licenses/MIT">MIT License</a></small></li>
</ul>
</nav>
</footer>
</section>
</body>
</html>