mochiweb源码分析(四)

继续之前说到的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在erlang:decode_packet/3中说明。被动模式的套接字将通过gen_tcp:recv返回{ok, HttpPacket},而{active,once}的套接字将发送如{http, Socket, HttpPacket}的消息。

而我们从http://www.erlang.org/doc/man/erlang.html#decode_packet-3能够知道如下消息格式:

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对象

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值