Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit dce8663

Browse files
committed
fix: handle options preflight
1 parent b0bf02b commit dce8663

File tree

1 file changed

+53
-32
lines changed

1 file changed

+53
-32
lines changed

engine/main.cc

Lines changed: 53 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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 << "\rCaught interrupt signal:" << sig << ", shutting down\n";;
67+
std::cout << "\rCaught 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

Comments
 (0)