route处理
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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)