mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-26 07:19:22 +00:00
Update actix
This commit is contained in:
parent
4aa7657e28
commit
c874d1c964
1312
Cargo.lock
generated
1312
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
14
Cargo.toml
14
Cargo.toml
@ -9,13 +9,12 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
yaml-rust = "0.4.5"
|
yaml-rust = "0.4.5"
|
||||||
mysql = "22.1.0"
|
mysql = "22.1.0"
|
||||||
actix = "0.10.0"
|
actix = "0.13.0"
|
||||||
actix-web = "3.3.2"
|
actix-web = "4.0.1"
|
||||||
actix-files = "0.5.0"
|
actix-files = "0.6.0"
|
||||||
actix-rt = "1.1.1"
|
actix-multipart = "0.4.0"
|
||||||
actix-multipart = "0.3.0"
|
actix-web-actors = "4.1.0"
|
||||||
actix-web-actors = "3.0.0"
|
actix-http = "3.0.2"
|
||||||
actix-http = "2.2.0"
|
|
||||||
serde = { version = "1.0.123", features = ["derive"] }
|
serde = { version = "1.0.123", features = ["derive"] }
|
||||||
serde_json = "1.0.62"
|
serde_json = "1.0.62"
|
||||||
futures = "0.3.12"
|
futures = "0.3.12"
|
||||||
@ -41,6 +40,5 @@ mp4 = "0.9.2"
|
|||||||
zip = "0.5.10"
|
zip = "0.5.10"
|
||||||
webpage = "1.2.0"
|
webpage = "1.2.0"
|
||||||
gouth = "0.2.0"
|
gouth = "0.2.0"
|
||||||
tokio = { version = "0.2" }
|
|
||||||
webauthn-rs = "0.3.2"
|
webauthn-rs = "0.3.2"
|
||||||
url = "2.2.2"
|
url = "2.2.2"
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
use actix::{ActorContext, Addr, AsyncContext, Handler, StreamHandler};
|
use actix::{ActorContext, Addr, AsyncContext, Handler, StreamHandler};
|
||||||
use actix::prelude::*;
|
use actix::prelude::*;
|
||||||
|
use actix_http::ws::Item;
|
||||||
use actix_web_actors::ws::{Message, ProtocolError};
|
use actix_web_actors::ws::{Message, ProtocolError};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
@ -14,7 +15,6 @@ use crate::data::error::{ExecError, Res};
|
|||||||
use crate::helpers::events_helper;
|
use crate::helpers::events_helper;
|
||||||
use crate::helpers::events_helper::Event;
|
use crate::helpers::events_helper::Event;
|
||||||
use crate::utils::network_utils::match_ip;
|
use crate::utils::network_utils::match_ip;
|
||||||
use actix_http::ws::Item;
|
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct RtcRelayActor {
|
struct RtcRelayActor {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use actix_http::header::{HeaderName, HeaderValue};
|
||||||
|
|
||||||
use actix_web::{HttpRequest, HttpResponse, web};
|
use actix_web::{HttpRequest, HttpResponse, HttpResponseBuilder};
|
||||||
use actix_web::dev::HttpResponseBuilder;
|
use actix_web::http::StatusCode;
|
||||||
use actix_web::http::{HeaderName, HeaderValue, StatusCode};
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
use crate::api_data::http_error::HttpError;
|
use crate::api_data::http_error::HttpError;
|
||||||
@ -22,9 +22,9 @@ use crate::utils::network_utils::match_ip;
|
|||||||
/// @author Pierre Hubert
|
/// @author Pierre Hubert
|
||||||
|
|
||||||
pub struct HttpRequestHandler {
|
pub struct HttpRequestHandler {
|
||||||
request: web::HttpRequest,
|
request: HttpRequest,
|
||||||
body: HashMap<String, RequestValue>,
|
body: HashMap<String, RequestValue>,
|
||||||
response: Option<web::HttpResponse>,
|
response: Option<HttpResponse>,
|
||||||
headers: HashMap<String, String>,
|
headers: HashMap<String, String>,
|
||||||
client: Option<APIClient>,
|
client: Option<APIClient>,
|
||||||
curr_user_token: Option<UserAccessToken>,
|
curr_user_token: Option<UserAccessToken>,
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
//! @author Pierre Hubert
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
|
||||||
use actix_web::http::{HeaderValue, StatusCode};
|
use actix_http::header::HeaderValue;
|
||||||
|
use actix_web::http::StatusCode;
|
||||||
use reqwest::blocking::Client;
|
use reqwest::blocking::Client;
|
||||||
use reqwest::header::HeaderMap;
|
use reqwest::header::HeaderMap;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -14,7 +15,7 @@ use crate::data::push_notification::PushNotification;
|
|||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct CreateTokenResult {
|
struct CreateTokenResult {
|
||||||
token: String
|
token: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
|
29
src/main.rs
29
src/main.rs
@ -89,12 +89,12 @@ fn get_actions() -> Vec<Action> {
|
|||||||
description: "Grant a role to an admin",
|
description: "Grant a role to an admin",
|
||||||
arguments: vec!["mail", "role_id"],
|
arguments: vec!["mail", "role_id"],
|
||||||
function: Box::new(grant_admin_role),
|
function: Box::new(grant_admin_role),
|
||||||
}
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::main]
|
|
||||||
async fn main() -> std::io::Result<()> {
|
fn main() {
|
||||||
let args: Vec<String> = std::env::args().collect();
|
let args: Vec<String> = std::env::args().collect();
|
||||||
let conf_file = match args.get(1) {
|
let conf_file = match args.get(1) {
|
||||||
Some(el) => el.to_string(),
|
Some(el) => el.to_string(),
|
||||||
@ -144,30 +144,15 @@ async fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
let res = (selected_action.function)(args.to_vec());
|
let res = (selected_action.function)(args.to_vec());
|
||||||
res.expect("Failed to execute action!");
|
res.expect("Failed to execute action!");
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start Comunic Server (main action)
|
/// Start Comunic Server (main action)
|
||||||
fn serve(_a: Vec<String>) -> Res {
|
fn serve(_a: Vec<String>) -> Res {
|
||||||
let t = std::thread::spawn(|| {
|
// Start cleanup thread
|
||||||
let sys = actix::System::new("sys");
|
cleanup_thread::start().expect("Failed to start cleanup thread!");
|
||||||
|
|
||||||
let promise = async {
|
// Start the server
|
||||||
// Start cleanup thread
|
Ok(server::start_server(conf())?)
|
||||||
cleanup_thread::start().expect("Failed to start cleanup thread!");
|
|
||||||
|
|
||||||
// Start the server
|
|
||||||
server::start_server(conf()).await
|
|
||||||
};
|
|
||||||
|
|
||||||
tokio::runtime::Runtime::new().unwrap().block_on(promise)
|
|
||||||
.expect("Failed to start server!");
|
|
||||||
|
|
||||||
let _ = sys.run();
|
|
||||||
});
|
|
||||||
|
|
||||||
t.join().unwrap();
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn help(_a: Vec<String>) -> Res {
|
fn help(_a: Vec<String>) -> Res {
|
||||||
|
@ -2,9 +2,9 @@ use std::collections::HashMap;
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
|
||||||
use actix_web::{App, FromRequest, http, HttpMessage, HttpRequest, HttpResponse, HttpServer, web};
|
use actix_web::{App, FromRequest, http, HttpMessage, HttpRequest, HttpResponse, HttpServer, web};
|
||||||
use actix_web::dev::{Decompress, Payload, PayloadStream};
|
use actix_web::dev::{Decompress, Payload};
|
||||||
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, PayloadError};
|
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, PayloadError};
|
||||||
use actix_web::web::{Buf, BufMut, Bytes, BytesMut};
|
use actix_web::web::{BufMut, Bytes, BytesMut};
|
||||||
use encoding_rs::UTF_8;
|
use encoding_rs::UTF_8;
|
||||||
use futures::{FutureExt, Stream, StreamExt};
|
use futures::{FutureExt, Stream, StreamExt};
|
||||||
use futures::future::LocalBoxFuture;
|
use futures::future::LocalBoxFuture;
|
||||||
@ -54,7 +54,7 @@ impl<'a> Stream for LimitedStream
|
|||||||
|
|
||||||
/// Custom request value
|
/// Custom request value
|
||||||
struct CustomRequest {
|
struct CustomRequest {
|
||||||
req: web::HttpRequest,
|
req: HttpRequest,
|
||||||
body: HashMap<String, RequestValue>,
|
body: HashMap<String, RequestValue>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,9 +62,8 @@ struct CustomRequest {
|
|||||||
impl FromRequest for CustomRequest {
|
impl FromRequest for CustomRequest {
|
||||||
type Error = actix_web::Error;
|
type Error = actix_web::Error;
|
||||||
type Future = LocalBoxFuture<'static, Result<CustomRequest, actix_web::Error>>;
|
type Future = LocalBoxFuture<'static, Result<CustomRequest, actix_web::Error>>;
|
||||||
type Config = ();
|
|
||||||
|
|
||||||
fn from_request(req: &HttpRequest, payload: &mut Payload<PayloadStream>) -> Self::Future {
|
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||||
let req = req.clone();
|
let req = req.clone();
|
||||||
let payload = Box::new(payload.take());
|
let payload = Box::new(payload.take());
|
||||||
|
|
||||||
@ -159,8 +158,7 @@ impl FromRequest for CustomRequest {
|
|||||||
while let Some(el) = req.next().await {
|
while let Some(el) = req.next().await {
|
||||||
let mut field = el?;
|
let mut field = el?;
|
||||||
|
|
||||||
let content_type = field.content_disposition().ok_or(
|
let content_type = field.content_disposition().clone();
|
||||||
ErrorInternalServerError("Missing content type"))?;
|
|
||||||
let name = content_type.get_name().ok_or(
|
let name = content_type.get_name().ok_or(
|
||||||
ErrorInternalServerError("Missing field name!"))?;
|
ErrorInternalServerError("Missing field name!"))?;
|
||||||
|
|
||||||
@ -177,7 +175,7 @@ impl FromRequest for CustomRequest {
|
|||||||
body_args.insert(name.to_string(),
|
body_args.insert(name.to_string(),
|
||||||
RequestValue::File(PostFile {
|
RequestValue::File(PostFile {
|
||||||
name: filename.to_string(),
|
name: filename.to_string(),
|
||||||
buff: buf.to_bytes(),
|
buff: buf.freeze(),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,7 +185,7 @@ impl FromRequest for CustomRequest {
|
|||||||
|
|
||||||
// Get content
|
// Get content
|
||||||
while let Some(chunk) = field.next().await {
|
while let Some(chunk) = field.next().await {
|
||||||
content = format!("{}{}", content, String::from_utf8_lossy(chunk?.bytes()));
|
content = format!("{}{}", content, String::from_utf8_lossy(chunk?.as_ref()));
|
||||||
}
|
}
|
||||||
|
|
||||||
body_args.insert(name.to_string(), RequestValue::String(content));
|
body_args.insert(name.to_string(), RequestValue::String(content));
|
||||||
@ -342,14 +340,15 @@ async fn handle_options_request(r: HttpRequest) -> HttpResponse {
|
|||||||
|
|
||||||
// Accept request
|
// Accept request
|
||||||
HttpResponse::NoContent()
|
HttpResponse::NoContent()
|
||||||
.header("Access-Control-Allow-Origin", origin)
|
.append_header(("Access-Control-Allow-Origin", origin))
|
||||||
.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
|
.append_header(("Access-Control-Allow-Methods", "POST, GET, OPTIONS"))
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Given the configuration, start the server
|
/// Given the configuration, start the server
|
||||||
pub async fn start_server(conf: &Config) -> std::io::Result<()> {
|
pub fn start_server(conf: &Config) -> std::io::Result<()> {
|
||||||
|
let sys = actix::System::new();
|
||||||
|
|
||||||
// Initialize limit helper
|
// Initialize limit helper
|
||||||
requests_limit_helper::init();
|
requests_limit_helper::init();
|
||||||
@ -362,7 +361,7 @@ pub async fn start_server(conf: &Config) -> std::io::Result<()> {
|
|||||||
|
|
||||||
let serve_storage_file = conf.serve_storage_file;
|
let serve_storage_file = conf.serve_storage_file;
|
||||||
|
|
||||||
HttpServer::new(move || {
|
let server = HttpServer::new(move || {
|
||||||
let mut app = App::new();
|
let mut app = App::new();
|
||||||
|
|
||||||
if serve_storage_file {
|
if serve_storage_file {
|
||||||
@ -376,10 +375,14 @@ pub async fn start_server(conf: &Config) -> std::io::Result<()> {
|
|||||||
.service(actix_web::web::resource("/rtc_proxy/ws").to(rtc_relay_controller::open_ws))
|
.service(actix_web::web::resource("/rtc_proxy/ws").to(rtc_relay_controller::open_ws))
|
||||||
|
|
||||||
// Option
|
// Option
|
||||||
.route("**", web::method(http::Method::OPTIONS).to(handle_options_request))
|
.route("{tail:.*}", web::method(http::Method::OPTIONS).to(handle_options_request))
|
||||||
|
|
||||||
// API routes
|
// API routes
|
||||||
.route("**", web::get().to(process_request))
|
.route("{tail:.*}", web::get().to(process_request))
|
||||||
.route("**", web::post().to(process_request))
|
.route("{tail:.*}", web::post().to(process_request))
|
||||||
}).bind(&addr)?.run().await
|
}).bind(&addr)?.run();
|
||||||
|
|
||||||
|
sys.block_on(server)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user