Add basic CORS support
This commit is contained in:
27
src/main.rs
27
src/main.rs
@@ -45,6 +45,11 @@ fn main() {
|
||||
if std::env::var("MERCATOR_BASE").is_err() {
|
||||
std::env::set_var("MERCATOR_BASE", "/spatial-search");
|
||||
}
|
||||
|
||||
if std::env::var("MERCATOR_ALLOWED_ORIGINS").is_err() {
|
||||
// Allow by default access from a locally running Swagger Editor instance.
|
||||
std::env::set_var("MERCATOR_ALLOWED_ORIGINS", "http://localhost:3200");
|
||||
}
|
||||
/* UNUSED FOR NOW
|
||||
if std::env::var("MERCATOR_DATA").is_err() {
|
||||
std::env::set_var("MERCATOR_DATA", ".");
|
||||
@@ -54,6 +59,7 @@ fn main() {
|
||||
let hostname;
|
||||
let port;
|
||||
let base;
|
||||
let allowed_origins: Vec<String>;
|
||||
//let data;
|
||||
|
||||
match std::env::var("MERCATOR_HOST") {
|
||||
@@ -86,6 +92,19 @@ fn main() {
|
||||
}
|
||||
};
|
||||
|
||||
match std::env::var("MERCATOR_ALLOWED_ORIGINS") {
|
||||
Ok(val) => {
|
||||
allowed_origins = val
|
||||
.split(',')
|
||||
.map(|s| s.trim().to_string())
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
Err(val) => {
|
||||
error!("Could not fetch {} : `{}`", "MERCATOR_ALLOWED_ORIGINS", val);
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
/* UNUSED FOR NOW
|
||||
match std::env::var("MERCATOR_DATA") {
|
||||
Ok(val) => data = val,
|
||||
@@ -149,5 +168,11 @@ fn main() {
|
||||
// END of Temporary bloc
|
||||
}
|
||||
|
||||
rest_api::run(hostname, port, base, Arc::new(RwLock::new(db)));
|
||||
rest_api::run(
|
||||
hostname,
|
||||
port,
|
||||
base,
|
||||
allowed_origins,
|
||||
Arc::new(RwLock::new(db)),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,9 +15,10 @@ use std::sync::Arc;
|
||||
use std::sync::RwLock;
|
||||
|
||||
use actix_web::fs;
|
||||
use actix_web::http;
|
||||
use actix_web::http::Method;
|
||||
use actix_web::http::StatusCode;
|
||||
use actix_web::middleware;
|
||||
use actix_web::middleware::cors::Cors;
|
||||
use actix_web::pred;
|
||||
use actix_web::server;
|
||||
use actix_web::server::HttpHandler;
|
||||
@@ -87,6 +88,7 @@ where
|
||||
|
||||
fn get_app<S>(
|
||||
prefix: S,
|
||||
allowed_origins: &[&'static str],
|
||||
state: Arc<RwLock<SharedState>>,
|
||||
) -> Vec<Box<HttpHandler<Task = Box<HttpHandlerTask>>>>
|
||||
where
|
||||
@@ -94,9 +96,6 @@ where
|
||||
{
|
||||
vec![
|
||||
App::with_state(AppState { shared: state })
|
||||
.middleware(
|
||||
middleware::DefaultHeaders::new().header("Access-Control-Allow-Origin", "*"),
|
||||
)
|
||||
.prefix(into_static(prefix).to_string())
|
||||
.middleware(middleware::Logger::new(
|
||||
r#"%a "%r" %s %b "%{Referer}i" "%{User-Agent}i" %T[s] %D[ms]"#,
|
||||
@@ -108,6 +107,20 @@ where
|
||||
.filter(pred::Not(pred::Get()))
|
||||
.f(default::page_400);
|
||||
})
|
||||
// DEFAULT -------------------------------------------------------------------
|
||||
.default_resource(|r| {
|
||||
r.f(default::page_400);
|
||||
})
|
||||
// REQUIRES CORS Support ---------------------------------------------------------------
|
||||
.configure(|app| {
|
||||
let mut cors = Cors::for_app(app);
|
||||
for origin in allowed_origins {
|
||||
cors.allowed_origin(origin);
|
||||
}
|
||||
cors.allowed_methods(vec!["GET", "POST", "UPDATE", "PATCH", "DELETE", "OPTIONS"])
|
||||
.allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT])
|
||||
.allowed_header(http::header::CONTENT_TYPE)
|
||||
.max_age(60)
|
||||
.resource("/queries", |r| {
|
||||
r.method(Method::POST).f(actions::query);
|
||||
r.route()
|
||||
@@ -153,9 +166,7 @@ where
|
||||
r.method(Method::PATCH).with(spatial_object::patch);
|
||||
r.method(Method::DELETE).with(spatial_object::delete);
|
||||
})
|
||||
// DEFAULT -------------------------------------------------------------------
|
||||
.default_resource(|r| {
|
||||
r.f(default::page_400);
|
||||
.register()
|
||||
})
|
||||
.boxed(),
|
||||
App::new()
|
||||
@@ -175,8 +186,13 @@ where
|
||||
]
|
||||
}
|
||||
|
||||
pub fn run<S>(host: S, port: u16, prefix: S, state: Arc<RwLock<SharedState>>)
|
||||
where
|
||||
pub fn run<S>(
|
||||
host: S,
|
||||
port: u16,
|
||||
prefix: S,
|
||||
allowed_origins: Vec<S>,
|
||||
state: Arc<RwLock<SharedState>>,
|
||||
) where
|
||||
S: Into<String>,
|
||||
{
|
||||
info!("Initializing server...");
|
||||
@@ -185,7 +201,12 @@ where
|
||||
let prefix = into_static(prefix);
|
||||
let host = host.into();
|
||||
|
||||
server::new(move || get_app(prefix, state.clone()))
|
||||
let mut origins = Vec::with_capacity(allowed_origins.len());
|
||||
for origin in allowed_origins {
|
||||
origins.push(into_static(origin));
|
||||
}
|
||||
|
||||
server::new(move || get_app(prefix, &origins, state.clone()))
|
||||
.bind(format!("{}:{}", host, port))
|
||||
.unwrap()
|
||||
.start();
|
||||
|
||||
Reference in New Issue
Block a user