1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use std::env;
use std::collections::HashMap;
use gato_core::kernel::{HttpCore, RouterHandler, Logger, RequestBuilder};
pub struct ApacheHttpCore { }
impl ApacheHttpCore {
pub fn new() -> ApacheHttpCore {
return ApacheHttpCore { };
}
fn first_letter_to_upper_case (&self, s1: String) -> String {
let mut c = s1.chars();
match c.next() {
None => String::new(),
Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
}
}
}
impl HttpCore for ApacheHttpCore {
fn handle(&self) {
Logger::info("ApacheHttpCore[handle]");
let router_handler = RouterHandler::get_driver();
let mut request = RequestBuilder::new();
request.add_method(env::var("REQUEST_METHOD").unwrap_or("GET".to_string()));
request.add_uri(env::var("REQUEST_URI").unwrap_or("/".to_string()));
request.add_body(self.get_post_data());
request.add_headers(self.get_request_headers());
let response = router_handler.handle(&mut request);
let response_headers = response.get_headers();
print!("Status: {}\n", response.get_code());
for header in response_headers {
print!("{}: {}\n", header.0, header.1);
}
print!("\n{}", response.get_body());
}
fn get_request_headers(&self) -> HashMap<String, String> {
let mut request_headers: HashMap<String, String> = HashMap::new();
let vars: Vec<_> = env::vars().collect();
for arg in vars {
if arg.0.starts_with("HTTP_") || arg.0 == "CONTENT_TYPE" || arg.0 == "CONTENT_LENGTH" {
let mut name = vec![];
let tmp = arg.0.replace("HTTP_", "");
let names = tmp.split("_");
for n in names {
name.push(self.first_letter_to_upper_case(n.to_lowercase()));
}
request_headers.insert(name.join("-"), arg.1);
}
}
return request_headers;
}
fn get_post_data(&self) -> String {
let mut post_tmp = "".to_string();
loop {
let mut line = String::new();
let result = std::io::stdin().read_line(&mut line);
if result.is_err() || line.is_empty() {
break;
}
post_tmp += line.as_str();
}
return post_tmp;
}
}