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

Commit ad5ecc1

Browse files
authored
fix: manually add http date header for windows (#1721)
1 parent 87b59d4 commit ad5ecc1

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

engine/controllers/configs.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "configs.h"
2+
#include "utils/cortex_utils.h"
23

34
void Configs::GetConfigurations(
45
const HttpRequestPtr& req,
@@ -7,13 +8,13 @@ void Configs::GetConfigurations(
78
if (get_config_result.has_error()) {
89
Json::Value error_json;
910
error_json["message"] = get_config_result.error();
10-
auto resp = drogon::HttpResponse::newHttpJsonResponse(error_json);
11+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(error_json);
1112
resp->setStatusCode(drogon::k400BadRequest);
1213
callback(resp);
1314
return;
1415
}
1516

16-
auto resp = drogon::HttpResponse::newHttpJsonResponse(
17+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(
1718
get_config_result.value().ToJson());
1819
resp->setStatusCode(drogon::k200OK);
1920
callback(resp);
@@ -27,7 +28,7 @@ void Configs::UpdateConfigurations(
2728
if (json_body == nullptr) {
2829
Json::Value error_json;
2930
error_json["message"] = "Configuration must be provided via JSON body";
30-
auto resp = drogon::HttpResponse::newHttpJsonResponse(error_json);
31+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(error_json);
3132
resp->setStatusCode(drogon::k400BadRequest);
3233
callback(resp);
3334
return;
@@ -37,7 +38,7 @@ void Configs::UpdateConfigurations(
3738
if (update_config_result.has_error()) {
3839
Json::Value error_json;
3940
error_json["message"] = update_config_result.error();
40-
auto resp = drogon::HttpResponse::newHttpJsonResponse(error_json);
41+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(error_json);
4142
resp->setStatusCode(drogon::k400BadRequest);
4243
callback(resp);
4344
return;
@@ -46,7 +47,7 @@ void Configs::UpdateConfigurations(
4647
Json::Value root;
4748
root["message"] = "Configuration updated successfully";
4849
root["config"] = update_config_result.value().ToJson();
49-
auto resp = drogon::HttpResponse::newHttpJsonResponse(root);
50+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(root);
5051
resp->setStatusCode(drogon::k200OK);
5152
callback(resp);
5253
return;

engine/controllers/swagger.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "swagger.h"
22
#include "cortex_openapi.h"
3+
#include "utils/cortex_utils.h"
34

45
constexpr auto ScalarUi = R"(
56
<!doctype html>
@@ -31,7 +32,7 @@ Json::Value SwaggerController::generateOpenAPISpec() {
3132
void SwaggerController::serveSwaggerUI(
3233
const drogon::HttpRequestPtr& req,
3334
std::function<void(const drogon::HttpResponsePtr&)>&& callback) const {
34-
auto resp = drogon::HttpResponse::newHttpResponse();
35+
auto resp = cortex_utils::CreateCortexHttpResponse();
3536
resp->setBody(ScalarUi);
3637
resp->setContentTypeCode(drogon::CT_TEXT_HTML);
3738
callback(resp);
@@ -41,6 +42,6 @@ void SwaggerController::serveOpenAPISpec(
4142
const drogon::HttpRequestPtr& req,
4243
std::function<void(const drogon::HttpResponsePtr&)>&& callback) const {
4344
Json::Value spec = generateOpenAPISpec();
44-
auto resp = drogon::HttpResponse::newHttpJsonResponse(spec);
45+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(spec);
4546
callback(resp);
4647
}

engine/main.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ void RunServer(std::optional<int> port, bool ignore_cout) {
150150
LOG_INFO << "Please load your model";
151151
#ifndef _WIN32
152152
drogon::app().enableReusePort();
153+
#else
154+
drogon::app().enableDateHeader(false);
153155
#endif
154156
drogon::app().addListener(config.apiServerHost,
155157
std::stoi(config.apiServerPort));

engine/utils/cortex_utils.h

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
#include <drogon/HttpResponse.h>
44
#include <sys/stat.h>
55
#include <algorithm>
6+
#include <ctime>
67
#include <fstream>
8+
#include <iomanip>
79
#include <iostream>
810
#include <ostream>
911
#include <random>
@@ -24,20 +26,41 @@ inline std::string logs_folder = "./logs";
2426
inline std::string logs_base_name = "./logs/cortex.log";
2527
inline std::string logs_cli_base_name = "./logs/cortex-cli.log";
2628

29+
// example: Mon, 25 Nov 2024 09:57:03 GMT
30+
inline std::string GetDateRFC1123() {
31+
std::time_t now = std::time(nullptr);
32+
std::tm* gmt_time = std::gmtime(&now);
33+
std::ostringstream oss;
34+
oss << std::put_time(gmt_time, "%a, %d %b %Y %H:%M:%S GMT");
35+
return oss.str();
36+
}
37+
2738
inline drogon::HttpResponsePtr CreateCortexHttpResponse() {
28-
return drogon::HttpResponse::newHttpResponse();
39+
auto res = drogon::HttpResponse::newHttpResponse();
40+
#if defined(_WIN32)
41+
res->addHeader("date", GetDateRFC1123());
42+
#endif
43+
return res;
2944
}
3045

3146
inline drogon::HttpResponsePtr CreateCortexHttpJsonResponse(
3247
const Json::Value& data) {
33-
return drogon::HttpResponse::newHttpJsonResponse(data);
48+
auto res = drogon::HttpResponse::newHttpJsonResponse(data);
49+
#if defined(_WIN32)
50+
res->addHeader("date", GetDateRFC1123());
51+
#endif
52+
return res;
3453
};
3554

3655
inline drogon::HttpResponsePtr CreateCortexStreamResponse(
3756
const std::function<std::size_t(char*, std::size_t)>& callback,
3857
const std::string& attachmentFileName = "") {
39-
return drogon::HttpResponse::newStreamResponse(
58+
auto res = drogon::HttpResponse::newStreamResponse(
4059
callback, attachmentFileName, drogon::CT_NONE, "text/event-stream");
60+
#if defined(_WIN32)
61+
res->addHeader("date", GetDateRFC1123());
62+
#endif
63+
return res;
4164
}
4265

4366
#if defined(_WIN32)

0 commit comments

Comments
 (0)