Skip to content

Commit 2b80670

Browse files
committed
Credential is not supported if Allowed Origin is '*'
1 parent 77eda0d commit 2b80670

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

include/crow/middlewares/cors.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,20 @@ namespace crow
118118
}
119119

120120
/// Set response headers
121-
void apply(crow::response& res)
121+
void apply(const request& req, response& res)
122122
{
123123
if (ignore_) return;
124-
set_header_no_override("Access-Control-Allow-Origin", origin_, res);
124+
125125
set_header_no_override("Access-Control-Allow-Methods", methods_, res);
126126
set_header_no_override("Access-Control-Allow-Headers", headers_, res);
127127
set_header_no_override("Access-Control-Expose-Headers", exposed_headers_, res);
128128
set_header_no_override("Access-Control-Max-Age", max_age_, res);
129129
if (allow_credentials_) set_header_no_override("Access-Control-Allow-Credentials", "true", res);
130+
131+
if (allow_credentials_ && origin_ == "*")
132+
set_header_no_override("Access-Control-Allow-Origin", req.get_header_value("Origin"), res);
133+
else
134+
set_header_no_override("Access-Control-Allow-Origin", origin_, res);
130135
}
131136

132137
bool ignore_ = false;
@@ -158,7 +163,7 @@ namespace crow
158163
void after_handle(crow::request& req, crow::response& res, context& /*ctx*/)
159164
{
160165
auto& rule = find_rule(req.url);
161-
rule.apply(res);
166+
rule.apply(req, res);
162167
}
163168

164169
/// Handle CORS on a specific prefix path

tests/unittest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,6 +1937,8 @@ TEST_CASE("middleware_cors")
19371937
cors
19381938
.prefix("/origin")
19391939
.origin("test.test")
1940+
.prefix("/auth-origin")
1941+
.allow_credentials()
19401942
.prefix("/expose")
19411943
.expose("exposed-header")
19421944
.prefix("/nocors")
@@ -1953,6 +1955,11 @@ TEST_CASE("middleware_cors")
19531955
return "-";
19541956
});
19551957

1958+
CROW_ROUTE(app, "/auth-origin")
1959+
([&](const request&) {
1960+
return "-";
1961+
});
1962+
19561963
CROW_ROUTE(app, "/expose")
19571964
([&](const request&) {
19581965
return "-";
@@ -1979,6 +1986,10 @@ TEST_CASE("middleware_cors")
19791986
"GET /origin\r\n\r\n");
19801987
CHECK(resp.find("Access-Control-Allow-Origin: test.test") != std::string::npos);
19811988

1989+
resp = HttpClient::request(LOCALHOST_ADDRESS, port,
1990+
"GET /auth-origin\r\nOrigin: test-client\r\n\r\n");
1991+
CHECK(resp.find("Access-Control-Allow-Origin: test-client") != std::string::npos);
1992+
19821993
resp = HttpClient::request(LOCALHOST_ADDRESS, port,
19831994
"GET /expose\r\n\r\n");
19841995
CHECK(resp.find("Access-Control-Expose-Headers: exposed-header") != std::string::npos);

0 commit comments

Comments
 (0)