6——嵌入式WebServer的移植——appweb实现文件上载(upload)
开发一个从chrome上传文件到嵌入式设备上的功能,再次调试appweb。费了九牛二虎之力最终实现了。appweb对http支持非常完整加上我对http理解算不上精通导致了巨大的困难,现在将一些心得分享出来。sample中的实现在samples文件夹中esp-upload是上载的例子。其中README.md中介绍了运行方法和地址,测试好用。整个功能是appweb加载解析appweb.con...
开发一个从chrome上传文件到嵌入式设备上的功能,再次调试appweb。费了九牛二虎之力最终实现了。appweb对http支持非常完整加上我对http理解算不上精通导致了巨大的困难,现在将一些心得分享出来。
sample中的实现
在samples文件夹中esp-upload是上载的例子。其中README.md中介绍了运行方法和地址,测试好用。整个功能是appweb加载解析appweb.conf、esp.json和upload.esp这3个文件实现。我对appweb了解不到十之一二,导致几乎完全无法理解,只能一点点调试appweb程序,尽量理清思路。虽然现在功能实现了,但我依然无法说清程序运行的具体细节。虽然现在功能实现了,但我依然无法说清程序运行的具体细节。
我的实现——加了一行代码
在config.c中的maConfigureServer接口return前加一行代码:httpAddRouteFilter(route, "uploadFilter","",HTTP_STAGE_RX);如下所示:
PUBLIC int maConfigureServer(cchar *configFile, cchar *home, cchar *documents, cchar *ip, int port)
{
HttpEndpoint *endpoint;
HttpRoute *route;
route = httpGetDefaultRoute(0);
if (maLoadModules() < 0) {
return MPR_ERR_CANT_INITIALIZE;
}
if (configFile) {
if (maParseConfig(configFile) < 0) {
return MPR_ERR_CANT_INITIALIZE;
}
} else {
if ((endpoint = httpCreateConfiguredEndpoint(0, home, documents, ip, port)) == 0) {
return MPR_ERR_CANT_OPEN;
}
configureHandlers(route);
}
httpAddRouteFilter(route, "uploadFilter","",HTTP_STAGE_RX);//add
return 0;
}
这个接口的功能是读取配置文件appweb.conf并解析,因为我没有修改配置文件,所以在消息处理路由链表的接收部分加了uploadFilter模块。使得每次消息处理的时候都会调用一次uploadFilter模块,这个模块实现的功能就是处理上载数据。httpOpenUploadFilter接口进行了函数指针的赋值,程序运行后,程序会根据http的规则进行调用。
程序运行逻辑非常复杂,其中httpProtocol是其中穿针引线的接口,处在整条链路的中间环节。上接io,下面是各种处理逻辑。如果不想通过配置文件进行程序逻辑修改,自由实现基于http消息的各种功能,把自己的接口放在httpProtocol里面或返回之后都是不错的选择。具体情况需要具体分析,http完整协议远比我了解的复杂。
写在最后
appweb了解不多,网上也没有其他资料。这次如果不是开发上载文件功能也不会研究。通过这几天的学习,对整体隐隐有了一点了解,如果后面有时间能再深入研究,会再详细描述。
更多推荐
所有评论(0)