route处理

目录


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

route处理

分析

在源码浅析里 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
//....
}

再处理 goahead源码解析(三) 响应HTTP请求

根据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);
上一篇:吴裕雄--天生自然C++语言学习笔记:C++ Web 编程


下一篇:如何在网站上显示实时python脚本输出?