use actix_web::HttpRequest;
use crate::middleware::env_request::{EnvRequest, EnvRequestHttp, EnvRequestWs};
use std::collections::HashMap;
pub fn parse_env_request(req: &HttpRequest) -> Option<EnvRequest> {
let mut headers = HashMap::new();
for (key, value) in req.headers().iter() {
if let Ok(val) = value.to_str() {
headers.insert(key.to_string(), val.to_string());
}
}
let host = req
.headers()
.get("host")
.and_then(|v| v.to_str().ok())
.unwrap_or_default()
.to_string();
let ip = req.connection_info().realip_remote_addr().map(|s| s.to_string());
let method = req.method().to_string();
let path = req.path().to_string();
let is_ws = req
.headers()
.get("upgrade")
.and_then(|v| v.to_str().ok())
.map(|v| v.eq_ignore_ascii_case("websocket"))
.unwrap_or(false);
if is_ws {
log::debug!("this.env parser: websocket request parsed");
Some(EnvRequest::Ws(EnvRequestWs {
host,
ip,
headers,
payload: None,
}))
} else {
log::debug!("this.env parser: http request parsed");
Some(EnvRequest::Http(EnvRequestHttp {
host,
ip,
method,
path,
headers,
}))
}
}