6——嵌入式WebServer的移植——appweb实现文件上载(upload)

开发一个从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了解不多,网上也没有其他资料。这次如果不是开发上载文件功能也不会研究。通过这几天的学习,对整体隐隐有了一点了解,如果后面有时间能再深入研究,会再详细描述。

你可能感兴趣的:(网络,linux)