代码拉取完成,页面将自动刷新
灵感来自于其他c++知名web框架, FabCc的定位是一个网络框架, 其特点是低代码, 高性能, 强类型, 超标准, 最安全, 很牛逼。logo采用Nod的logo,设计来自命令与征服(CNC)。
4月12日,超高清8k重制版到来。支持Gzip压缩网页降低流量消耗。修复各种bug,兼容了现代json、c++11,修复了keep-alive保活机制, 推出最强c++20无栈协程,以下是对比图。
std::string_view sv = k(&O::id);
将返回"O
.id
",(在C++14及更高版本可用constexpr修饰)。cmake --build ./build --config Release -j
既可并行编译。using namespace fc;
int main() {
App app; Timer t;
app.file_type({ "html","htm","ico","css","js","json","svg","png","jpg","gif","txt","wasm","mp4","webm","mp3","wav","aac" })
.sub_api("/", app.serve_file("static")).set_keep_alive(4, 3, 2).set_use_max_mem(600.0)
.set_file_download(true);//设置启用文件下载,这是新的接口
app.default_route() = [](Req& req, Res& res)_ctx {
res.set_content_type("text/html;charset=UTF-8", 23); res.set_status(404);
res.write_async_s([] {
char name[64]; gethostname(name, 64); Json x{ {"header", name} }; return mustache::load("404NotFound.html").render(x);
}); co_return;//设置默认的路由
};
app["/get_upload"] = [](Req& req, Res& res)_ctx {
res.write_async([] {
auto f = fc::directory_iterator(fc::directory_ + fc::upload_path_); Json x;
std::set<std::string_view> extentions = { "mp4", "mp3", "webm", "wav", "mkv" };
for (auto v : f) {
if (std::find(extentions.begin(), extentions.end(), fc::toLowerCase(v.ext)) != extentions.end()) {
x.push_back({ {"name",v.name.substr(fc::directory_.size())}, {"size",v.size} });
}
} return x;
}); co_return;//获取上传的文件列表
};
app["/read_file"] = [](Req& req, Res& res)_ctx { res.write_async([] { Json x = json::read_file("test.json"); return x; }); co_return; };
app["/json"] = [](Req& req, Res& res)_ctx {
Json x; Book b{ "ts", Person{"js",6, Book{"plus" }, vec<Book>{ {"1", Person {"sb" }}, {"2", Person {"sb" }} }} };
b.person->book = Book{ "rs", null, vec<Person>{ {"?"}, {"!"} } }; x = b; res.write(x); co_return;//json请求
};
app["/serialization"] = [](Req& req, Res& res)_ctx {
Json x = json::parse(R"(
{"name":"ts","person":{"name":"js","age":33,"book":{"name":"ojbk","person":{"name":"fucker","age":0},
"persons":[{"name":"stupid","age":1},{"name":"idoit","age":2},{"name":"bonkers","age":3,"book":{"name":"sb"}}]}}}
)"); Book b = x.get<Book>(); b.person->book->persons[2].name = "wwzzgg"; x = b; res.write(x.dump()); co_return;//反序列化与序列化
};
app["/api"] = [](Req& req, Res& res)_ctx { res.write(res.app._print_routes()); co_return; };//返回路由列表
app.post("/api") = [](Req& req, Res& res)_ctx {
BP bp(req, 1000); co_await bp.run(); std::string s;//支持上传的文件总大小1000MB
for (auto p : bp.params) {
s << (p.key + ": ") << p.value << ", ";
}
s.pop_back(); s.pop_back(); res.write(s); co_return;
};
app["/del"] = [](Req&, Res& res)_ctx { res.app["/"] = nullptr; res.write("主页的路由已被删除!!"); co_return; };
app["/timer"] = [](Req& req, Res& res)_ctx {
req.setTimeout([] { raise(SIGINT); }, 6000); res.write("关闭服务倒计时启动!"); co_return;
};
//启动服务器,同样支持ipv6
app.http_serve(8080);
}
建议使用CMake进行源代码外构建。
如果构建失败,请删除清理cmake缓存, 建议先删除build目录。
cmake -B build
后的额外编译选项。
使用vcpkg -DCMAKE_TOOLCHAIN_FILE=../vcpkg.cmake
使用llhttp解析器 -DLLHTTP=1
使用openssl -DOPENSSL=1
cmake -B build -DLLHTTP=0 -DOPENSSL=0
cmake --build ./build --config Release -j
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。