uhttpd在整体的架构中,负责与客户端进行通信,有关的相关解析,都在程序中cgi部分实现,例如解析与组装http的格式,调用相应的脚本文件。其具体关系如下图所示
相应的uhttp配置
这里通过解析url_prefix确定去执行那种方式,在我们使用的系统中使用的cgi_prefix,当相应的url包含/cgi-bin时,就去执行相应的脚本程序。
cgi程序的作用
CGI即通用网关接口,是外部应用程序(即CGI程序)与WEB服务器之间的接口标准,负责在CGI程序和Web服务器之间传递信息。
下图中的r = luci.http.Request(…)函数主要的作用是用来获取客户端提交的信息如图1 图2 所示
其中luci.dispather.httpdispatch(…)函数,主要用来解析相应的http指令,执行相应的脚本,同时组建http相关的帧
res为协同程序的状态
id=1,响应消息比如200OK
id为2,3组建相应的消息头部,http的格式里的 如图3所示
id为4时,是向uhttpd发送相关的html代码 如图4所示
id为5时,刷新缓冲区
io.write(…)是向uhttpd服务器发送信息
httpdispatch部分函数的解析
当访问登录成功时,会跳转到下面这个页面
通过对上面的打印信息,可以发现进入的是'/admin/network/mwan/overview/interface_status'这个页面,进入相应的文件夹下打开相应的html文件
当调用这个函数时,会为传递的参数(一个函数)再建立一个协程,当协程中的协程yield时,会递归的把上一级直到dispatch这个协程yield
在dispatch(…)函数中,最关键的部分
这部分代码将\lua\luci\controller下的所有的脚本文件存放在index表中
表中存放的是相应的lua的名称,和里面对应的index的函数,再将所有脚本设置为可执行状态
在回到createtree函数中,遍历index表,将所有的lua脚本运行起来,所以开始设置的页面就在这个文件里加载起来了。
entry函数就会生成一个node-tree,父节点的nodes会记录它的子节点
request是输入url,根据这个找到相应的nodes。最后将nodes对应的target使用copcall运行
target主要是cbi、template、call这些返回的都是table,firstchildred、alias返回的是函数
_cbi调用cbi.load函数,加载运行
剩下的还在研究……