title: route处理
date: 2019/12/21 14:50:52
toc: true
route处理
简述
在route.txt文件里定义了redirect的处理方法,goahead按照顺序依次检查客户端的请求,一旦请求path满足上面的条件后就会自动执行后面的cgi回调函数,当然,这些函数必须在goahead的初始化过程中进行注册,注册过程参看websOpen函数。 这个 extensions
是后缀名的意思
route uri=/cgi-bin dir=cgi-bin handler=cgi
route uri=/action handler=action
route uri=/upload methods=PUT|POST handler=upload
route uri=/ extensions=jst handler=jst
route uri=/ methods=OPTIONS|TRACE handler=options
我的理解是,一个网址先去匹配route
中的uri
,如果先匹配到则直接执行后面的handler
,正常的网址则在最后的uri=/
在route.txt中可以定义redirect选项,比如针对login,如果状态码是200,就跳转到home.asp,如果401,就跳转到login.html
route uri=/action/login methods=POST handler=action redirect=200@/home.asp redirect=401@login.html
分析
在源码浅析里 websRouteRequest(wp)
先匹配route
static bool parseIncoming(Webs *wp)
{
// ..
parseFirstLine(wp);//解析第一行信息
if (wp->state == WEBS_COMPLETE) {
return 1;
}
parseHeaders(wp);//解析整个请求,把请求每一个属性记录下来,存在WP中
if (wp->state == WEBS_COMPLETE) {
return 1;
}
wp->state = (wp->rxChunkState || wp->rxLen > 0) ? WEBS_CONTENT : WEBS_READY;//解析头来判断是不是有内容,是不是有输入。
websRouteRequest(wp);//route的意思是将这个wp与route.txt中每一行相匹配,如果能匹配,wp-route = route
//....
}
根据route中的定义,响应类型具体有actionHandler(post请求),jstHandler(动态页面),fileHandler(默认静态页面),cgiHandler(调用外部程序)等。在这些handler中将数据返回给客户端。extensions就是后缀名,如果请求的文件后缀是.jst就会调用jstHandler。
handler类型
-
actionHandler比较简单,就是通过hash表,将actionName与对应websDefineAction定义的函数回调匹配上,去回调自己定义的回调函数即可,入参wp。用户定义action的行为中,要自己返回客户端action的结果。
-
jstHandler处理流程是先将page读取到内存中,从第一个字节开始,依次发送给客户端,遇到<%
%>之后,回调绑定的C函数,将函数返回结果替换<% %>返回客户端,直到页面的所有内容都发完。
这种技术可以使得页面可以动态根据服务器执行C函数的结果来响应内容。也就是动态页面。 -
fileHandler就是普通静态文件传输
-
cgiHandler调用外部的程序执行,从字面上理解如果是调用外部程序,还需要考虑到进程间通信。在我接触的项目中没有用到这个功能,不去研究。实际上嵌入式的WEB服务器不一定要用到这个。
消息处理
form,action,cgi,Options都可以统归为一类,只要在router.txt中定义好处理方法就行了,注册如下(所有的注册都类似):
websDefineAction("your_actions_handle", your_actions_handle_fun);