@@ -64,7 +64,7 @@ void RunServer(std::optional<std::string> host, std::optional<int> port,
6464 bool ignore_cout) {
6565#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
6666 auto signal_handler = +[](int sig) -> void {
67- std::cout << " \r Caught interrupt signal:" << sig << " , shutting down\n " ;;
67+ std::cout << " \r Caught interrupt signal:" << sig << " , shutting down\n " ;
6868 shutdown_signal = true ;
6969 };
7070 signal (SIGINT, signal_handler);
@@ -288,54 +288,75 @@ void RunServer(std::optional<std::string> host, std::optional<int> port,
288288 return false ;
289289 };
290290
291+ auto handle_cors = [config_service](const drogon::HttpRequestPtr& req,
292+ const drogon::HttpResponsePtr& resp) {
293+ const std::string& origin = req->getHeader (" Origin" );
294+ CTL_INF (" Origin: " << origin);
295+
296+ auto allowed_origins =
297+ config_service->GetApiServerConfiguration ()->allowed_origins ;
298+
299+ auto is_contains_asterisk =
300+ std::find (allowed_origins.begin (), allowed_origins.end (), " *" );
301+ if (is_contains_asterisk != allowed_origins.end ()) {
302+ resp->addHeader (" Access-Control-Allow-Origin" , " *" );
303+ resp->addHeader (" Access-Control-Allow-Methods" , " *" );
304+ return ;
305+ }
306+
307+ // Check if the origin is in our allowed list
308+ auto it = std::find (allowed_origins.begin (), allowed_origins.end (), origin);
309+ if (it != allowed_origins.end ()) {
310+ resp->addHeader (" Access-Control-Allow-Origin" , origin);
311+ } else if (allowed_origins.empty ()) {
312+ resp->addHeader (" Access-Control-Allow-Origin" , " *" );
313+ }
314+ resp->addHeader (" Access-Control-Allow-Methods" , " *" );
315+ };
316+
291317 drogon::app ().registerPreRoutingAdvice (
292- [&validate_api_key](
318+ [&validate_api_key, &handle_cors ](
293319 const drogon::HttpRequestPtr& req,
294- std::function<void (const drogon::HttpResponsePtr&)>&& cb,
295- drogon::AdviceChainCallback&& ccb) {
320+ std::function<void (const drogon::HttpResponsePtr&)>&& stop,
321+ drogon::AdviceChainCallback&& pass) {
322+ // Handle OPTIONS preflight requests
323+ if (req->method () == drogon::HttpMethod::Options) {
324+ auto resp = HttpResponse::newHttpResponse ();
325+ handle_cors (req, resp);
326+
327+ // Add more info to header
328+ {
329+ const auto & val = req->getHeader (" Access-Control-Request-Headers" );
330+ if (!val.empty ())
331+ resp->addHeader (" Access-Control-Allow-Headers" , val);
332+ }
333+ // Set Access-Control-Max-Age
334+ resp->addHeader (" Access-Control-Max-Age" ,
335+ " 3600" ); // Cache for 60 minutes
336+ stop (resp);
337+ return ;
338+ }
339+
296340 if (!validate_api_key (req)) {
297341 Json::Value ret;
298342 ret[" message" ] = " Invalid API Key" ;
299343 auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
300344 resp->setStatusCode (drogon::k401Unauthorized);
301- cb (resp);
345+ stop (resp);
302346 return ;
303347 }
304- ccb ();
348+ pass ();
305349 });
306350
307351 // CORS
308352 drogon::app ().registerPostHandlingAdvice (
309- [config_service](const drogon::HttpRequestPtr& req,
310- const drogon::HttpResponsePtr& resp) {
353+ [config_service, &handle_cors ](const drogon::HttpRequestPtr& req,
354+ const drogon::HttpResponsePtr& resp) {
311355 if (!config_service->GetApiServerConfiguration ()->cors ) {
312356 CTL_INF (" CORS is disabled!" );
313357 return ;
314358 }
315-
316- const std::string& origin = req->getHeader (" Origin" );
317- CTL_INF (" Origin: " << origin);
318-
319- auto allowed_origins =
320- config_service->GetApiServerConfiguration ()->allowed_origins ;
321-
322- auto is_contains_asterisk =
323- std::find (allowed_origins.begin (), allowed_origins.end (), " *" );
324- if (is_contains_asterisk != allowed_origins.end ()) {
325- resp->addHeader (" Access-Control-Allow-Origin" , " *" );
326- resp->addHeader (" Access-Control-Allow-Methods" , " *" );
327- return ;
328- }
329-
330- // Check if the origin is in our allowed list
331- auto it =
332- std::find (allowed_origins.begin (), allowed_origins.end (), origin);
333- if (it != allowed_origins.end ()) {
334- resp->addHeader (" Access-Control-Allow-Origin" , origin);
335- } else if (allowed_origins.empty ()) {
336- resp->addHeader (" Access-Control-Allow-Origin" , " *" );
337- }
338- resp->addHeader (" Access-Control-Allow-Methods" , " *" );
359+ handle_cors (req, resp);
339360 });
340361
341362 // ssl
0 commit comments