Mongoose6.0源码分析(2)-http数据处理

原创 2015年11月19日 16:58:54

http_handle开始新的旅程(老吴analyze_request


调用1:

mg_parse_http :处理请求包和应答包的头部

   {

    get_request_len:得到http包头状态行的长度,不包括body。

    mg_skip计算了请求行各标记的长度,不计空格

     [  

     

//////请求包

    s = mg_skip(s, end, " ", &hm->method);//将method的长度存储在hm->method.len,并把s指到uri的第一位,并将hm->method.p指在起始位置
    s = mg_skip(s, end, " ", &hm->uri);
    s = mg_skip(s, end, "\r\n", &hm->proto);

////应答包

    s = mg_skip(s, end, " ", &hm->proto);//协议处理

    hm->resp_code = atoi(s);//转换应答码

   s = mg_skip(s, end, "\r\n", &hm->resp_status_msg);//即 OK

    ]

    parse_http_headers:处理包头键值对,存储在array(header_names,header_value)中,通过Content-Length键值读取body长度body.len。

    req->message.len = len + req->body.len; //获得了总长度

   }


调用2: (s = mg_get_http_header(&hm, "Transfer-Encoding")) != NULL &&
        mg_vcasecmp(s, "chunked") == 0) {

    {

   这里是判断是否存在Transfer-Encoding键,及值是否为chunked;

  传输数据编码:Transfer-Encoding 
  数据编码,即表示数据在网络传输当中,使用怎么样的保证方式来保证数据是安全成功地传输处理。可以是分段传输,也可以是不分段,直接使用原数据进行传输。 
  有效的值为:Trunked和Identity. 

     }

调用3:mg_handle_chunked 处理分块传输 处理分块传输的数据(如果有的话)

  

   

回到http_handle

    else if (hm.message.len <= io->len) { //正确时走这里
      /* Whole HTTP message is fully buffered, call event handler */ //完全传送了调用事务处理

     nc->handler(nc, nc->listener ? MG_EV_HTTP_REQUEST : MG_EV_HTTP_REPLY,
                  &hm);  //调用了用户指定函数,分别是处理请求和做应答

   用户设置的回调函数调用 mg_serve_http

              [ 

                 1、  uri_to_path(hm, path, sizeof(path), &opts); //16进制字符码解码,uri重写(?)

                        [

                                *host_hdr = mg_get_http_header(hm, "Host");mg_get_http_header(hm, "Host");//寻找host键值对,返回值为键值对地址,给host_hdr

                                mg_url_decode(hm->uri.p, hm->uri.len, uri, sizeof(uri), 0);//16进制代替的字符解码(这函数名起的不好,糊涂) .p指在当前值起始位置

                                

                        ]

                2、指定了默认参数

                 3、mg_send_http_file 根据收到的http头内容分析,主要是对请求路径提取,对客户端进行反馈

                     [

                             static int is_dav_request(const struct mg_str *s) :寻找 "PUT","DELETE","MKCOL","PROPFIND"等特殊用法

                             S_ISDIR(st.st_mode)  ==#define S_ISDIR(x) ((x) &_S_IFDIR)  将st.st_mode与_S_IFDIR按位与,判定路径是目录还是文件

                             send_http_error(nc, 501, NULL);发送错误501 // 501错误:Web 服务器不理解或不支持客户端发送给它的 HTTP 数据流中找到的 HTTP 方法。

                            is_authorized:

                           mg_stat(path, &st):查找路径是否存在

                           !find_index_file(path, path_buf_len, opts->index_files, &st)) { //找寻路径下默认文件名,如index.htm存在,把文件信息存在st指向的缓存中,返回是否找到,找到返回1.否则返回0

                        

                     (注明一下opt选项

                            //s_http_server_opts.document_root = ".";  // Serve current directory  
                           //s_http_server_opts.enable_directory_listing = "yes"; 

                             //opts.per_directory_auth_file = ".htpasswd";

                             //opts.enable_directory_listing = "yes";

                           //opts.cgi_file_pattern = "**.cgi$|**.php$";

                           // opts.ssi_pattern = "**.shtml$|**.shtm$";

                           //opts.index_files = "index.html,index.htm,index.shtml,index.cgi,index.php";

                     )

                     mg_send_http_file2:重点处理了带range参数的请求包头,根据range情况计算应答文件长度,生成应答包头,并调用

                      transfer_file_data();

                            [

                                 transfer_file_data()组合数据,发送应答包。

                            ]

                          mg_printf(重要的函数)len = mg_vprintf(conn, fmt, ap);//把ap中的数据存入conn->send_mbuf中

                      ]

             ]

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Mongoose6.0源码分析(3)-重要结构体

这方面应该先研究的,但是不往下看很难明白要这么复杂的结构体,所以在读其他代码是慢慢分析 struct mg_mgr {   struct mg_connection *active_connectio...

c++利用mongoose实现http服务

近来在项目中需要实现一个http service的功能。虽然可以通过封装socket自己实现http的发送和解析。但考虑到目前网络上还是有大量的http的解析源码,自己再从头实现一番稍显麻烦。因此在网...

基于Hadoop的日志收集框架---Chukwa的源码分析(数据处理)

1.工具类、接口简介 (1) Java代码      // 用于对数据进行分类      org.apache.hadoop.chukwa.extraction.demu...

live555源码分析----H264的数据处理

现在来分析live555中关于H264的处理部分,主要包括从文件中读取数据进行并进行frame(NALU)的分割,然后对frame进行分片,这些工作都是在frame交给RTP sink之前完成的。接着...

live555源码分析----H264的数据处理

现在来分析live555中关于H264的处理部分,主要包括从文件中读取数据进行并进行frame(NALU)的分割,然后对frame进行分片,这些工作都是在frame交给RTP sink之前完成的。接着...
  • gavinr
  • gavinr
  • 2011-12-05 14:56
  • 25753

live555源码分析----H264的数据处理

现在来分析live555中关于H264的处理部分,主要包括从文件中读取数据进行并进行frame(NALU)的分割,然后对frame进行分片,这些工作都是在frame交给RTP sink之前完成的。接着...

基于Hadoop的日志收集框架---Chukwa的源码分析(数据处理)

基于Hadoo的日志收集框架---Chukwa的源码分析(数据处理) 1.工具类、接口简介 (1) Java代码      // 用于对数据进行分类      org.apache.h...

基于rt-thread+lwip源码分析-LWIP的IP层数据处理代码解析(lwip源码解析二)

LWIP的IP层数据处理代码解析 继续分析rt-thread的网络接收数据部分的代码。。。。 上移章节我们介绍了数据如何从网卡接收到lwip的pbuf里面的,现在我们紧跟着上一章节的内容介绍下网络数据...

Mongoose源码剖析:数据结构篇

引言 Mongoose中有几个数据结构扮演着重要的角色,它们分别是: struct mg_context:保存Mongoose的上下文,几乎每个函数都有mg_context参数 st...

Apache Spark源码走读之4 -- DStream实时流数据处理

Spark Streaming能够对流数据进行近乎实时的速度进行数据处理。采用了不同于一般的流式数据处理模型,该模型使得Spark Streaming有非常高的处理速度,与storm相比拥有更高的吞能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)