Skip to main content

rust_web_server/app/controller/style/
mod.rs

1use file_ext::FileExt;
2use crate::controller::Controller;
3use crate::mime_type::MimeType;
4use crate::range::Range;
5use crate::request::{METHOD, Request};
6use crate::response::{Response, STATUS_CODE_REASON_PHRASE};
7use crate::server::ConnectionInfo;
8
9pub struct StyleController;
10
11impl Controller for StyleController {
12    fn is_matching(request: &Request, _connection: &ConnectionInfo) -> bool {
13        request.method == METHOD.get &&request.request_uri == "/style.css"
14    }
15
16    fn process(_request: &Request, mut response: Response, _connection: &ConnectionInfo) -> Response {
17        response.status_code = *STATUS_CODE_REASON_PHRASE.n200_ok.status_code;
18        response.reason_phrase = STATUS_CODE_REASON_PHRASE.n200_ok.reason_phrase.to_string();
19
20
21        if FileExt::does_file_exist(StyleController::STYLE_FILEPATH) {
22            let boxed_content_range =
23                Range::get_content_range_of_a_file(StyleController::STYLE_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 style_file = include_bytes!("style.css");
44
45            let content_range =
46                Range::get_content_range(style_file.to_vec(), MimeType::TEXT_CSS.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 StyleController {
60    pub const STYLE_FILEPATH: &'static str = "style.css";
61
62    pub fn is_matching_request(request: &Request) -> bool {
63        request.request_uri == "/style.css"
64    }
65
66    pub fn process_request(_request: &Request, mut response: Response) -> Response {
67        response.status_code = *STATUS_CODE_REASON_PHRASE.n200_ok.status_code;
68        response.reason_phrase = STATUS_CODE_REASON_PHRASE.n200_ok.reason_phrase.to_string();
69
70
71        if FileExt::does_file_exist(StyleController::STYLE_FILEPATH) {
72            let boxed_content_range =
73                Range::get_content_range_of_a_file(StyleController::STYLE_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 style_file = include_bytes!("style.css");
94
95            let content_range =
96                Range::get_content_range(style_file.to_vec(), MimeType::TEXT_CSS.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}