diff --git a/include/crow/http_response.h b/include/crow/http_response.h index 4ba400ba0..58562a4ae 100644 --- a/include/crow/http_response.h +++ b/include/crow/http_response.h @@ -242,17 +242,20 @@ namespace crow { std::size_t last_dot = path.find_last_of("."); std::string extension = path.substr(last_dot + 1); - std::string mimeType = ""; code = 200; - this->add_header("Content-length", std::to_string(file_info.statbuf.st_size)); + this->add_header("Content-Length", std::to_string(file_info.statbuf.st_size)); - if (extension != "") + if (!extension.empty()) { - mimeType = mime_types.at(extension); - if (mimeType != "") - this->add_header("Content-Type", mimeType); + const auto mimeType = mime_types.find(extension); + if (mimeType != mime_types.end()) + { + this->add_header("Content-Type", mimeType->second); + } else - this->add_header("content-Type", "text/plain"); + { + this->add_header("Content-Type", "text/plain"); + } } } else diff --git a/tests/img/filewith.badext b/tests/img/filewith.badext new file mode 100644 index 000000000..afc96e20c --- /dev/null +++ b/tests/img/filewith.badext @@ -0,0 +1 @@ +Test file with a strange extension. diff --git a/tests/unittest.cpp b/tests/unittest.cpp index 4c980993f..c4377f2f7 100644 --- a/tests/unittest.cpp +++ b/tests/unittest.cpp @@ -1926,8 +1926,10 @@ TEST_CASE("multipart") TEST_CASE("send_file") { - struct stat statbuf; - stat("tests/img/cat.jpg", &statbuf); + struct stat statbuf_cat; + stat("tests/img/cat.jpg", &statbuf_cat); + struct stat statbuf_badext; + stat("tests/img/filewith.badext", &statbuf_badext); SimpleApp app; @@ -1944,6 +1946,12 @@ TEST_CASE("send_file") res.end(); }); + CROW_ROUTE(app, "/filewith.badext") + ([](const crow::request&, crow::response& res) { + res.set_static_file_info("tests/img/filewith.badext"); + res.end(); + }); + app.validate(); //File not found check @@ -1971,7 +1979,21 @@ TEST_CASE("send_file") CHECK(200 == res.code); CHECK("image/jpeg" == res.headers.find("Content-Type")->second); - CHECK(to_string(statbuf.st_size) == res.headers.find("Content-Length")->second); + CHECK(to_string(statbuf_cat.st_size) == res.headers.find("Content-Length")->second); + } + + //Unknown extension check + { + request req; + response res; + + req.url = "/filewith.badext"; + req.http_ver_major = 1; + + CHECK_NOTHROW(app.handle(req, res)); + CHECK(200 == res.code); + CHECK("text/plain" == res.headers.find("Content-Type")->second); + CHECK(to_string(statbuf_badext.st_size) == res.headers.find("Content-Length")->second); } } // send_file