博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mochiweb源码分析(四)
阅读量:2058 次
发布时间:2019-04-29

本文共 1768 字,大约阅读时间需要 5 分钟。

继续之前说到的do_accept函数,

1.accept得到套接字之后会调用call_loop/3

这里的Loop就是之前写的元祖,如下图:

根据匹配原则可知调用的是上图中的第二个call_loop,即mochiweb_http:loop(Socket, Opts, A1),A1就是自己定义的处理http请求的方法。

2.接下来看看loop函数

loop函数第一行的setopts(Socket, [{packet, http}])是设置返回的消息是超文本传输协议,exit_if_closed是判断是否因错误而关闭连接。

{packet, http}这个选项将决定返回的消息的格式,看下erlang文档里面的解释

返回数据包的格式HttpPacket在中说明。被动模式的套接字将通过gen_tcp:recv返回{ok, HttpPacket},而{active,once}的套接字将发送如{http, Socket, HttpPacket}的消息。

而我们从能够知道如下消息格式:

HttpPacket = HttpRequest | HttpResponse | HttpHeader | http_eoh | HttpError

HttpRequest = {http_request, HttpMethod, HttpUri, HttpVersion}

也就是最后,读取到的消息应该满足如下格式:

{http, Socket, {http_request, HttpMethod, HttpUri, HttpVersion}}

3.也就是正常情况下读到的消息是receive中的第一个匹配,其他的匹配均是错误或连接已关闭的情况.

ok = mochiweb_socket:exit_if_closed(mochiweb_socket:setopts(Socket, [{packet, httph}])),

关于这里使用的{packet, httph},文档上面有解释

大致的意思是:

超文本传输协议。数据包返回的格式根据上述HttpPacket。一个包可以是一个请求,响应,一个头或端头标记。无效行返回HttpError。

确认请求的方法和报头域返回原子。其他返回作为字符串。

当预计一个HttpRequest或者一个HttpResponse,http协议类型应该只用于第一行。

下面的调用应该使用httph得到HttpHeaderhttp_eoh返回结束的标志头并开始任何以下消息体。

该变种http_bin和httph_bin将返回字符串(httpstring)为二进制文件代替列表。

4.

headers(Socket, Opts, {Method, Path, Version}, [], Body, 0);

这里将上面得到的http请求的处理方法,url路径,http协议的版本和处理http请求的方法(Body参数)传入headers函数,这个函数主要是用来解析http请求头部。

这个函数有两个分支,我们先看第一个,当HeaderCount为?MAX_HEADERS时,调用第一个分支,注释:Too many headers sent, bad request,发送太多的头部,坏的请求,即第一个分支是对发送太多的头部的处理。

宏定义如下:

-define(MAX_HEADERS, 1000).

第二个分支是先修改Socket选项为{active, once},接着使用receive读取一条消息

消息格式说明:

{http, Socket, HttpPacket}

HttpPacket = HttpHeader | http_eoh

HttpHeader = {http_header, integer(), HttpField, Reserved=term(), Value=HttpString}

只要不是返回{http, Socket, http_eoh}就递归调用mochiweb_http:headers/5函数继续解析头部,并且保存{Name, Value}到Headers列表头部.

而当解析得到{http, Socket, http_eoh}时,则生成Req对象

下一篇讲解生成Req对象

 

 

 

转载地址:http://xxxlf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-41》75.颜色分类
查看>>
Leetcode C++《热题 Hot 100-42》78.子集
查看>>
Leetcode C++《热题 Hot 100-43》94.二叉树的中序遍历
查看>>
Leetcode C++ 《第175场周赛-1 》5332.检查整数及其两倍数是否存在
查看>>
Leetcode C++ 《第175场周赛-2 》5333.制造字母异位词的最小步骤数
查看>>
Leetcode C++ 《第175场周赛-3》1348. 推文计数
查看>>
Leetcode C++《热题 Hot 100-44》102.二叉树的层次遍历
查看>>
Leetcode C++《热题 Hot 100-45》338.比特位计数
查看>>
读书摘要系列之《kubernetes权威指南·第四版》第一章:kubernetes入门
查看>>
Leetcode C++《热题 Hot 100-46》739.每日温度
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
[Kick Start 2020] Round A 2.Plates
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>