Kaynağa Gözat

Fix redirect for mounted folders (#2628)

A directory request without a trailing slash was redirected to the path
relative to the mount point, so /mount/dir under a mount at /mount sent
Location: //dir/ instead of /mount/dir/. Redirect to the request path
with the slash appended.
mervindejong 4 gün önce
ebeveyn
işleme
924b5cecf0
2 değiştirilmiş dosya ile 8 ekleme ve 1 silme
  1. 1 1
      httplib.h
  2. 7 0
      test/test.cc

+ 1 - 1
httplib.h

@@ -13869,7 +13869,7 @@ inline bool Server::handle_file_request(Request &req, Response &res) {
         detail::FileStat stat(path);
 
         if (stat.is_dir()) {
-          res.set_redirect(sub_path + "/", StatusCode::MovedPermanently_301);
+          res.set_redirect(req.path + "/", StatusCode::MovedPermanently_301);
           return true;
         }
 

+ 7 - 0
test/test.cc

@@ -6660,6 +6660,13 @@ TEST_F(ServerTest, GetMethodOutOfBaseDirMountWithBackslash) {
   EXPECT_EQ(StatusCode::NotFound_404, res->status);
 }
 
+TEST_F(ServerTest, GetMethodDirMountWithoutTrailingSlash) {
+  auto res = cli_.Get("/mount/dir");
+  ASSERT_TRUE(res) << "Error: " << to_string(res.error());
+  EXPECT_EQ(StatusCode::MovedPermanently_301, res->status);
+  EXPECT_EQ("/mount/dir/", res->get_header_value("Location"));
+}
+
 TEST_F(ServerTest, PostMethod303) {
   auto res = cli_.Post("/1", "body", "text/plain");
   ASSERT_TRUE(res) << "Error: " << to_string(res.error());