Skip to main content

rust_web_server/app/controller/not_found/
mod.rs

1use file_ext::FileExt;
2use crate::controller::Controller;
3use crate::mime_type::MimeType;
4use crate::range::Range;
5use crate::request::Request;
6use crate::response::{Response, STATUS_CODE_REASON_PHRASE};
7use crate::server::ConnectionInfo;
8
9pub struct NotFoundController;
10
11impl Controller for NotFoundController {
12    fn is_matching(_request: &Request, _connection: &ConnectionInfo) -> bool {
13        true
14    }
15
16    fn process(_request: &Request, mut response: Response, _connection: &ConnectionInfo) -> Response {
17        response.status_code = *STATUS_CODE_REASON_PHRASE.n404_not_found.status_code;
18        response.reason_phrase = STATUS_CODE_REASON_PHRASE.n404_not_found.reason_phrase.to_string();
19
20
21        if FileExt::does_file_exist(NotFoundController::NOT_FOUND_FILEPATH) {
22            let boxed_content_range =
23                Range::get_content_range_of_a_file(NotFoundController::NOT_FOUND_FILEPATH);
24
25            if boxed_content_range.is_ok() {
26                let content_range = boxed_content_range.unwrap();
27                let content_range_list = vec![content_range];
28                response.content_range_list = content_range_list;
29            } else {
30                let error = boxed_content_range.err().unwrap();
31                let mime_type = MimeType::TEXT_HTML.to_string();
32                let content_range = Range::get_content_range(
33                    Vec::from(error.as_bytes()),
34                    mime_type
35                );
36
37                let content_range_list = vec![content_range];
38                response.content_range_list = content_range_list;
39                response.status_code = *STATUS_CODE_REASON_PHRASE.n500_internal_server_error.status_code;
40                response.reason_phrase = STATUS_CODE_REASON_PHRASE.n500_internal_server_error.reason_phrase.to_string();
41            }
42        } else {
43            let not_found_file = include_bytes!("404.html");
44
45            let content_range =
46                Range::get_content_range(not_found_file.to_vec(), MimeType::TEXT_HTML.to_string());
47
48
49            let content_range_list = vec![content_range];
50            response.content_range_list = content_range_list;
51
52        }
53
54        response
55    }
56}
57
58// backward compatability
59impl NotFoundController {
60    pub const NOT_FOUND_FILEPATH: &'static str = "404.html";
61
62    pub fn is_matching_request(_request: &Request) -> bool {
63        true
64    }
65
66    pub fn process_request(_request: &Request, mut response: Response) -> Response {
67        response.status_code = *STATUS_CODE_REASON_PHRASE.n404_not_found.status_code;
68        response.reason_phrase = STATUS_CODE_REASON_PHRASE.n404_not_found.reason_phrase.to_string();
69
70
71        if FileExt::does_file_exist(NotFoundController::NOT_FOUND_FILEPATH) {
72            let boxed_content_range =
73                Range::get_content_range_of_a_file(NotFoundController::NOT_FOUND_FILEPATH);
74
75            if boxed_content_range.is_ok() {
76                let content_range = boxed_content_range.unwrap();
77                let content_range_list = vec![content_range];
78                response.content_range_list = content_range_list;
79            } else {
80                let error = boxed_content_range.err().unwrap();
81                let mime_type = MimeType::TEXT_HTML.to_string();
82                let content_range = Range::get_content_range(
83                    Vec::from(error.as_bytes()),
84                    mime_type
85                );
86
87                let content_range_list = vec![content_range];
88                response.content_range_list = content_range_list;
89                response.status_code = *STATUS_CODE_REASON_PHRASE.n500_internal_server_error.status_code;
90                response.reason_phrase = STATUS_CODE_REASON_PHRASE.n500_internal_server_error.reason_phrase.to_string();
91            }
92        } else {
93            let not_found_file = include_bytes!("404.html");
94
95            let content_range =
96                Range::get_content_range(not_found_file.to_vec(), MimeType::TEXT_HTML.to_string());
97
98
99            let content_range_list = vec![content_range];
100            response.content_range_list = content_range_list;
101
102        }
103
104        response
105    }
106}