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