http_server_rs/
httpconstants.rs

1use std::time::SystemTime;
2
3pub struct HttpConstants {
4}
5
6impl HttpConstants {
7    
8    pub fn get_current_formatted_date() -> String { 
9        // let add_days = 0 * 86400;
10        let total_seconds = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs()
11            // + add_days
12            ;
13        return HttpConstants::get_formatted_date(total_seconds);
14    }
15    
16    pub fn get_formatted_date(total_seconds : u64) -> String {
17        
18        let seconds = total_seconds % 60;
19        let mut minutes = total_seconds / 60;
20        let mut hours = minutes / 60;
21        minutes %= 60;
22        let mut days = 1 + hours / 24;
23        let total_days = days - 1;
24        hours %= 24;
25        let mut months = 0;
26        let mut years = 1970;
27        let mut month_length = 0;
28        while days > month_length {
29            month_length = HttpConstants::get_month_length(months + 1, years);
30            months = (months + 1) % 12;
31            days -= month_length;
32            month_length = HttpConstants::get_month_length(months + 1, years);
33            if months == 0 {
34                years += 1;
35            }
36        }
37        
38        let format_months = months + 1; // during calc we start at 0;
39        let week_day = (3 // thursday (5) - 2
40            + total_days) % 7;
41        
42        
43        
44        return format!("{}, {} {} {} {}:{}:{} {}", 
45            HttpConstants::get_day_name(week_day),
46            HttpConstants::buffer_number(days),
47            HttpConstants::get_month_name(format_months),
48            years,
49            HttpConstants::buffer_number(hours),
50            HttpConstants::buffer_number(minutes),
51            HttpConstants::buffer_number(seconds),
52            "UTC");
53    }
54    
55    fn get_month_length(months : u64, year : u64) -> u64 {
56        if months == 1 // january
57            || months == 3 // march
58            || months == 5 // may
59            || months == 7 // july
60            || months == 8 // august
61            || months == 10 // october
62            || months == 12 // december 
63        {
64            return 31;
65        } else if months == 2 { // february
66            
67            if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) {// leap year check
68                return 29;
69            }
70            
71            return 28;
72        }
73        
74        return 30; // all the other months
75    }
76    
77    fn get_month_name(month : u64) -> String {
78        return (match month {
79            1 => "Jan",
80            2 => "Feb",
81            3 => "Mar",
82            4 => "Apr",
83            5 => "May",
84            6 => "Jun",
85            7 => "Jul",
86            8 => "Aug",
87            9 => "Sep",
88            10 => "Oct",
89            11 => "Nov",
90            12 => "Dec",
91            _ => {
92                panic!("Invalid month number: {}", month);
93            }
94        }).to_string()
95    }
96    
97    fn get_day_name(week_day : u64) -> String {
98        return (match week_day {
99            0 => "Mon",
100            1 => "Tue",
101            2 => "Wed",
102            3 => "Thu",
103            4 => "Fri",
104            5 => "Sat",
105            6 => "Sun",
106            _ => {
107                panic!("Invalid day number: {}", week_day);
108            }
109        }).to_string()
110    }
111    
112    fn buffer_number(number : u64) -> String {
113        let format_number;
114        if number <= 9 {
115            format_number = String::from("0") + number.to_string().as_str();
116        } else {
117            format_number = number.to_string();
118        }
119        return format_number;
120    }
121    
122    pub fn get_code_text(code : i32) -> &'static str {
123        return match code {
124                HTTP_OK => " OK",
125                HTTP_CONTINUE => " Continue",
126                HTTP_CREATED => " Created",
127                HTTP_ACCEPTED => " Accepted",
128                HTTP_NOT_AUTHORITATIVE => " Non-Authoritative Information",
129                HTTP_NO_CONTENT => " No Content",
130                HTTP_RESET => " Reset Content",
131                HTTP_PARTIAL => " Partial Content",
132                HTTP_MULT_CHOICE => " Multiple Choices",
133                HTTP_MOVED_PERM => " Moved Permanently",
134                HTTP_MOVED_TEMP => " Temporary Redirect",
135                HTTP_SEE_OTHER => " See Other",
136                HTTP_NOT_MODIFIED => " Not Modified",
137                HTTP_USE_PROXY => " Use Proxy",
138                HTTP_BAD_REQUEST => " Bad Request",
139                HTTP_UNAUTHORIZED => " Unauthorized" ,
140                HTTP_PAYMENT_REQUIRED => " Payment Required",
141                HTTP_FORBIDDEN => " Forbidden",
142                HTTP_NOT_FOUND => " Not Found",
143                HTTP_BAD_METHOD => " Method Not Allowed",
144                HTTP_NOT_ACCEPTABLE => " Not Acceptable",
145                HTTP_PROXY_AUTH => " Proxy Authentication Required",
146                HTTP_CLIENT_TIMEOUT => " Request Time-Out",
147                HTTP_CONFLICT => " Conflict",
148                HTTP_GONE => " Gone",
149                HTTP_LENGTH_REQUIRED => " Length Required",
150                HTTP_PRECON_FAILED => " Precondition Failed",
151                HTTP_ENTITY_TOO_LARGE => " Request Entity Too Large",
152                HTTP_REQ_TOO_LONG => " Request-URI Too Large",
153                HTTP_UNSUPPORTED_TYPE => " Unsupported Media Type",
154                HTTP_INTERNAL_ERROR => " Internal Server Error",
155                HTTP_NOT_IMPLEMENTED => " Not Implemented",
156                HTTP_BAD_GATEWAY => " Bad Gateway",
157                HTTP_UNAVAILABLE => " Service Unavailable",
158                HTTP_GATEWAY_TIMEOUT => " Gateway Timeout",
159                HTTP_VERSION => " HTTP Version Not Supported",
160                _ => " ",
161            }
162    }
163    
164}
165
166pub const HTTP_CONTINUE : i32 = 100;
167pub const HTTP_OK : i32 = 200;
168pub const HTTP_CREATED : i32 = 201;
169pub const HTTP_ACCEPTED : i32 = 202;
170pub const HTTP_NOT_AUTHORITATIVE : i32 = 203;
171pub const HTTP_NO_CONTENT : i32 = 204;
172pub const HTTP_RESET : i32 = 205;
173pub const HTTP_PARTIAL : i32 = 206;
174pub const HTTP_MULT_CHOICE : i32 = 300;
175pub const HTTP_MOVED_PERM : i32 = 301;
176pub const HTTP_MOVED_TEMP : i32 = 302;
177pub const HTTP_SEE_OTHER : i32 = 303;
178pub const HTTP_NOT_MODIFIED : i32 = 304;
179pub const HTTP_USE_PROXY : i32 = 305;
180pub const HTTP_BAD_REQUEST : i32 = 400;
181pub const HTTP_UNAUTHORIZED : i32 = 401;
182pub const HTTP_PAYMENT_REQUIRED : i32 = 402;
183pub const HTTP_FORBIDDEN : i32 = 403;
184pub const HTTP_NOT_FOUND : i32 = 404;
185pub const HTTP_BAD_METHOD : i32 = 405;
186pub const HTTP_NOT_ACCEPTABLE : i32 = 406;
187pub const HTTP_PROXY_AUTH : i32 = 407;
188pub const HTTP_CLIENT_TIMEOUT : i32 = 408;
189pub const HTTP_CONFLICT : i32 = 409;
190pub const HTTP_GONE : i32 = 410;
191pub const HTTP_LENGTH_REQUIRED : i32 = 411;
192pub const HTTP_PRECON_FAILED : i32 = 412;
193pub const HTTP_ENTITY_TOO_LARGE : i32 = 413;
194pub const HTTP_REQ_TOO_LONG : i32 = 414;
195pub const HTTP_UNSUPPORTED_TYPE : i32 = 415;
196pub const HTTP_INTERNAL_ERROR : i32 = 500;
197pub const HTTP_NOT_IMPLEMENTED : i32 = 501;
198pub const HTTP_BAD_GATEWAY : i32 = 502;
199pub const HTTP_UNAVAILABLE : i32 = 503;
200pub const HTTP_GATEWAY_TIMEOUT : i32 = 504;
201pub const HTTP_VERSION : i32 = 505;