Skip to main content

rust_web_server/entry_point/
mod.rs

1#[cfg(test)]
2mod tests;
3pub mod command_line_args;
4pub mod config_file;
5pub mod environment_variables;
6
7
8use std::{env};
9
10use crate::entry_point::command_line_args::{override_environment_variables_from_command_line_args};
11use crate::entry_point::config_file::override_environment_variables_from_config;
12use crate::entry_point::environment_variables::read_system_environment_variables;
13
14#[derive(PartialEq, Eq, Clone, Debug)]
15pub struct Config {}
16
17impl Config {
18    pub const RWS_CONFIG_IP: &'static str = "RWS_CONFIG_IP";
19    /// Default is `0.0.0.0` so the server is reachable inside containers and K8s pods.
20    /// For local development you can override to `127.0.0.1` via env var or config file.
21    pub const RWS_CONFIG_IP_DEFAULT_VALUE: &'static str = "0.0.0.0";
22
23    /// Log format: `"combined"` (default, Combined Log Format) or `"json"` (structured JSON).
24    pub const RWS_CONFIG_LOG_FORMAT: &'static str = "RWS_CONFIG_LOG_FORMAT";
25    pub const RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE: &'static str = "json";
26
27    pub const RWS_CONFIG_PORT: &'static str = "RWS_CONFIG_PORT";
28    pub const RWS_CONFIG_PORT_DEFAULT_VALUE: &'static str = "7878";
29
30    pub const RWS_CONFIG_THREAD_COUNT: &'static str = "RWS_CONFIG_THREAD_COUNT";
31    pub const RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE: &'static str = "200";
32
33    pub const RWS_CONFIG_CORS_ALLOW_ALL: &'static str = "RWS_CONFIG_CORS_ALLOW_ALL";
34    pub const RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE: &'static str = "true";
35
36    pub const RWS_CONFIG_CORS_ALLOW_ORIGINS: &'static str = "RWS_CONFIG_CORS_ALLOW_ORIGINS";
37    pub const RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE: &'static str = "";
38
39    pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS: &'static str = "RWS_CONFIG_CORS_ALLOW_CREDENTIALS";
40    pub const RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE: &'static str = "";
41
42    pub const RWS_CONFIG_CORS_ALLOW_HEADERS: &'static str = "RWS_CONFIG_CORS_ALLOW_HEADERS";
43    pub const RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE: &'static str = "";
44
45    pub const RWS_CONFIG_CORS_ALLOW_METHODS: &'static str = "RWS_CONFIG_CORS_ALLOW_METHODS";
46    pub const RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE: &'static str = "";
47
48    pub const RWS_CONFIG_CORS_EXPOSE_HEADERS: &'static str = "RWS_CONFIG_CORS_EXPOSE_HEADERS";
49    pub const RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE: &'static str = "";
50
51    pub const RWS_CONFIG_CORS_MAX_AGE: &'static str = "RWS_CONFIG_CORS_MAX_AGE";
52    pub const RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE: &'static str = "86400";
53
54    pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static str = "RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES";
55    pub const RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE: &'static str = "10000";
56
57    pub const RWS_CONFIG_TLS_CERT_FILE: &'static str = "RWS_CONFIG_TLS_CERT_FILE";
58    pub const RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE: &'static str = "";
59
60    pub const RWS_CONFIG_TLS_KEY_FILE: &'static str = "RWS_CONFIG_TLS_KEY_FILE";
61    pub const RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE: &'static str = "";
62
63    /// When non-empty, a plain-HTTP listener on this port redirects all requests to HTTPS.
64    /// Set to e.g. `"80"` when running on standard ports. Requires TLS to be configured.
65    pub const RWS_CONFIG_HTTP_REDIRECT_PORT: &'static str = "RWS_CONFIG_HTTP_REDIRECT_PORT";
66    pub const RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE: &'static str = "";
67
68
69    pub const RWS_DEFAULT_IP: &'static str = "127.0.0.1";
70    pub const RWS_DEFAULT_PORT: &'static i32 = &7878;
71    pub const RWS_DEFAULT_THREAD_COUNT: &'static i32 = &200;
72    pub const RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES: &'static i64 = &10000;
73
74
75}
76
77pub fn bootstrap() {
78    read_system_environment_variables();
79    override_environment_variables_from_config(None);
80    override_environment_variables_from_command_line_args();
81}
82
83pub fn set_default_values() {
84    println!("  Initializing default values");
85
86    let is_var_set = env::var(Config::RWS_CONFIG_IP).is_ok();
87    if !is_var_set {
88        env::set_var(Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
89        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_IP, Config::RWS_CONFIG_IP_DEFAULT_VALUE);
90    } else {
91        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_IP);
92    }
93
94
95    let is_var_set = env::var(Config::RWS_CONFIG_PORT).is_ok();
96    if !is_var_set {
97        env::set_var(Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
98        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_PORT, Config::RWS_CONFIG_PORT_DEFAULT_VALUE);
99    } else {
100        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_PORT);
101    }
102
103    let is_var_set = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES).is_ok();
104    if !is_var_set {
105        env::set_var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
106        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES_DEFAULT_VALUE);
107    } else {
108        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
109    }
110
111
112    let is_var_set = env::var(Config::RWS_CONFIG_THREAD_COUNT).is_ok();
113    if !is_var_set {
114        env::set_var(Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
115        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_THREAD_COUNT, Config::RWS_CONFIG_THREAD_COUNT_DEFAULT_VALUE);
116    } else {
117        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_THREAD_COUNT);
118    }
119
120    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ALL).is_ok();
121    if !is_var_set {
122        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
123        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ALL, Config::RWS_CONFIG_CORS_ALLOW_ALL_DEFAULT_VALUE);
124    } else {
125        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ALL);
126    }
127
128
129    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS).is_ok();
130    if !is_var_set {
131        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
132        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS, Config::RWS_CONFIG_CORS_ALLOW_ORIGINS_DEFAULT_VALUE);
133    } else {
134        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_ORIGINS);
135    }
136
137    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS).is_ok();
138    if !is_var_set {
139        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
140        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS, Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS_DEFAULT_VALUE);
141    } else {
142        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_CREDENTIALS);
143    }
144
145    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS).is_ok();
146    if !is_var_set {
147        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
148        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_HEADERS, Config::RWS_CONFIG_CORS_ALLOW_HEADERS_DEFAULT_VALUE);
149    } else {
150        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_HEADERS);
151    }
152
153
154    let is_var_set = env::var(Config::RWS_CONFIG_CORS_ALLOW_METHODS).is_ok();
155    if !is_var_set {
156        env::set_var(Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
157        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_ALLOW_METHODS, Config::RWS_CONFIG_CORS_ALLOW_METHODS_DEFAULT_VALUE);
158    } else {
159        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_ALLOW_METHODS);
160    }
161
162    let is_var_set = env::var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS).is_ok();
163    if !is_var_set {
164        env::set_var(Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
165        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS, Config::RWS_CONFIG_CORS_EXPOSE_HEADERS_DEFAULT_VALUE);
166    } else {
167        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_EXPOSE_HEADERS);
168    }
169
170    let is_var_set = env::var(Config::RWS_CONFIG_CORS_MAX_AGE).is_ok();
171    if !is_var_set {
172        env::set_var(Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
173        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_CORS_MAX_AGE, Config::RWS_CONFIG_CORS_MAX_AGE_DEFAULT_VALUE);
174    } else {
175        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_CORS_MAX_AGE);
176    }
177
178
179    let is_var_set = env::var(Config::RWS_CONFIG_TLS_CERT_FILE).is_ok();
180    if !is_var_set {
181        env::set_var(Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
182        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_TLS_CERT_FILE, Config::RWS_CONFIG_TLS_CERT_FILE_DEFAULT_VALUE);
183    } else {
184        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_TLS_CERT_FILE);
185    }
186
187    let is_var_set = env::var(Config::RWS_CONFIG_TLS_KEY_FILE).is_ok();
188    if !is_var_set {
189        env::set_var(Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
190        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_TLS_KEY_FILE, Config::RWS_CONFIG_TLS_KEY_FILE_DEFAULT_VALUE);
191    } else {
192        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_TLS_KEY_FILE);
193    }
194
195    let is_var_set = env::var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT).is_ok();
196    if !is_var_set {
197        env::set_var(Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
198        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_HTTP_REDIRECT_PORT, Config::RWS_CONFIG_HTTP_REDIRECT_PORT_DEFAULT_VALUE);
199    } else {
200        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_HTTP_REDIRECT_PORT);
201    }
202
203    let is_var_set = env::var(Config::RWS_CONFIG_LOG_FORMAT).is_ok();
204    if !is_var_set {
205        env::set_var(Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
206        println!("    Default value  for '{}' is '{}'", Config::RWS_CONFIG_LOG_FORMAT, Config::RWS_CONFIG_LOG_FORMAT_DEFAULT_VALUE);
207    } else {
208        println!("    There is an environment variable  for '{}', default value won't be set", Config::RWS_CONFIG_LOG_FORMAT);
209    }
210
211    println!("  End of initializing default values\n");
212}
213
214
215pub fn get_ip_port_thread_count() -> (String, i32, i32) {
216    let mut ip : String = Config::RWS_CONFIG_IP_DEFAULT_VALUE.to_string();
217    let mut port: i32 = *Config::RWS_DEFAULT_PORT;
218    let mut thread_count: i32 = *Config::RWS_DEFAULT_THREAD_COUNT;
219
220    let boxed_ip = env::var(Config::RWS_CONFIG_IP);
221    if boxed_ip.is_ok() {
222        ip = boxed_ip.unwrap()
223    }
224
225    let boxed_port = env::var(Config::RWS_CONFIG_PORT);
226    if boxed_port.is_ok() {
227        let _port = boxed_port.unwrap();
228        let boxed_parse = _port.parse::<i32>();
229        if boxed_parse.is_ok() {
230            port = boxed_parse.unwrap();
231        } else {
232            eprintln!("unable to parse port value, expected number, got {}, variable: {}",
233                      _port, Config::RWS_CONFIG_PORT);
234        }
235    } else {
236        eprintln!("unable to parse port value, variable: {}", Config::RWS_CONFIG_PORT);
237    }
238
239    let boxed_thread_count = env::var(Config::RWS_CONFIG_THREAD_COUNT);
240    if boxed_thread_count.is_ok() {
241        let _thread_count = boxed_thread_count.unwrap();
242        let boxed_parse = _thread_count.parse();
243        if boxed_parse.is_ok() {
244            thread_count = boxed_parse.unwrap()
245        } else {
246            eprintln!("unable to parse thread count value, expected number, got {}, variable: {}",
247                      thread_count, Config::RWS_CONFIG_THREAD_COUNT);
248        }
249
250    } else {
251        eprintln!("unable to parse thread count value, variable: {}", Config::RWS_CONFIG_THREAD_COUNT);
252    }
253
254    (ip, port, thread_count)
255}
256
257pub fn get_request_allocation_size() -> i64 {
258    let mut request_allocation_size: i64 = *Config::RWS_DEFAULT_REQUEST_ALLOCATION_SIZE_IN_BYTES;
259
260    let boxed_port = env::var(Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
261    if boxed_port.is_ok() {
262        let _request_allocation_size = boxed_port.unwrap();
263        let boxed_parse = _request_allocation_size.parse::<i64>();
264        if boxed_parse.is_ok() {
265            request_allocation_size = boxed_parse.unwrap();
266        } else {
267            eprintln!("unable to parse port value, expected number, got {}, variable: {}",
268                      _request_allocation_size, Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
269        }
270    } else {
271        eprintln!("unable to parse request allocation size value, variable: {}", Config::RWS_CONFIG_REQUEST_ALLOCATION_SIZE_IN_BYTES);
272    }
273
274
275    request_allocation_size
276}
277