gato_apache_cgi/
apache_http_core.rs

1use 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        // Get RouterHandler Driver
26        let router_handler = RouterHandler::get_driver();
27
28        // Create RequestBuilder
29        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        // Get Response from RouterHandle
36        let response = router_handler.handle(&mut request);
37        // Get Response Headers
38        let response_headers = response.get_headers();
39        // Print Apache Status Code
40        print!("Status: {}\n", response.get_code());
41        // Send to Apache the HEADERS
42        for header in response_headers {
43            print!("{}: {}\n", header.0, header.1);
44        }
45        // Send to Apache the BODY
46        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        // Get from std::cin the POST DATA as String
69        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}