Skip to main content

rust_web_server/app/controller/favicon/
mod.rs

1#[cfg(test)]
2mod tests;
3
4use file_ext::FileExt;
5use crate::controller::Controller;
6
7use crate::mime_type::MimeType;
8use crate::range::Range;
9use crate::request::{METHOD, Request};
10use crate::response::{Response, STATUS_CODE_REASON_PHRASE};
11use crate::server::ConnectionInfo;
12
13pub struct FaviconController;
14
15impl Controller for FaviconController {
16    fn is_matching(request: &Request, _connection: &ConnectionInfo) -> bool {
17        request.method == METHOD.get && request.request_uri == "/favicon.svg"
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(FaviconController::FAVICON_FILEPATH) {
26            let boxed_content_range =
27                Range::get_content_range_of_a_file(FaviconController::FAVICON_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 style_file = include_bytes!("favicon.svg");
48
49            let content_range =
50                Range::get_content_range(style_file.to_vec(), MimeType::IMAGE_SVG.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
62//backward compatability
63impl FaviconController {
64    pub const FAVICON_FILEPATH: &'static str = "favicon.svg";
65
66    pub fn is_matching_request(request: &Request) -> bool {
67        request.method == METHOD.get && request.request_uri == "/favicon.svg"
68    }
69
70    pub fn process_request(_request: &Request, mut response: Response) -> Response {
71        response.status_code = *STATUS_CODE_REASON_PHRASE.n200_ok.status_code;
72        response.reason_phrase = STATUS_CODE_REASON_PHRASE.n200_ok.reason_phrase.to_string();
73
74
75        if FileExt::does_file_exist(FaviconController::FAVICON_FILEPATH) {
76            let boxed_content_range =
77                Range::get_content_range_of_a_file(FaviconController::FAVICON_FILEPATH);
78
79            if boxed_content_range.is_ok() {
80                let content_range = boxed_content_range.unwrap();
81                let content_range_list = vec![content_range];
82                response.content_range_list = content_range_list;
83            } else {
84                let error = boxed_content_range.err().unwrap();
85                let mime_type = MimeType::TEXT_HTML.to_string();
86                let content_range = Range::get_content_range(
87                    Vec::from(error.as_bytes()),
88                    mime_type
89                );
90
91                let content_range_list = vec![content_range];
92                response.content_range_list = content_range_list;
93                response.status_code = *STATUS_CODE_REASON_PHRASE.n500_internal_server_error.status_code;
94                response.reason_phrase = STATUS_CODE_REASON_PHRASE.n500_internal_server_error.reason_phrase.to_string();
95            }
96        } else {
97            let favicon_file = include_bytes!("favicon.svg");
98
99            let content_range =
100                Range::get_content_range(favicon_file.to_vec(), MimeType::IMAGE_SVG.to_string());
101
102
103            let content_range_list = vec![content_range];
104            response.content_range_list = content_range_list;
105
106        }
107
108        response
109    }
110}