rust_web_server/entry_point/
mod.rs1#[cfg(test)]
2mod tests;
3pub mod command_line_args;
4pub mod config_file;
5pub mod environment_variables;
6
7
8use std::{env};
9use crate::virtual_host::VirtualHostConfig;
10
11use crate::entry_point::command_line_args::{override_environment_variables_from_command_line_args};
12use crate::entry_point::config_file::override_environment_variables_from_config;
13use crate::entry_point::environment_variables::read_system_environment_variables;
14
15#[derive(PartialEq, Eq, Clone, Debug)]
16pub struct Config {}
17
18impl Config {
19 pub const RWS_CONFIG_IP: &'static str = "RWS_CONFIG_IP";
20 pub const RWS_CONFIG_IP_DEFAULT_VALUE: &'static str = "0.0.0.0";
23
24 pub const RWS_CONFIG_LOG_FORMAT: &'static str = "RWS_CONFIG_LOG_FORMAT";
26 pub const RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE: &'static str = "json";
27
28 pub const RWS_CONFIG_PORT: &'static str = "RWS_CONFIG_PORT";
29 pub const RWS_CONFIG_PORT_DEFAULT_VALUE: &'static str = "7878";
30
31 pub const RWS_CONFIG_THREAD_COUNT: &'static str = "RWS_CONFIG_THREAD_COUNT";
32 pub const RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE: &'static str = "200";
33
34 pub const RWS_CONFIG_CORS_ALLOW_ALL: &'static str = "RWS_CONFIG_CORS_ALLOW_ALL";
35 pub const RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE: &'static str = "true";
36
37 pub const RWS_CONFIG_CORS_ALLOW_ORIGINS: &'static str = "RWS_CONFIG_CORS_ALLOW_ORIGINS";
38 pub const RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE: &'static str = "";
39
40 pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS: &'static str = "RWS_CONFIG_CORS_ALLOW_CREDENTIALS";
41 pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE: &'static str = "";
42
43 pub const RWS_CONFIG_CORS_ALLOW_HEADERS: &'static str = "RWS_CONFIG_CORS_ALLOW_HEADERS";
44 pub const RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE: &'static str = "";
45
46 pub const RWS_CONFIG_CORS_ALLOW_METHODS: &'static str = "RWS_CONFIG_CORS_ALLOW_METHODS";
47 pub const RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE: &'static str = "";
48
49 pub const RWS_CONFIG_CORS_EXPOSE_HEADERS: &'static str = "RWS_CONFIG_CORS_EXPOSE_HEADERS";
50 pub const RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE: &'static str = "";
51
52 pub const RWS_CONFIG_CORS_MAX_AGE: &'static str = "RWS_CONFIG_CORS_MAX_AGE";
53 pub const RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE: &'static str = "86400";
54
55 pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static str = "RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES";
56 pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE: &'static str = "10000";
57
58 pub const RWS_CONFIG_TLS_CERT_FILE: &'static str = "RWS_CONFIG_TLS_CERT_FILE";
59 pub const RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE: &'static str = "";
60
61 pub const RWS_CONFIG_TLS_KEY_FILE: &'static str = "RWS_CONFIG_TLS_KEY_FILE";
62 pub const RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE: &'static str = "";
63
64 pub const RWS_CONFIG_HTTP_REDIRECT_PORT: &'static str = "RWS_CONFIG_HTTP_REDIRECT_PORT";
67 pub const RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE: &'static str = "";
68
69 pub const RWS_CONFIG_ACME_DOMAINS: &'static str = "RWS_CONFIG_ACME_DOMAINS";
74 pub const RWS_CONFIG_ACME_DOMAINS_DEFAULT_VALUE: &'static str = "";
75
76 pub const RWS_CONFIG_ACME_EMAIL: &'static str = "RWS_CONFIG_ACME_EMAIL";
78 pub const RWS_CONFIG_ACME_EMAIL_DEFAULT_VALUE: &'static str = "";
79
80 pub const RWS_CONFIG_ACME_STAGING: &'static str = "RWS_CONFIG_ACME_STAGING";
82 pub const RWS_CONFIG_ACME_STAGING_DEFAULT_VALUE: &'static str = "false";
83
84 pub const RWS_CONFIG_ACME_DIRECTORY: &'static str = "RWS_CONFIG_ACME_DIRECTORY";
86 pub const RWS_CONFIG_ACME_DIRECTORY_DEFAULT_VALUE: &'static str = "";
87
88 pub const RWS_CONFIG_ACME_CERT_PATH: &'static str = "RWS_CONFIG_ACME_CERT_PATH";
90 pub const RWS_CONFIG_ACME_CERT_PATH_DEFAULT_VALUE: &'static str = "";
91
92 pub const RWS_CONFIG_ACME_KEY_PATH: &'static str = "RWS_CONFIG_ACME_KEY_PATH";
94 pub const RWS_CONFIG_ACME_KEY_PATH_DEFAULT_VALUE: &'static str = "";
95
96 pub const RWS_CONFIG_ACME_CHALLENGE_PORT: &'static str = "RWS_CONFIG_ACME_CHALLENGE_PORT";
99 pub const RWS_CONFIG_ACME_CHALLENGE_PORT_DEFAULT_VALUE: &'static str = "80";
100
101 pub const RWS_CONFIG_ACME_RENEW_BEFORE_DAYS: &'static str = "RWS_CONFIG_ACME_RENEW_BEFORE_DAYS";
103 pub const RWS_CONFIG_ACME_RENEW_BEFORE_DAYS_DEFAULT_VALUE: &'static str = "30";
104
105 pub const RWS_CONFIG_ACME_ACCOUNT_KEY_PATH: &'static str = "RWS_CONFIG_ACME_ACCOUNT_KEY_PATH";
107 pub const RWS_CONFIG_ACME_ACCOUNT_KEY_PATH_DEFAULT_VALUE: &'static str = "acme_account.key";
108
109
110 pub const RWS_DEFAULT_IP: &'static str = "127.0.0.1";
111 pub const RWS_DEFAULT_PORT: &'static i32 = &7878;
112 pub const RWS_DEFAULT_THREAD_COUNT: &'static i32 = &200;
113 pub const RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static i64 = &10000;
114
115
116}
117
118pub fn bootstrap() {
119 read_system_environment_variables();
120 override_environment_variables_from_config(None);
121 override_environment_variables_from_command_line_args();
122}
123
124pub fn set_default_values() {
125 println!(" Initializing default values");
126
127 let is_var_set = env::var(Config::RWS_CONFIG_IP).is_ok();
128 if !is_var_set {
129 env::set_var(Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
130 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
131 } else {
132 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_IP);
133 }
134
135
136 let is_var_set = env::var(Config::RWS_CONFIG_PORT).is_ok();
137 if !is_var_set {
138 env::set_var(Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
139 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
140 } else {
141 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_PORT);
142 }
143
144 let is_var_set = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES).is_ok();
145 if !is_var_set {
146 env::set_var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
147 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
148 } else {
149 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
150 }
151
152
153 let is_var_set = env::var(Config::RWS_CONFIG_THREAD_COUNT).is_ok();
154 if !is_var_set {
155 env::set_var(Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
156 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
157 } else {
158 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_THREAD_COUNT);
159 }
160
161 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ALL).is_ok();
162 if !is_var_set {
163 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
164 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
165 } else {
166 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ALL);
167 }
168
169
170 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS).is_ok();
171 if !is_var_set {
172 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
173 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
174 } else {
175 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS);
176 }
177
178 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS).is_ok();
179 if !is_var_set {
180 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
181 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
182 } else {
183 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS);
184 }
185
186 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS).is_ok();
187 if !is_var_set {
188 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
189 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
190 } else {
191 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_HEADERS);
192 }
193
194
195 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_METHODS).is_ok();
196 if !is_var_set {
197 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
198 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
199 } else {
200 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_METHODS);
201 }
202
203 let is_var_set = env::var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS).is_ok();
204 if !is_var_set {
205 env::set_var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
206 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
207 } else {
208 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS);
209 }
210
211 let is_var_set = env::var(Config::RWS_CONFIG_CORS_MAX_AGE).is_ok();
212 if !is_var_set {
213 env::set_var(Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
214 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
215 } else {
216 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_MAX_AGE);
217 }
218
219
220 let is_var_set = env::var(Config::RWS_CONFIG_TLS_CERT_FILE).is_ok();
221 if !is_var_set {
222 env::set_var(Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
223 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
224 } else {
225 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_TLS_CERT_FILE);
226 }
227
228 let is_var_set = env::var(Config::RWS_CONFIG_TLS_KEY_FILE).is_ok();
229 if !is_var_set {
230 env::set_var(Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
231 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
232 } else {
233 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_TLS_KEY_FILE);
234 }
235
236 let is_var_set = env::var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT).is_ok();
237 if !is_var_set {
238 env::set_var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
239 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
240 } else {
241 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_HTTP_REDIRECT_PORT);
242 }
243
244 let is_var_set = env::var(Config::RWS_CONFIG_LOG_FORMAT).is_ok();
245 if !is_var_set {
246 env::set_var(Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
247 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
248 } else {
249 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_LOG_FORMAT);
250 }
251
252 println!(" End of initializing default values\n");
253}
254
255
256pub fn get_ip_port_thread_count() -> (String, i32, i32) {
257 let mut ip : String = Config::RWS_CONFIG_IP_DEFAULT_VALUE.to_string();
258 let mut port: i32 = *Config::RWS_DEFAULT_PORT;
259 let mut thread_count: i32 = *Config::RWS_DEFAULT_THREAD_COUNT;
260
261 let boxed_ip = env::var(Config::RWS_CONFIG_IP);
262 if boxed_ip.is_ok() {
263 ip = boxed_ip.unwrap()
264 }
265
266 let boxed_port = env::var(Config::RWS_CONFIG_PORT);
267 if boxed_port.is_ok() {
268 let _port = boxed_port.unwrap();
269 let boxed_parse = _port.parse::<i32>();
270 if boxed_parse.is_ok() {
271 port = boxed_parse.unwrap();
272 } else {
273 eprintln!("unable to parse port value, expected number, got {}, variable: {}",
274 _port, Config::RWS_CONFIG_PORT);
275 }
276 } else {
277 eprintln!("unable to parse port value, variable: {}", Config::RWS_CONFIG_PORT);
278 }
279
280 let boxed_thread_count = env::var(Config::RWS_CONFIG_THREAD_COUNT);
281 if boxed_thread_count.is_ok() {
282 let _thread_count = boxed_thread_count.unwrap();
283 let boxed_parse = _thread_count.parse();
284 if boxed_parse.is_ok() {
285 thread_count = boxed_parse.unwrap()
286 } else {
287 eprintln!("unable to parse thread count value, expected number, got {}, variable: {}",
288 thread_count, Config::RWS_CONFIG_THREAD_COUNT);
289 }
290
291 } else {
292 eprintln!("unable to parse thread count value, variable: {}", Config::RWS_CONFIG_THREAD_COUNT);
293 }
294
295 (ip, port, thread_count)
296}
297
298pub fn get_virtual_hosts() -> Vec<VirtualHostConfig> {
304 let mut hosts = Vec::new();
305 let mut i = 0usize;
306 loop {
307 match env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_DOMAIN", i)) {
308 Err(_) => break,
309 Ok(domain) => {
310 let cert_file = env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_CERT_FILE", i))
311 .unwrap_or_default();
312 let key_file = env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_KEY_FILE", i))
313 .unwrap_or_default();
314 hosts.push(VirtualHostConfig { domain, cert_file, key_file });
315 i += 1;
316 }
317 }
318 }
319 hosts
320}
321
322pub fn get_request_allocation_size() -> i64 {
323 let mut request_allocation_size: i64 = *Config::RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES;
324
325 let boxed_port = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
326 if boxed_port.is_ok() {
327 let _request_allocation_size = boxed_port.unwrap();
328 let boxed_parse = _request_allocation_size.parse::<i64>();
329 if boxed_parse.is_ok() {
330 request_allocation_size = boxed_parse.unwrap();
331 } else {
332 eprintln!("unable to parse port value, expected number, got {}, variable: {}",
333 _request_allocation_size, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
334 }
335 } else {
336 eprintln!("unable to parse request allocation size value, variable: {}", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
337 }
338
339
340 request_allocation_size
341}
342