我正在使用C++库在uWebSockets中设置一个HTTP服务器,我希望添加一个中间件来服务静态文件,类似于app.use(express.static(path.join(__dirname, 'public')));在Express.js中所做的工作。
静态文件驻留在public文件夹中。中间件应该在path http://localhost:8087/css/bootstrap.min.css而不是http://localhost:8087/public/css/bootstrap.min.css下加载服务器文件,从而将root重新路由到public。
如何使用C++库在uWebSockets中做到这一点?我已经检查了uWS::App结构,但是我发现没有任何与路径或服务静态文件相关的内容。
下面是一个HTTP服务器的示例:
#include <uWebSockets/App.h>
#include <rapidjson/rapidjson.h>
#include "util/AsyncFileReader.h"
#include "util/AsyncFileStreamer.h"
#include <iostream>
#include <string>
void get_home(uWS::HttpResponse<false> *res, uWS::HttpRequest *req) {
res->writeHeader("Content-Type", "text/html; charset=utf8");
// res->writeStatus(uWS::HTTP_200_OK);
// res->end("Hello! This is <b>Sergei's C++ web server</b>.");
AsyncFileReader page_contents("./public/home.html");
res->end(page_contents.peek(0));
}
int main() {
int port{8087};
// HTTP
uWS::App app = uWS::App();
app.get("/", get_home);
app.listen(port, [&port](auto *token) {
if (token) {
std::cout << "Listening on port " << port << std::endl;
}
})
.run();
return 0;
}发布于 2022-09-11 18:26:19
这里有一个例子
最后,我添加了一个目录监视,并更新了html文件,如果保存(代码库中的一些变化),但我想这是另一回事。
#include "helpers/AsyncFileReader.h"
#include "helpers/AsyncFileStreamer.h"
#include "helpers/Middleware.h"
AsyncFileStreamer asyncFileStreamer("htmls"); // htmls is a relative folder path to static filesapp.get("/*", gethome); // note the *void get_home(auto *res, auto *req) {
//void get_home(uWS::HttpResponse<false> *res, uWS::HttpRequest *req) {
serveFile(res, req); // essentially res->writeStatus(uWS::HTTP_200_OK);
asyncFileStreamer.streamFile(res, req->getUrl());
}请注意,serveFile()函数还需要处理图像的不同内容类型标题设置
提到的例子:https://github.com/uNetworking/uWebSockets/blob/master/examples/HttpServer.cpp
发布于 2022-09-18 11:53:18
为了扩展@amit.user105387的答案,下面是一个可行的解决方案的样子:
#include <uWebSockets/App.h>
#include <rapidjson/rapidjson.h>
#include "util/AsyncFileReader.h"
#include "util/AsyncFileStreamer.h"
#include "util/Middleware.h"
#include <iostream>
#include <string>
void get_home(uWS::HttpResponse<false> *res, uWS::HttpRequest *req) {
// res->writeHeader("Alt-Svc", "h2=\"localhost:8087\"public\"");
res->writeHeader("Content-Type", "text/html; charset=utf8");
AsyncFileReader page_contents("./public/html/home.html");
res->end(page_contents.peek(0));
}
void PrintCachedFiles(std::map<std::string_view, AsyncFileReader *> dict) {
for (auto it = dict.begin(); it != dict.end(); it++) {
std::cout << it->first << std::endl;
}
}
int main() {
const int port{8087};
const std::string public_folder{"./public"};
AsyncFileStreamer public_files("./public");
// HTTP
uWS::App app = uWS::App();
app.get("/", [&public_files](auto res, auto req){
std::cout << "root folder = "<< public_files.root << std::endl;
PrintCachedFiles(public_files.asyncFileReaders);
res->writeHeader("Content-Type", "text/html; charset=utf8");
public_files.streamFile(res, "/html/home.html");
res->writeStatus(uWS::HTTP_200_OK)->end();
});
app.get("/css/:path", [&public_files](auto res, auto req){
public_files.streamFile(res, req->getUrl());
res->writeStatus(uWS::HTTP_200_OK)->end();
});
app.get("/js/:path", [&public_files](auto res, auto req){
public_files.streamFile(res, req->getUrl());
res->writeStatus(uWS::HTTP_200_OK)->end();
});
app.get("/img/:path/*", [&public_files](auto res, auto req){
serveFile(res, req);
public_files.streamFile(res, req->getUrl());
res->writeStatus(uWS::HTTP_200_OK)->end();
});
app.get("/*", [&public_files](auto res, auto req){
res->writeStatus(uWS::HTTP_200_OK)->end("404: Page not found.");
});
app.listen(port, [&port](auto *token) {
if (token) {
std::cout << "Listening on port " << port << std::endl;
}
})
.run();
return 0;
}https://stackoverflow.com/questions/73649475
复制相似问题