1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2025-09-25 22:29:45 +00:00

Handle pre-flight requests

This commit is contained in:
2021-03-14 14:25:11 +01:00
parent c29d8b1997
commit eb0c7aec6a
5 changed files with 57 additions and 30 deletions

View File

@@ -4,7 +4,7 @@ use std::pin::Pin;
use actix_web::{App, FromRequest, http, HttpMessage, HttpRequest, HttpResponse, HttpServer, web};
use actix_web::dev::{Decompress, Payload, PayloadStream};
use actix_web::error::{ErrorBadRequest, ErrorInternalServerError, PayloadError};
use actix_web::web::{Bytes, BytesMut, BufMut, Buf};
use actix_web::web::{Buf, BufMut, Bytes, BytesMut};
use encoding_rs::UTF_8;
use futures::{FutureExt, Stream, StreamExt};
use futures::future::LocalBoxFuture;
@@ -14,12 +14,12 @@ use percent_encoding::percent_decode_str;
use crate::api_data::http_error::HttpError;
use crate::constants::MAX_REQUEST_SIZE;
use crate::controllers::{rtc_relay_controller, user_ws_controller};
use crate::routes::{get_routes, RequestResult, Route};
use crate::routes::Method::{GET, POST};
use crate::data::base_request_handler::{BaseRequestHandler, PostFile, RequestValue};
use crate::data::config::Config;
use crate::data::http_request_handler::HttpRequestHandler;
use crate::helpers::requests_limit_helper;
use crate::helpers::{api_helper, requests_limit_helper};
use crate::routes::{get_routes, RequestResult, Route};
use crate::routes::Method::{GET, POST};
/// Main server functions
///
@@ -301,6 +301,30 @@ async fn process_request(custom_req: CustomRequest) -> HttpResponse {
}
}
/// Handle pre-flight requests
async fn handle_options_request(r: HttpRequest) -> HttpResponse {
// Extract origin
let origin = r.headers().get("Origin");
if origin.is_none() {
return HttpResponse::BadRequest().body("Missing origin header!");
}
let origin = origin.unwrap().to_str().unwrap_or("").to_string();
// Find client
let client = api_helper::get_by_origin(&origin);
if client.is_err() {
eprintln!("Failed to handle OPTIONS request: {:#?}", client);
return HttpResponse::Unauthorized().body("Unkown origin!");
}
// Accept request
HttpResponse::NoContent()
.header("Access-Control-Allow-Origin", origin)
.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
.finish()
}
/// Given the configuration, start the server
pub async fn start_server(conf: &Config) -> std::io::Result<()> {
@@ -320,6 +344,9 @@ pub async fn start_server(conf: &Config) -> std::io::Result<()> {
// RTC Relay WebSocket route
.service(actix_web::web::resource("/rtc_proxy/ws").to(rtc_relay_controller::open_ws))
// Option
.route("**", web::method(http::Method::OPTIONS).to(handle_options_request))
// API routes
.route("**", web::get().to(process_request))
.route("**", web::post().to(process_request))