1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use actix_web::{Result, HttpResponse};
use actix_web::dev::ServiceResponse;
use actix_web::body::Body;
use actix_web::http::{header, StatusCode};
use actix_web::middleware::errhandlers::ErrorHandlerResponse;

use dbui_templates::templates;

pub fn render_400(res: ServiceResponse<Body>) -> Result<ErrorHandlerResponse<Body>> {
  error_response(res, StatusCode::NOT_FOUND, "Bad request")
}

pub fn render_404(res: ServiceResponse<Body>) -> Result<ErrorHandlerResponse<Body>> {
  error_response(res, StatusCode::NOT_FOUND, "The resource you requested can't be found")
}

pub fn render_500(res: ServiceResponse<Body>) -> Result<ErrorHandlerResponse<Body>> {
  error_response(res, StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong; this is probably not your fault")
}

fn error_response(mut res: ServiceResponse<Body>, status_code: StatusCode, message: &str) -> Result<ErrorHandlerResponse<Body>> {
  res.headers_mut().insert(
    header::CONTENT_TYPE,
    header::HeaderValue::from_str(mime::TEXT_HTML_UTF_8.as_ref()).unwrap()
  );

  let rsp = HttpResponse::build(status_code)
    .content_type("text/html")
    .body(templates::error::error(status_code.as_u16(), status_code.canonical_reason().unwrap_or("Unknown Error"), message)
    .into_string());
  Ok(ErrorHandlerResponse::Response(
    res.into_response(rsp)
  ))
}