Skip to content

Commit 5e43680

Browse files
committed
HEAD support for static file server
1 parent 79df842 commit 5e43680

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

httplib.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ class Server {
509509
bool listen_internal();
510510

511511
bool routing(Request &req, Response &res, Stream &strm, bool last_connection);
512-
bool handle_file_request(Request &req, Response &res);
512+
bool handle_file_request(Request &req, Response &res, bool head = false);
513513
bool dispatch_request(Request &req, Response &res, Handlers &handlers);
514514
bool dispatch_request_for_content_reader(Request &req, Response &res,
515515
ContentReader content_reader,
@@ -3212,7 +3212,7 @@ inline bool Server::read_content_core(Stream &strm, bool last_connection,
32123212
return true;
32133213
}
32143214

3215-
inline bool Server::handle_file_request(Request &req, Response &res) {
3215+
inline bool Server::handle_file_request(Request &req, Response &res, bool head) {
32163216
for (const auto &kv : base_dirs_) {
32173217
const auto &mount_point = kv.first;
32183218
const auto &base_dir = kv.second;
@@ -3230,7 +3230,7 @@ inline bool Server::handle_file_request(Request &req, Response &res) {
32303230
detail::find_content_type(path, file_extension_and_mimetype_map_);
32313231
if (type) { res.set_header("Content-Type", type); }
32323232
res.status = 200;
3233-
if (file_request_handler_) { file_request_handler_(req, res); }
3233+
if (!head && file_request_handler_) { file_request_handler_(req, res); }
32343234
return true;
32353235
}
32363236
}
@@ -3331,7 +3331,8 @@ inline bool Server::listen_internal() {
33313331
inline bool Server::routing(Request &req, Response &res, Stream &strm,
33323332
bool last_connection) {
33333333
// File handler
3334-
if (req.method == "GET" && handle_file_request(req, res)) { return true; }
3334+
bool is_head_request = req.method == "HEAD";
3335+
if ((req.method == "GET" || is_head_request) && handle_file_request(req, res, is_head_request)) { return true; }
33353336

33363337
if (detail::expect_content(req)) {
33373338
// Content reader handler

test/test.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,15 @@ TEST_F(ServerTest, HeadMethod200) {
10511051
EXPECT_EQ("", res->body);
10521052
}
10531053

1054+
TEST_F(ServerTest, HeadMethod200Static) {
1055+
auto res = cli_.Head("/mount/dir/index.html");
1056+
ASSERT_TRUE(res != nullptr);
1057+
EXPECT_EQ(200, res->status);
1058+
EXPECT_EQ("text/html", res->get_header_value("Content-Type"));
1059+
EXPECT_EQ(104, std::stoi(res->get_header_value("Content-Length")));
1060+
EXPECT_EQ("", res->body);
1061+
}
1062+
10541063
TEST_F(ServerTest, HeadMethod404) {
10551064
auto res = cli_.Head("/invalid");
10561065
ASSERT_TRUE(res != nullptr);

0 commit comments

Comments
 (0)