rust_web_server/app/controller/index/
mod.rs

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