1#[cfg(test)]
2mod tests;
3pub mod command_line_args;
4pub mod config_file;
5pub mod environment_variables;
6mod rws_env;
7pub use rws_env::RwsEnv;
8
9
10use std::{env};
11use crate::virtual_host::VirtualHostConfig;
12
13use crate::entry_point::command_line_args::{override_environment_variables_from_command_line_args};
14use crate::entry_point::config_file::override_environment_variables_from_config;
15use crate::entry_point::environment_variables::read_system_environment_variables;
16
17pub fn shown<'a>(name: &str, value: &'a str) -> std::borrow::Cow<'a, str> {
20 let upper = name.to_ascii_uppercase();
21 if ["SECRET", "PASSWORD", "TOKEN"].iter().any(|word| upper.contains(word)) && !value.is_empty() {
22 return std::borrow::Cow::Borrowed("(hidden)");
23 }
24 if let Some(at) = value.find("pin-value=") {
26 let start = at + "pin-value=".len();
27 let end = value[start..].find(['&', ';']).map_or(value.len(), |n| start + n);
28 return std::borrow::Cow::Owned(format!("{}(hidden){}", &value[..start], &value[end..]));
29 }
30 std::borrow::Cow::Borrowed(value)
31}
32
33#[derive(PartialEq, Eq, Clone, Debug)]
34pub struct Config {}
35
36impl Config {
37 pub const RWS_CONFIG_IP: &'static str = "RWS_CONFIG_IP";
38 pub const RWS_CONFIG_IP_DEFAULT_VALUE: &'static str = "0.0.0.0";
41
42 pub const RWS_CONFIG_LOG_FORMAT: &'static str = "RWS_CONFIG_LOG_FORMAT";
44 pub const RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE: &'static str = "json";
45
46 pub const RWS_CONFIG_PORT: &'static str = "RWS_CONFIG_PORT";
47 pub const RWS_CONFIG_PORT_DEFAULT_VALUE: &'static str = "7878";
48
49 pub const RWS_CONFIG_THREAD_COUNT: &'static str = "RWS_CONFIG_THREAD_COUNT";
50 pub const RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE: &'static str = "200";
51
52 pub const RWS_CONFIG_CORS_ALLOW_ALL: &'static str = "RWS_CONFIG_CORS_ALLOW_ALL";
53 pub const RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE: &'static str = "false";
54
55 pub const RWS_CONFIG_CORS_ALLOW_ORIGINS: &'static str = "RWS_CONFIG_CORS_ALLOW_ORIGINS";
56 pub const RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE: &'static str = "";
57
58 pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS: &'static str = "RWS_CONFIG_CORS_ALLOW_CREDENTIALS";
59 pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE: &'static str = "";
60
61 pub const RWS_CONFIG_CORS_ALLOW_HEADERS: &'static str = "RWS_CONFIG_CORS_ALLOW_HEADERS";
62 pub const RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE: &'static str = "";
63
64 pub const RWS_CONFIG_CORS_ALLOW_METHODS: &'static str = "RWS_CONFIG_CORS_ALLOW_METHODS";
65 pub const RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE: &'static str = "";
66
67 pub const RWS_CONFIG_CORS_EXPOSE_HEADERS: &'static str = "RWS_CONFIG_CORS_EXPOSE_HEADERS";
68 pub const RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE: &'static str = "";
69
70 pub const RWS_CONFIG_CORS_MAX_AGE: &'static str = "RWS_CONFIG_CORS_MAX_AGE";
71 pub const RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE: &'static str = "86400";
72
73 pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static str = "RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES";
74 pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE: &'static str = "10000";
75
76 pub const RWS_CONFIG_MAX_BODY_SIZE_IN_BYTES: &'static str = "RWS_CONFIG_MAX_BODY_SIZE_IN_BYTES";
83 pub const RWS_CONFIG_MAX_BODY_SIZE_IN_BYTES_DEFAULT_VALUE: &'static str = "0";
84
85 pub const RWS_CONFIG_SPA_FALLBACK: &'static str = "RWS_CONFIG_SPA_FALLBACK";
92 pub const RWS_CONFIG_SPA_FALLBACK_DEFAULT_VALUE: &'static str = "";
93
94 pub const RWS_CONFIG_SPA_FALLBACK_EXCLUDE_PREFIXES: &'static str = "RWS_CONFIG_SPA_FALLBACK_EXCLUDE_PREFIXES";
98 pub const RWS_CONFIG_SPA_FALLBACK_EXCLUDE_PREFIXES_DEFAULT_VALUE: &'static str = "";
99
100 pub const RWS_CONFIG_TLS_CERT_FILE: &'static str = "RWS_CONFIG_TLS_CERT_FILE";
101 pub const RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE: &'static str = "";
102
103 pub const RWS_CONFIG_TLS_KEY_FILE: &'static str = "RWS_CONFIG_TLS_KEY_FILE";
104 pub const RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE: &'static str = "";
105
106 pub const RWS_CONFIG_TLS_CLIENT_CA_FILE: &'static str = "RWS_CONFIG_TLS_CLIENT_CA_FILE";
110 pub const RWS_CONFIG_TLS_CLIENT_CA_FILE_DEFAULT_VALUE: &'static str = "";
111
112 pub const RWS_CONFIG_TEMPLATE_DIR: &'static str = "RWS_CONFIG_TEMPLATE_DIR";
114 pub const RWS_CONFIG_TEMPLATE_DIR_DEFAULT_VALUE: &'static str = "templates";
115
116 pub const RWS_CONFIG_HTTP_REDIRECT_PORT: &'static str = "RWS_CONFIG_HTTP_REDIRECT_PORT";
119 pub const RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE: &'static str = "";
120
121 pub const RWS_CONFIG_ACME_DOMAINS: &'static str = "RWS_CONFIG_ACME_DOMAINS";
126 pub const RWS_CONFIG_ACME_DOMAINS_DEFAULT_VALUE: &'static str = "";
127
128 pub const RWS_CONFIG_ACME_EMAIL: &'static str = "RWS_CONFIG_ACME_EMAIL";
130 pub const RWS_CONFIG_ACME_EMAIL_DEFAULT_VALUE: &'static str = "";
131
132 pub const RWS_CONFIG_ACME_STAGING: &'static str = "RWS_CONFIG_ACME_STAGING";
134 pub const RWS_CONFIG_ACME_STAGING_DEFAULT_VALUE: &'static str = "false";
135
136 pub const RWS_CONFIG_ACME_DIRECTORY: &'static str = "RWS_CONFIG_ACME_DIRECTORY";
138 pub const RWS_CONFIG_ACME_DIRECTORY_DEFAULT_VALUE: &'static str = "";
139
140 pub const RWS_CONFIG_ACME_CERT_PATH: &'static str = "RWS_CONFIG_ACME_CERT_PATH";
143 pub const RWS_CONFIG_ACME_CERT_PATH_DEFAULT_VALUE: &'static str = "";
144
145 pub const RWS_CONFIG_ACME_KEY_PATH: &'static str = "RWS_CONFIG_ACME_KEY_PATH";
148 pub const RWS_CONFIG_ACME_KEY_PATH_DEFAULT_VALUE: &'static str = "";
149
150 pub const RWS_CONFIG_ACME_CHALLENGE_PORT: &'static str = "RWS_CONFIG_ACME_CHALLENGE_PORT";
153 pub const RWS_CONFIG_ACME_CHALLENGE_PORT_DEFAULT_VALUE: &'static str = "80";
154
155 pub const RWS_CONFIG_ACME_RENEW_BEFORE_DAYS: &'static str = "RWS_CONFIG_ACME_RENEW_BEFORE_DAYS";
157 pub const RWS_CONFIG_ACME_RENEW_BEFORE_DAYS_DEFAULT_VALUE: &'static str = "";
160 pub const RWS_CONFIG_ACME_PROFILE: &'static str = "RWS_CONFIG_ACME_PROFILE";
161
162 pub const RWS_CONFIG_ACME_ACCOUNT_KEY_PATH: &'static str = "RWS_CONFIG_ACME_ACCOUNT_KEY_PATH";
164 pub const RWS_CONFIG_ACME_ACCOUNT_KEY_PATH_DEFAULT_VALUE: &'static str = "acme_account.key";
165
166 pub const RWS_CONFIG_ACME_CA_FILE: &'static str = "RWS_CONFIG_ACME_CA_FILE";
170 pub const RWS_CONFIG_ACME_CA_FILE_DEFAULT_VALUE: &'static str = "";
171
172 pub const RWS_CONFIG_ACME_RENEW_CHECK_INTERVAL_SECS: &'static str = "RWS_CONFIG_ACME_RENEW_CHECK_INTERVAL_SECS";
175 pub const RWS_CONFIG_ACME_RENEW_CHECK_INTERVAL_SECS_DEFAULT_VALUE: &'static str = "43200";
176
177 pub const RWS_CONFIG_ACME_CHALLENGE: &'static str = "RWS_CONFIG_ACME_CHALLENGE";
180 pub const RWS_CONFIG_ACME_DNS_PROVIDER: &'static str = "RWS_CONFIG_ACME_DNS_PROVIDER";
183 pub const RWS_CONFIG_ACME_DNS_SERVER: &'static str = "RWS_CONFIG_ACME_DNS_SERVER";
185 pub const RWS_CONFIG_ACME_DNS_ZONE: &'static str = "RWS_CONFIG_ACME_DNS_ZONE";
187 pub const RWS_CONFIG_ACME_DNS_TSIG_KEY: &'static str = "RWS_CONFIG_ACME_DNS_TSIG_KEY";
189 pub const RWS_CONFIG_ACME_DNS_TSIG_SECRET: &'static str = "RWS_CONFIG_ACME_DNS_TSIG_SECRET";
191 pub const RWS_CONFIG_ACME_DNS_TSIG_ALGORITHM: &'static str = "RWS_CONFIG_ACME_DNS_TSIG_ALGORITHM";
193 pub const RWS_CONFIG_ACME_DNS_EXEC: &'static str = "RWS_CONFIG_ACME_DNS_EXEC";
195 pub const RWS_CONFIG_ACME_DNS_PROPAGATION_SECS: &'static str = "RWS_CONFIG_ACME_DNS_PROPAGATION_SECS";
197 pub const RWS_CONFIG_ACME_DNS_API_TOKEN: &'static str = "RWS_CONFIG_ACME_DNS_API_TOKEN";
199 pub const RWS_CONFIG_ACME_DNS_API_URL: &'static str = "RWS_CONFIG_ACME_DNS_API_URL";
202 pub const RWS_CONFIG_ACME_DNS_ZONE_ID: &'static str = "RWS_CONFIG_ACME_DNS_ZONE_ID";
204 pub const RWS_CONFIG_ACME_REDIS: &'static str = "RWS_CONFIG_ACME_REDIS";
206 pub const RWS_CONFIG_ACME_REDIS_PASSWORD: &'static str = "RWS_CONFIG_ACME_REDIS_PASSWORD";
208 pub const RWS_CONFIG_ACME_REDIS_PREFIX: &'static str = "RWS_CONFIG_ACME_REDIS_PREFIX";
210 pub const RWS_CONFIG_ACME_ON_DEMAND: &'static str = "RWS_CONFIG_ACME_ON_DEMAND";
213 pub const RWS_CONFIG_ACME_ON_DEMAND_ASK: &'static str = "RWS_CONFIG_ACME_ON_DEMAND_ASK";
215 pub const RWS_CONFIG_ADMIN_LISTEN: &'static str = "RWS_CONFIG_ADMIN_LISTEN";
217 pub const RWS_CONFIG_ADMIN_TOKEN_ENV: &'static str = "RWS_CONFIG_ADMIN_TOKEN_ENV";
220 pub const RWS_CONFIG_ADMIN_ALLOWED_ORIGINS: &'static str = "RWS_CONFIG_ADMIN_ALLOWED_ORIGINS";
223
224
225 pub const RWS_DEFAULT_IP: &'static str = "127.0.0.1";
226 pub const RWS_DEFAULT_PORT: &'static i32 = &7878;
227 pub const RWS_DEFAULT_THREAD_COUNT: &'static i32 = &200;
228 pub const RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static i64 = &10000;
229
230
231}
232
233pub fn bootstrap() {
234 read_system_environment_variables();
235 override_environment_variables_from_config(None);
236 override_environment_variables_from_command_line_args();
237 crate::server_config::invalidate();
238}
239
240pub fn set_default_values() {
241 println!(" Initializing default values");
242
243 let is_var_set = env::var(Config::RWS_CONFIG_IP).is_ok();
244 if !is_var_set {
245 env::set_var(Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
246 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
247 } else {
248 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_IP);
249 }
250
251
252 let is_var_set = env::var(Config::RWS_CONFIG_PORT).is_ok();
253 if !is_var_set {
254 env::set_var(Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
255 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
256 } else {
257 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_PORT);
258 }
259
260 let is_var_set = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES).is_ok();
261 if !is_var_set {
262 env::set_var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
263 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
264 } else {
265 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
266 }
267
268
269 let is_var_set = env::var(Config::RWS_CONFIG_THREAD_COUNT).is_ok();
270 if !is_var_set {
271 env::set_var(Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
272 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
273 } else {
274 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_THREAD_COUNT);
275 }
276
277 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ALL).is_ok();
278 if !is_var_set {
279 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
280 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
281 } else {
282 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ALL);
283 }
284
285
286 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS).is_ok();
287 if !is_var_set {
288 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
289 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
290 } else {
291 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS);
292 }
293
294 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS).is_ok();
295 if !is_var_set {
296 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
297 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
298 } else {
299 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS);
300 }
301
302 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS).is_ok();
303 if !is_var_set {
304 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
305 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
306 } else {
307 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_HEADERS);
308 }
309
310
311 let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_METHODS).is_ok();
312 if !is_var_set {
313 env::set_var(Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
314 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
315 } else {
316 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_METHODS);
317 }
318
319 let is_var_set = env::var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS).is_ok();
320 if !is_var_set {
321 env::set_var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
322 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
323 } else {
324 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS);
325 }
326
327 let is_var_set = env::var(Config::RWS_CONFIG_CORS_MAX_AGE).is_ok();
328 if !is_var_set {
329 env::set_var(Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
330 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
331 } else {
332 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_CORS_MAX_AGE);
333 }
334
335
336 let is_var_set = env::var(Config::RWS_CONFIG_TLS_CERT_FILE).is_ok();
337 if !is_var_set {
338 env::set_var(Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
339 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
340 } else {
341 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_TLS_CERT_FILE);
342 }
343
344 let is_var_set = env::var(Config::RWS_CONFIG_TLS_KEY_FILE).is_ok();
345 if !is_var_set {
346 env::set_var(Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
347 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
348 } else {
349 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_TLS_KEY_FILE);
350 }
351
352 let is_var_set = env::var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT).is_ok();
353 if !is_var_set {
354 env::set_var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
355 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
356 } else {
357 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_HTTP_REDIRECT_PORT);
358 }
359
360 let is_var_set = env::var(Config::RWS_CONFIG_LOG_FORMAT).is_ok();
361 if !is_var_set {
362 env::set_var(Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
363 println!(" Default value for '{}' is '{}'", Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
364 } else {
365 println!(" There is an environment variable for '{}', default value won't be set", Config::RWS_CONFIG_LOG_FORMAT);
366 }
367
368 crate::server_config::invalidate();
369 println!(" End of initializing default values\n");
370}
371
372
373pub fn get_ip_port_thread_count() -> (String, i32, i32) {
374 let mut ip : String = Config::RWS_CONFIG_IP_DEFAULT_VALUE.to_string();
375 let mut port: i32 = *Config::RWS_DEFAULT_PORT;
376 let mut thread_count: i32 = *Config::RWS_DEFAULT_THREAD_COUNT;
377
378 let boxed_ip = env::var(Config::RWS_CONFIG_IP);
379 if boxed_ip.is_ok() {
380 ip = boxed_ip.unwrap()
381 }
382
383 let boxed_port = env::var(Config::RWS_CONFIG_PORT);
384 if boxed_port.is_ok() {
385 let _port = boxed_port.unwrap();
386 let boxed_parse = _port.parse::<i32>();
387 if boxed_parse.is_ok() {
388 port = boxed_parse.unwrap();
389 } else {
390 eprintln!("unable to parse port value, expected number, got {}, variable: {}",
391 _port, Config::RWS_CONFIG_PORT);
392 }
393 } else {
394 eprintln!("unable to parse port value, variable: {}", Config::RWS_CONFIG_PORT);
395 }
396
397 let boxed_thread_count = env::var(Config::RWS_CONFIG_THREAD_COUNT);
398 if boxed_thread_count.is_ok() {
399 let _thread_count = boxed_thread_count.unwrap();
400 let boxed_parse = _thread_count.parse();
401 if boxed_parse.is_ok() {
402 thread_count = boxed_parse.unwrap()
403 } else {
404 eprintln!("unable to parse thread count value, expected number, got {}, variable: {}",
405 thread_count, Config::RWS_CONFIG_THREAD_COUNT);
406 }
407
408 } else {
409 eprintln!("unable to parse thread count value, variable: {}", Config::RWS_CONFIG_THREAD_COUNT);
410 }
411
412 (ip, port, thread_count)
413}
414
415pub fn get_virtual_hosts() -> Vec<VirtualHostConfig> {
421 let mut hosts = Vec::new();
422 let mut i = 0usize;
423 loop {
424 match env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_DOMAIN", i)) {
425 Err(_) => break,
426 Ok(domain) => {
427 let cert_file = env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_CERT_FILE", i))
428 .unwrap_or_default();
429 let key_file = env::var(format!("RWS_CONFIG_VIRTUAL_HOST_{}_KEY_FILE", i))
430 .unwrap_or_default();
431 hosts.push(VirtualHostConfig { domain, cert_file, key_file });
432 i += 1;
433 }
434 }
435 }
436 hosts
437}
438
439pub fn get_request_allocation_size() -> i64 {
440 let mut request_allocation_size: i64 = *Config::RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES;
441
442 let boxed_port = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
443 if boxed_port.is_ok() {
444 let _request_allocation_size = boxed_port.unwrap();
445 let boxed_parse = _request_allocation_size.parse::<i64>();
446 if boxed_parse.is_ok() {
447 request_allocation_size = boxed_parse.unwrap();
448 } else {
449 eprintln!("unable to parse port value, expected number, got {}, variable: {}",
450 _request_allocation_size, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
451 }
452 } else {
453 eprintln!("unable to parse request allocation size value, variable: {}", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
454 }
455
456
457 request_allocation_size
458}
459
460pub fn get_max_body_size() -> u64 {
464 env::var(Config::RWS_CONFIG_MAX_BODY_SIZE_IN_BYTES)
465 .ok()
466 .and_then(|v| v.parse::<u64>().ok())
467 .unwrap_or(0)
468}
469
470pub fn get_spa_fallback() -> Option<String> {
475 env::var(Config::RWS_CONFIG_SPA_FALLBACK).ok().filter(|v| !v.is_empty())
476}
477
478pub fn get_spa_fallback_exclude_prefixes() -> Vec<String> {
481 env::var(Config::RWS_CONFIG_SPA_FALLBACK_EXCLUDE_PREFIXES)
482 .ok()
483 .map(|v| v.split(',').map(|s| s.trim().to_string()).filter(|s| !s.is_empty()).collect())
484 .unwrap_or_default()
485}
486