Skip to content

Commit 1981e0c

Browse files
committed
Add SSL object on Request
1 parent 866b696 commit 1981e0c

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

httplib.h

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ struct Request {
145145

146146
Progress progress;
147147

148+
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
149+
const SSL *ssl;
150+
#endif
151+
148152
bool has_header(const char *key) const;
149153
std::string get_header_value(const char *key, size_t id = 0) const;
150154
size_t get_header_value_count(const char *key) const;
@@ -256,7 +260,8 @@ class Server {
256260

257261
protected:
258262
bool process_request(Stream &strm, bool last_connection,
259-
bool &connection_close);
263+
bool &connection_close,
264+
std::function<void(Request &)> setup_request = nullptr);
260265

261266
size_t keep_alive_max_count_;
262267
size_t payload_max_length_;
@@ -1828,8 +1833,10 @@ inline bool Server::dispatch_request(Request &req, Response &res,
18281833
return false;
18291834
}
18301835

1831-
inline bool Server::process_request(Stream &strm, bool last_connection,
1832-
bool &connection_close) {
1836+
inline bool
1837+
Server::process_request(Stream &strm, bool last_connection,
1838+
bool &connection_close,
1839+
std::function<void(Request &)> setup_request) {
18331840
const auto bufsiz = 2048;
18341841
char buf[bufsiz];
18351842

@@ -1899,6 +1906,9 @@ inline bool Server::process_request(Stream &strm, bool last_connection,
18991906
}
19001907
}
19011908

1909+
// TODO: Add additional request info
1910+
if (setup_request) { setup_request(req); }
1911+
19021912
if (routing(req, res)) {
19031913
if (res.status == -1) { res.status = 200; }
19041914
} else {
@@ -2293,15 +2303,15 @@ read_and_close_socket_ssl(socket_t sock, size_t keep_alive_max_count,
22932303
auto last_connection = count == 1;
22942304
auto connection_close = false;
22952305

2296-
ret = callback(strm, last_connection, connection_close);
2306+
ret = callback(ssl, strm, last_connection, connection_close);
22972307
if (!ret || connection_close) { break; }
22982308

22992309
count--;
23002310
}
23012311
} else {
23022312
SSLSocketStream strm(sock, ssl);
23032313
auto dummy_connection_close = false;
2304-
ret = callback(strm, true, dummy_connection_close);
2314+
ret = callback(ssl, strm, true, dummy_connection_close);
23052315
}
23062316
}
23072317

@@ -2406,8 +2416,10 @@ inline bool SSLServer::read_and_close_socket(socket_t sock) {
24062416
return detail::read_and_close_socket_ssl(
24072417
sock, keep_alive_max_count_, ctx_, ctx_mutex_, SSL_accept,
24082418
[](SSL * /*ssl*/) { return true; },
2409-
[this](Stream &strm, bool last_connection, bool &connection_close) {
2410-
return process_request(strm, last_connection, connection_close);
2419+
[this](SSL *ssl, Stream &strm, bool last_connection,
2420+
bool &connection_close) {
2421+
return process_request(strm, last_connection, connection_close,
2422+
[&](Request &req) { req.ssl = ssl; });
24112423
});
24122424
}
24132425

@@ -2494,7 +2506,7 @@ inline bool SSLClient::read_and_close_socket(socket_t sock, Request &req,
24942506
SSL_set_tlsext_host_name(ssl, host_.c_str());
24952507
return true;
24962508
},
2497-
[&](Stream &strm, bool /*last_connection*/,
2509+
[&](SSL * /*ssl*/, Stream &strm, bool /*last_connection*/,
24982510
bool &connection_close) {
24992511
return process_request(strm, req, res, connection_close);
25002512
});

test/test.cc

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,9 +1384,28 @@ TEST(SSLClientServerTest, ClientCertPresent) {
13841384
CLIENT_CA_CERT_DIR);
13851385
ASSERT_TRUE(svr.is_valid());
13861386

1387-
svr.Get("/test", [&](const Request &, Response &res) {
1387+
svr.Get("/test", [&](const Request &req, Response &res) {
13881388
res.set_content("test", "text/plain");
13891389
svr.stop();
1390+
ASSERT_TRUE(true);
1391+
1392+
auto peer_cert = SSL_get_peer_certificate(req.ssl);
1393+
ASSERT_TRUE(peer_cert != nullptr);
1394+
1395+
auto subject_name = X509_get_subject_name(peer_cert);
1396+
ASSERT_TRUE(subject_name != nullptr);
1397+
1398+
std::string common_name;
1399+
{
1400+
char name[BUFSIZ];
1401+
auto name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName,
1402+
name, sizeof(name));
1403+
common_name.assign(name, name_len);
1404+
}
1405+
1406+
EXPECT_EQ("Common Name", common_name);
1407+
1408+
X509_free(peer_cert);
13901409
});
13911410

13921411
thread t = thread([&]() { ASSERT_TRUE(svr.listen(HOST, PORT)); });
@@ -1405,10 +1424,7 @@ TEST(SSLClientServerTest, ClientCertMissing) {
14051424
CLIENT_CA_CERT_DIR);
14061425
ASSERT_TRUE(svr.is_valid());
14071426

1408-
svr.Get("/test", [&](const Request &, Response &res) {
1409-
res.set_content("test", "text/plain");
1410-
svr.stop();
1411-
});
1427+
svr.Get("/test", [&](const Request &, Response &) { ASSERT_TRUE(false); });
14121428

14131429
thread t = thread([&]() { ASSERT_TRUE(svr.listen(HOST, PORT)); });
14141430

0 commit comments

Comments
 (0)