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

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

1.说下call_body这函数

这里的Body就是之前说的处理http请求的方法,如下图

容易看出调用的是call_body/2的第三个分支,然后再看看我们写的简单的helloweb模块的开启服务器部分

这实际上是一个闭包的用法,即调用的是helloweb:loop(Req, DocRoot),DocRoot我自己写的是存放html文件的路径,方便下面处理http请求时用到,?MODULE是指当前的模块名

2.下面说一下helloweb:loop(Req, DocRoot)

这个方法一般是用户自己写的,实际上是将mochiweb各模块提供的API进行组装,得到想要的处理http请求的逻辑。

说一个特殊的地方,比如

Req:get(method)

一般我们用指定的模块名和函数名确定调用哪个API,但这里Req是一个元祖,可参考erlang程序设计第二版的第二十四章的有状态的模块,这里我截图了书上的解释

比如说,

{?MODULE, [Socket, Opts, Method, RawPath, Version, Headers]}:get(method)相当于?MODULE:get(method, [Socket, Opts, Method, RawPath, Version, Headers]).

3.

说一下怎样将消息体发送给浏览器,我自己写的一个逻辑是找到路径下的html文件,将写好的html文件发送给浏览器,浏览器会根据html文件的内容呈现静态页面。

这里是调用Req:serve_file/2这个函数,这个Req对象在mochiweb_request:new/6这个函数生成的

第一个元素就是模块名,即mochiweb_request,所以Req:serve_file/2就是mochiweb_request:serve_file/3,serve_file/3函数如下所示:

第一行代码会调用mochiweb_util:safe_relative_path/2,看这个函数的解释如下:

即检测相对路径是否是安全或未定义的,不安全和未定义的都会返回undefined。

如果是正确的相对路径,则会调用第二个分支,filename:join/2是路径名的拼接,然后用filelib:is_dir检查路径是否是一个目录,

如果是目录,则执行true流程,如果不是目录,则执行false流程

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

你可能感兴趣的文章
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>