代码改变世界

随笔分类 -  Cowboy

Cowboy 源码分析(二十八)

2012-07-09 08:03 by rhinovirus, 1623 阅读, 收藏, 编辑
摘要: 大家好,上一篇我们总结了cowboy_examples这个例子启动时,进程的启动总结,这一篇,我们看下cowboy如何响应来自浏览器的请求。 首先我们看下,在上一篇cowboy_acceptors_sup启动的100个cowboy_acceptor工作进程,而这个工作进程在初始化时,同时等待来自浏览器的Socket连接,代码如下:-spec start_link(inet:socket(), module(), module(), any(), pid(), pid()) -> {ok, pid()}.start_link(LSocket, Transport, Protocol,... 阅读全文

Cowboy 源码分析(二十七)

2012-07-08 12:42 by rhinovirus, 1483 阅读, 收藏, 编辑
摘要: 大家好,从2012-05-15号开始的第一篇Cowboy源码分析,到上一篇2012-07-04的第二十六篇为止,我们已经完整的看完了,Cowboy的启动,处理来自浏览器的请求,响应等整个过程。这这一篇,我们来做个总结。毕竟这是我第一个接触的Erlang开源项目,今天回过头来,从整体上去看这个项目。 首先是cowboy应用的启动,我们从observer上可以看到,当该应用程序启动时,启动进程情况,如下图: 我们右键可以查看该进程的相关信息,这点observer做的还是挺方便的,如下图: 下图为打开的进程信息窗口: 从上面可以很容易的获取一些和该进程相关的信息,比如进程名称... 阅读全文

Cowboy 源码分析(二十六)

2012-07-04 00:30 by rhinovirus, 1464 阅读, 收藏, 编辑
摘要: 大家好,这边给大家推荐一本马上要上市的书《Erlang/OTP并发编程实战》,想要学习Erlang的朋友不要错过,这本书的作者是Martin Logan, Eric Merritt, Richard Carlsson,译者是百度的连城,具体可以看下这里:http://www.ituring.com.cn/book/828 好了,广告发完了,回到今天的正题,继续跟大家分享Cowboy源码。上一篇,讲完了 cowboy_http_req:body_length/1 函数,今天继续往下看,如图: 这里返回的 Length = 0,所以这里返回 {done, Req3#http_req{b... 阅读全文

Cowboy 源码分析(二十五)

2012-07-03 01:36 by rhinovirus, 1288 阅读, 收藏, 编辑
摘要: 大家好,之前想改改熬夜的习惯,无奈熬夜的习惯改不过来啊,毕竟熬了几年了,改起来确实费劲,那就继续学习吧,好几天没跟新这个系列了,今天接着上一篇未讲完的继续跟大家分享。stream_body(Req=#http_req{body_state=waiting}) -> case parse_header('Transfer-Encoding', Req) of {[<<"chunked">>], Req2} -> stream_body(Req2#http_req{body_state= {stream, fun cowb.. 阅读全文

Cowboy 源码分析(二十四)

2012-06-29 08:40 by rhinovirus, 1467 阅读, 收藏, 编辑
摘要: 大家好,调整下作息时间,以后尽量不熬夜写文章了,改成早上早起写。试试这样的作息习惯吧,不是有句话说吗,早睡早起精神好,其实主要是熬夜确实对身体不太好。好了,回归正题,上一篇,我们分析到 cowboy_http_protocol:terminate_request/3 函数第一行,今天我们来看下一行,也就是:next_request(Req, State, HandlerRes). cowboy_http_protocol:next_request/3函数代码如下:-spec next_request(#http_req{}, #state{}, any()) -> ok.next_req 阅读全文

Cowboy 源码分析(二十三)

2012-06-27 01:09 by rhinovirus, 1068 阅读, 收藏, 编辑
摘要: 大家好,上一篇在文章的最后我们提到cowboy_http_protocol:terminate_request/3 函数,今天我们继续往下看:-spec terminate_request(any(), #http_req{}, #state{}) -> ok.terminate_request(HandlerState, Req, State) -> HandlerRes = handler_terminate(HandlerState, Req, State), next_request(Req, State, HandlerRes). 这个函数就两行代码: 首先调用c... 阅读全文

Cowboy 源码分析(二十二)

2012-06-26 00:01 by rhinovirus, 1865 阅读, 收藏, 编辑
摘要: 今天又是早早下班,买了排骨,莲藕,现在正压着排骨莲藕汤,从小就学做饭,发现其实做饭也蛮多乐趣的。等这篇文章发布以后,我应该已经吃完很久了,哈哈。回到主题,上一篇,我们cowboy_http_protocol:dispatch/2 函数,今天我们来看cowboy_http_protocol:handler_init/2 函数:-spec handler_init(#http_req{}, #state{}) -> ok.handler_init(Req, State=#state{transport=Transport, handler={Handler, Opts}}) ->... 阅读全文

Cowboy 源码分析(二十一)

2012-06-25 00:39 by rhinovirus, 1766 阅读, 收藏, 编辑
摘要: 大家好,今天继续跟大家分享Cowboy的源码分析,这一篇,我们看下cowboy_http_protocol:onrequest/2函数,完整代码如下:%% Call the global onrequest callback. The callback can send a reply,%% in which case we consider the request handled and move on to the next%% one. Note that since we haven't dispatched yet, we don't know the%% handl 阅读全文

Cowboy 源码分析(二十)

2012-06-21 00:13 by rhinovirus, 1454 阅读, 收藏, 编辑
摘要: 大家好,这几天在忙游戏的端午节活动,在这里也提前跟大家说一声端午节快乐,如果你们的公司遵守国家规定,应该是放假三天,那么,大家想吃粽子吃粽子,想划龙舟划龙舟(不知道有没地方),不知道大家老家的粽子都是什么味道,映像最深刻的是小时候,端午节会有新的衣服穿,但是换之前需要用艾叶洗澡,好像我在北京都很少见过,还有就是老家的肉粽还是蛮让人怀念的。 好了,回到正题,上一篇,我们在文章最后,提到了在cowboy_http_req:response/5函数的最后给这个处理请求的进程发送了一个消息 {?MODULE, resp_sent}, 今天,我们来看下,这个进程收到这条消息,又会怎么做呢? 我们... 阅读全文

Cowboy 源码分析(十九)

2012-06-20 01:18 by rhinovirus, 1386 阅读, 收藏, 编辑
摘要: 这一篇,接着上一篇没有讲完的内容,继续来看cowboy_http_req:reply/4 函数,我们从下面这段代码开始: RespConn = response_connection(Headers, Connection), ContentLen = case Body of {CL, _} -> CL; _ -> iolist_size(Body) end, HTTP11Headers = case Version of {1, 1} -> [{<<"Connection">>, atom_to_connection(Conne 阅读全文

Cowboy 源码分析(十八)

2012-06-15 01:00 by rhinovirus, 1549 阅读, 收藏, 编辑
摘要: 在上一篇中,我们整理了下cowboy_http_protocol:header/3函数,在文章的末尾留下2个没有讲到的函数,今天,我们先看下cowboy_http_protocol:error_terminate/2函数,另一个函数下一篇,我们再看。cowboy_http_protocol:error_terminate/2函数定义如下:%% Only send an error reply if there is no resp_sent message.-spec error_terminate(cowboy_http:status(), #state{}) -> ok.error_ 阅读全文

Cowboy 源码分析(十七)

2012-06-13 00:54 by rhinovirus, 1674 阅读, 收藏, 编辑
摘要: 大家好,今天继续跟大家分享Cowboy,我发现最近有点慢,没有刚开始写的那么凶猛了,自己想了想:一个是时间上没办法保证了,另一个是自己有点散漫。得好好调整下,一定要坚持下去。游戏马上要上大平台了,最近版本多,事多,但这都不是理由,呵呵,时间就像女人的乳沟,挤挤还是有的。所以到家,洗个澡,继续努力。好了,说的有点多了,回到正题。 上一篇,我们在文章最后,留下了几个疑问,今天一并解决。 首先是,当 erlang:decode_packet/3,这个函数返回 {ok, Header, Rest},而由于Header参数的值不同,将匹配 cowboy_http_protocol:header/... 阅读全文

Cowboy 源码分析(十六)

2012-06-11 14:05 by rhinovirus, 1551 阅读, 收藏, 编辑
摘要: 大家好,有四天没跟新这个系列了,因为这几天连续在公司加班,出版本,都是凌晨3,4点才到家,早上一醒来,又去公司忙,昨晚总算把版本发出去了,今天如果没有紧急BUG,在家写会博客,晚会再去。可能做游戏就是如此的节奏,如果有朋友想进游戏这行,就要想想自己能不能抗住这样无加班工资的加班节奏。 说的有点多了,回到Cowboy,在上一篇结尾,我们提到ConnAtom = cowboy_http:connection_to_atom(ConnTokens),%% @doc Walk through a tokens list and return whether%% the connection is... 阅读全文

Cowboy 源码分析(十五)

2012-06-06 00:29 by rhinovirus, 1598 阅读, 收藏, 编辑
摘要: 大家好,无意间发现 CodeMirror,挺不错的,在线代码编辑器,支持erlang,go等等语言,官方介绍如下: CodeMirror is a JavaScript component that provides a code editor in the browser. When a mode is available for the language you are coding in, it will color your code, and optionally help with indentation. A rich programming API and a CSS ... 阅读全文

Cowboy 源码分析(十四)

2012-06-05 00:58 by rhinovirus, 1488 阅读, 收藏, 编辑
摘要: 大家好,今天接着做几个测试,把上一篇理解并不透彻的几个方法再加强下: 第一个,测试 cowboy_http:whitespace/2 方法的作用,测试代码以及结果如下,左边是测试代码,右边是测试结果: 这样就能很明白的看出这个这个函数的作用了,注意:测试结果第二行,\s 变成空格了。 第二个,测试 cowboy_http:list/3 以及 cowboy_http:token_ci/2 方法,增加打印log,测试代码如下:-module(main).-export([start/0, stop/0]).start() -> io:format("test 1 ~n") 阅读全文

Cowboy 源码分析(十三)

2012-06-03 14:17 by rhinovirus, 1851 阅读, 收藏, 编辑
摘要: 这两天花了些时间搭建了下Go的开发环境,看了些基本的语法,感觉有类c语言基础的朋友们,学起来会容易些,学习Go语言的障碍会比erlang来的少的多。以后有机会跟大家分享Go吧,这边给大家截个图,分享下: 怎么样,看起来是不是跟C好像,呵呵,好了,回到Cowboy,上一篇,我们知道通过 cowboy_http_protocol:header/3 函数和 cowboy_http_protocol:parse_header/2之间的递归调用,来解析头部的每一行,我在上一篇提到 Headers最后一行的为 Connection,那么我们看下,cowboy_http_protocol:head... 阅读全文

Cowboy 源码分析(十二)

2012-05-31 00:11 by rhinovirus, 3076 阅读, 收藏, 编辑
摘要: 今天,又是按时下班,吃饱饭,继续跟大家分享Cowboy,昨天有件高兴的事,我尝试用闪存给@博客园团队发了一条闪存,问是否能在博客园首页中的编程语言分类中添加 Erlang 这一种编程语言,很快,@博客园团队就给我回信,很爽快的答应了,并且帮我把以前的文章也导入这个分类,省去了我手动倒的麻烦,这边谢谢@博客园团队的热心,希望博客园越来越好,越来越多的朋友来学 Erlang。 好了,继续我们上一篇讲到的cowboy_http_protocol:request/2 方法: parse_header(#http_req{socket=Socket, transport=Transport, c... 阅读全文

Cowboy 源码分析(十一)

2012-05-29 23:52 by rhinovirus, 2312 阅读, 收藏, 编辑
摘要: 上一篇,我们使用debugger和HttpFox很方便了,查看了方法中的变量,不得不说,debugger 断点调试还是比较好用的。这一篇,我们仍将使用这些工具来帮助我们了解代码,好了,接着上一篇继续来看 cowboy_http_protocol:request/2 方法: 上面两张图,是我们上一篇文章,我们看到的函数,以及变量的值,这一篇,我们继续来看下这个函数: URLDecode = fun(Bin) -> URLDecFun(Bin, URLDecArg) end,定义了一个匿名函数,Bin是匿名函数定义的变量,我们看下URLDecFun 这个变量, urldecode... 阅读全文

Cowboy 源码分析(十)

2012-05-28 13:10 by rhinovirus, 2315 阅读, 收藏, 编辑
摘要: 在上一篇中,由于我对 erlang:decode_packet/3 方法的不理解,所以造成了对 cowboy_http_protocol:request/2 方法的困惑,这一篇,我将结合 erlang Debugger 工具 和 HttpFox 工具来看看,究竟是怎么回事。Debugger 我就不多说了,了解erlang的朋友,应该都知道这个工具,如果你是初学,没用过这个工具,可以参考我之前的一篇文章,使用 debugger 简单调试 erlang 简单介绍了这个工具。HttpFox An HTTP analyzer addon for Firefox,HttpFox monitors a.. 阅读全文

Cowboy 源码分析(九)

2012-05-27 23:37 by rhinovirus, 2617 阅读, 收藏, 编辑
摘要: 大家好,今天是周日,继续为大家带来这个系列的第九篇,昨天参加同事的婚礼,今年已经好几个同事结婚了,时间过的真是快啊。转眼也是奔三的人了,得再加把劲学习了。 好了,进入今天的主题,上一篇中,我们讲到了 cowboy_http_protocol:wait_request/1 和 cowboy_listener:add_pid/4 这两个方法,今天,我们继续。 我们先看下调用 cowboy_http_protocol:wait_request/1 这个方法cowboy_http_protocol:init/1的代码: %% @private-spec init(pid(), inet:so... 阅读全文