Update tutorial-09-http_file_server.md

This commit is contained in:
xiehan
2022-08-02 20:20:02 +08:00
committed by GitHub
parent 034fc49065
commit 120507fd5c
+48
View File
@@ -7,6 +7,7 @@
http_file_server是一个web服务器,用户指定启动端口,根路径(默认为程序当路程),就可以启动一个web server。
用户还可以指定一个PEM格式的certificate file和key file,启动一个https web server。
程序在启动server之后,可以从命令行接受用户输入,并通过127.0.0.1地址来访问这个server。
程序主要展示了磁盘IO任务的用法。在Linux系统下,我们利用了Linux底层的aio接口,文件读取完全异步。
# 启动server
@@ -141,6 +142,53 @@ buf域的内存我们是自己管理的,可以通过append_output_body_nocopy(
在回复完成后,我们会free()这块内存,这个语句在process里:
server_task->set_callback([](WFHttpTask *t){ free(t->user_data); });
# 命令行交互
启动server后,用户可以在控制台输入文件名来访问server。当输入文件名为空(Ctrl-D),关闭server并结束程序。
这里,我们使用了WFRepeaterTask来实现这个循环接受输入的过程。WFRepeaterTask是一种循环任务,产生的接口如下:
~~~cpp
using repeated_create_t = std::function<SubTask *(WFRepeaterTask *)>;
using repeater_callback_t = std::function<void (WFRpeaterTask *)>;
class WFTaskFactory
{
WFRpeaterTask *create_repeater_task(repeated_create_t create, repeater_callback_t callback);
};
~~~
通过create函数,可以创建一个repeater任务。repeater内部会反复调用create,产生一个任务并运行,直到create返回空指针。
在我们的这个示例里,create函数内部调用scanf。当用户输入为空时,create返回NULL,整个循环过程结束。
当用户输入不为空(文件名),产生一个访问127.0.0.1地址的http任务来访问我们开启的server。
~~~cpp
{
auto&& create = [&scheme, port](WFRepeaterTask *)->SubTask *{
...
scanf("%1023s", buf);
if (*buf == '\0')
return NULL;
std::string url = scheme + "127.0.0.1:" + std::to_string(port) + "/" + buf;
WFHttpTask *task = WFTaskFactory::create_http_task(url, 0, 0,
[](WFHttpTask *task) {
...
});
return task;
};
WFFacilities::WaitGroup wg(1);
WFRepeaterTask *repeater;
repeater = WFTaskFactory::create_repeater_task(create, [&wg](WFRepeaterTask *) {
wg.done();
});
repeater->start();
wg.wait();
server.stop();
}
~~~
最后,当create返回NULL,repeater被callback。我们关闭server并结束程序。
# 关于文件异步IO的实现
Linux操作系统支持一套效率很高,CPU占用非常少的异步IO系统调用。在Linux系统下使用我们的框架将默认使用这套接口。