cargo fmt
This commit is contained in:
111
src/http.rs
111
src/http.rs
@ -1,34 +1,62 @@
|
||||
use hyper::{Request, Response, Body, StatusCode, header, Method, body};
|
||||
use serde_json::{Value, Map};
|
||||
use crate::websocket;
|
||||
use crate::usimp::*;
|
||||
use crate::error::*;
|
||||
use crate::usimp;
|
||||
use crate::usimp::*;
|
||||
use crate::websocket;
|
||||
use hyper::{body, header, Body, Method, Request, Response, StatusCode};
|
||||
use serde_json::{Map, Value};
|
||||
use std::str::FromStr;
|
||||
|
||||
async fn endpoint_handler(req: &mut Request<Body>, endpoint: String) -> Result<Option<OutputEnvelope>, Error> {
|
||||
async fn endpoint_handler(
|
||||
req: &mut Request<Body>,
|
||||
endpoint: String,
|
||||
) -> Result<Option<OutputEnvelope>, Error> {
|
||||
if req.method() == Method::OPTIONS {
|
||||
return Ok(None)
|
||||
return Ok(None);
|
||||
} else if req.method() != Method::POST {
|
||||
return Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None))
|
||||
return Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
));
|
||||
}
|
||||
|
||||
let to_domain;
|
||||
if let Some(val) = req.headers().get(header::HeaderName::from_str("To-Domain").unwrap()) {
|
||||
if let Some(val) = req
|
||||
.headers()
|
||||
.get(header::HeaderName::from_str("To-Domain").unwrap())
|
||||
{
|
||||
to_domain = val.to_str().unwrap().to_string()
|
||||
} else {
|
||||
return Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None))
|
||||
return Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
));
|
||||
}
|
||||
|
||||
if let Some(val) = req.headers().get(header::CONTENT_TYPE) {
|
||||
let parts: Vec<String> = val.to_str()?.split(';').map(|v| v.trim().to_ascii_lowercase()).collect();
|
||||
let parts: Vec<String> = val
|
||||
.to_str()?
|
||||
.split(';')
|
||||
.map(|v| v.trim().to_ascii_lowercase())
|
||||
.collect();
|
||||
let p: Vec<&str> = parts.iter().map(|v| v.as_str()).collect();
|
||||
match p[0..1] {
|
||||
["application/json"] => {},
|
||||
_ => return Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None))
|
||||
["application/json"] => {}
|
||||
_ => {
|
||||
return Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None))
|
||||
return Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
));
|
||||
}
|
||||
|
||||
let data = serde_json::from_slice(&body::to_bytes(req.body_mut()).await?)?;
|
||||
@ -36,7 +64,10 @@ async fn endpoint_handler(req: &mut Request<Body>, endpoint: String) -> Result<O
|
||||
let input = InputEnvelope {
|
||||
endpoint,
|
||||
to_domain,
|
||||
from_domain: match req.headers().get(header::HeaderName::from_str("From-Domain").unwrap()) {
|
||||
from_domain: match req
|
||||
.headers()
|
||||
.get(header::HeaderName::from_str("From-Domain").unwrap())
|
||||
{
|
||||
Some(val) => Some(val.to_str()?.to_string()),
|
||||
None => None,
|
||||
},
|
||||
@ -47,9 +78,13 @@ async fn endpoint_handler(req: &mut Request<Body>, endpoint: String) -> Result<O
|
||||
if val.starts_with("usimp ") {
|
||||
Some(val[6..].to_string())
|
||||
} else {
|
||||
return Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None))
|
||||
return Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
));
|
||||
}
|
||||
},
|
||||
}
|
||||
None => None,
|
||||
},
|
||||
data,
|
||||
@ -65,7 +100,10 @@ pub async fn handler(mut req: Request<Body>) -> Result<Response<Body>, hyper::Er
|
||||
println!("{} {}", req.method(), req.uri());
|
||||
|
||||
let val: Result<Response<Body>, Error> = match &parts[..] {
|
||||
[""] => Ok(res.status(StatusCode::OK).body(Body::from("Hello World")).unwrap()),
|
||||
[""] => Ok(res
|
||||
.status(StatusCode::OK)
|
||||
.body(Body::from("Hello World"))
|
||||
.unwrap()),
|
||||
["_usimp"] | ["_usimp", ..] => {
|
||||
res = res
|
||||
.header(header::SERVER, "Locutus")
|
||||
@ -75,23 +113,29 @@ pub async fn handler(mut req: Request<Body>) -> Result<Response<Body>, hyper::Er
|
||||
|
||||
let output = match &parts[1..] {
|
||||
["websocket"] => {
|
||||
res = res
|
||||
.header(header::ACCESS_CONTROL_ALLOW_METHODS, "GET");
|
||||
res = res.header(header::ACCESS_CONTROL_ALLOW_METHODS, "GET");
|
||||
let (r, val) = websocket::handler(req, res).await;
|
||||
res = r;
|
||||
match val {
|
||||
Some(val) => Ok(Some(val)),
|
||||
None => return Ok(res.body(Body::empty()).unwrap()),
|
||||
}
|
||||
},
|
||||
}
|
||||
[endpoint] => {
|
||||
res = res
|
||||
.header(header::ACCESS_CONTROL_ALLOW_METHODS, "POST, OPTIONS")
|
||||
.header(header::ACCESS_CONTROL_ALLOW_HEADERS, "Content-Type, From-Domain, To-Domain, Authorization");
|
||||
.header(
|
||||
header::ACCESS_CONTROL_ALLOW_HEADERS,
|
||||
"Content-Type, From-Domain, To-Domain, Authorization",
|
||||
);
|
||||
let endpoint = endpoint.to_string();
|
||||
endpoint_handler(&mut req, endpoint).await
|
||||
},
|
||||
_ => Err(Error::new(ErrorKind::UsimpError, ErrorClass::ClientProtocolError, None)),
|
||||
}
|
||||
_ => Err(Error::new(
|
||||
ErrorKind::UsimpError,
|
||||
ErrorClass::ClientProtocolError,
|
||||
None,
|
||||
)),
|
||||
};
|
||||
|
||||
let output = match output {
|
||||
@ -107,15 +151,17 @@ pub async fn handler(mut req: Request<Body>) -> Result<Response<Body>, hyper::Er
|
||||
Some(error) => {
|
||||
res = match error.class {
|
||||
ErrorClass::ClientProtocolError => res.status(StatusCode::BAD_REQUEST),
|
||||
ErrorClass::ServerError => res.status(StatusCode::INTERNAL_SERVER_ERROR),
|
||||
ErrorClass::ServerError => {
|
||||
res.status(StatusCode::INTERNAL_SERVER_ERROR)
|
||||
}
|
||||
_ => res.status(StatusCode::OK),
|
||||
};
|
||||
data["status"] = Value::from("error");
|
||||
data["error"] = Value::from(error);
|
||||
},
|
||||
}
|
||||
None => {
|
||||
data["status"] = Value::from("success");
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
data["request_nr"] = match output.request_nr {
|
||||
@ -123,14 +169,19 @@ pub async fn handler(mut req: Request<Body>) -> Result<Response<Body>, hyper::Er
|
||||
None => Value::Null,
|
||||
};
|
||||
data["data"] = output.data;
|
||||
return Ok(res.body(Body::from(serde_json::to_string(&data).unwrap() + "\r\n")).unwrap())
|
||||
return Ok(res
|
||||
.body(Body::from(serde_json::to_string(&data).unwrap() + "\r\n"))
|
||||
.unwrap());
|
||||
} else {
|
||||
res = res.status(StatusCode::NO_CONTENT);
|
||||
}
|
||||
|
||||
return Ok(res.body(Body::empty()).unwrap())
|
||||
},
|
||||
_ => Ok(res.status(StatusCode::NOT_FOUND).body(Body::empty()).unwrap()),
|
||||
return Ok(res.body(Body::empty()).unwrap());
|
||||
}
|
||||
_ => Ok(res
|
||||
.status(StatusCode::NOT_FOUND)
|
||||
.body(Body::empty())
|
||||
.unwrap()),
|
||||
};
|
||||
|
||||
match val {
|
||||
|
Reference in New Issue
Block a user