zoukankan      html  css  js  c++  java
  • 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
    

    mark

    分析

    在源码浅析里 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);
    
  • 相关阅读:
    UVA11367 Full Tank?
    不均衡样本集问题
    NLP interview
    Linux 指令
    Python 趣题
    Grid Illumination
    动态规划-Minimum Cost to Merge Stones
    Contest 141
    Python join()方法
    Single Number
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/12109380.html
Copyright © 2011-2022 走看看