rust_web_server/app/controller/index/
mod.rs1#[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}