cowboy源码分析(一)
前段时间导读了ranch的源码,具体见ranch 源码分析(一),
现在整理了下ranch框架下经典应用cowboy。
源码地方:https://github.com/ninenines/cowboy(目前使用的是cowboy-1.0.4版本)
还是找其中最简单的例子来入手,那就选这个static_world吧~~
首先我们来看static_world_app.erl
[root@erlang004 src]# cat static_world_app.erl %% Feel free to use, reuse and abuse the code in this file. %% @private -module(static_world_app). -behaviour(application). %% API. -export([start/2]). -export([stop/1]). %% API. start(_Type, _Args) -> Dispatch = cowboy_router:compile([ {'_', [ {"/", cowboy_static, {priv_file, static_world, "index.html"}}, {"/[...]", cowboy_static, {priv_dir, static_world, "", [{mimetypes, cow_mimetypes, all}]}} ]} ]), {ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [ {env, [{dispatch, Dispatch}]} ]), static_world_sup:start_link(). stop(_State) -> ok.
cowboy_router.erl是路径路由设置,我们就不看这个源码,直接看一下结果
1> cowboy_router:compile([ 1> {'_', [ 1> {"/", cowboy_static, {priv_file, static_world, "index.html"}}, 1> {"/[...]", cowboy_static, {priv_dir, static_world, "", 1> [{mimetypes, cow_mimetypes, all}]}} 1> ]} 1> ]). [{'_',[], [{[],[],cowboy_static,{priv_file,static_world,"index.html"}}, {['...'], [],cowboy_static, {priv_dir,static_world,[], [{mimetypes,cow_mimetypes,all}]}}]}]
其实这个路由的意思是如果请求的是/,就路由在priv目录的index.html下面,
否则就直接读取请求的文件。
然后我们开始看cowboy:start_http/4,就是应用启动的主进程,
-module(cowboy). -export([start_http/4]). -export([start_https/4]). -export([start_spdy/4]). -export([stop_listener/1]). -export([set_env/3]). %%省略若干行 -spec start_http(ranch:ref(), non_neg_integer(), ranch_tcp:opts(), cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}. start_http(Ref, NbAcceptors, TransOpts, ProtoOpts) when is_integer(NbAcceptors), NbAcceptors > 0 -> ranch:start_listener(Ref, NbAcceptors, ranch_tcp, TransOpts, cowboy_protocol, ProtoOpts). -spec start_https(ranch:ref(), non_neg_integer(), ranch_ssl:opts(), cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}. start_https(Ref, NbAcceptors, TransOpts, ProtoOpts) when is_integer(NbAcceptors), NbAcceptors > 0 -> ranch:start_listener(Ref, NbAcceptors,
%%省略若干行
可以看到这里启动ranch,而cowboy_protocol就是定义的用户进程,根据ranch源码(忘记了的参见ranch源码分析)理解,我们知道会启动cowboy_protocol:start_link/4来处理用户的应用数据请求
下面我们就进入cowboy的代码世界,从cowboy_protocol:start_link/4开始
(未完待续~)