关于Cowboy

Cowboy是基于Erlang实现的一个轻量级、快速、模块化的http web服务器。


Handlers,用于处理HTTP请求的程序处理模块。

Plain HTTP Handlers(常规Handlers)

Cowboy里面的handler最基础的事情就是实现 init/2 回调函数,处理请求,发送客户端响应(可选),最后返回。 Cowboy根据 router configuration (路由配置)接收请求并初始化State。 下面是一个不做任何处理的handler:

init(Req, State) ->
{ok, Req, State}

Cowboy为了保证每一个相应都能有客户端响应,尽管上面例子没有发送客户端返回,客户端仍然会收到一个 204 No Content 的响应。

下面是一个有返回响应的例子:

init(Req0, State) ->
Req = cowboy_req:reply(, [
{<<"content-type">>, <<"text/plain">>}
], <<"Hello, World!">>, Req0),
{ok, Req, State}.

当调用了 cowboy:req/4, Cowboy会马上返回一个客户端响应。

最后我们返回一个三元组。ok 表示handler允许成功,然后返回处理过后的 Req 给Cowboy。 三元组的最后一个元素是一个贯穿在handler所有回调一个state。常规的HTTP handlers一般只附加一个回调函数,terminate/2是一个很少使用的可选的回调函数。

Other Handlers(其它Handlers)

init/2 回调函数也可以用来告诉cowboy,这是一个不同类型的handler,Cowboy应该做一些其他处理。为了方便使用,如果返回handler类型的模块名称,就可以切换handler处理模块。

Cowboy提供了三种可选handler类型:cowboy_reset, Cowboy_websocke和cowboy_loop。另外也可以自己定义handler类型。

切换非常简单,用handler类型替换掉返回的 ok 就可以了。下面是一个切换为 Websocket handler 的代码片段。

init(Req, State) ->
{cowboy_websocket, Req, State}.

也可以切换到一个自定义的handler模块:

init(Req, State) ->
{my_handler_type, Req, State}.

如何使用自定义的handler类型可以查看Sub protocols 章节(https://ninenines.eu/docs/en/cowboy/2.0/guide/sub_protocols)。

Cleaning up

除了Websocket handlers,其它所有类型都提供可选回调函数terminate/3

terminate(_Reason, _Req, _State) ->
ok.

这个回调函数是为了cleanup保留下来的。该函数不能发送响应给客户端。也没有其他返回值(只能返回ok)。

terminate/3之所以是可选是因为其极少会用到。Cleanup应该在各自的进程中直接处理。(通过监控handler进程来知道其何时退出)

Cowboy不会在不同的请求重复使用进程(应该是http短链接设计引起的)。进程在返回之后很快就会被销毁。

Others

英文官方原文:

https://ninenines.eu/docs/en/cowboy/2.0/guide/handlers/#_plain_http_handlers

[翻译][erlang]cowboy handler模块的使用的更多相关文章

  1. [翻译][erlang]cowboy路由模块使用

    Cowboy是基于Erlang实现的一个轻量级.快速.模块化的http web服务器. 本文官方原文:http://ninenines.eu/docs/en/cowboy/1.0/guide/rout ...

  2. Erlang cowboy 入门参考

    Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...

  3. Erlang cowboy routing 路由

    Erlang cowboy routing 路由 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/ Routing 默认情况下,C ...

  4. Erlang cowboy websocket 服务器

    Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...

  5. Erlang cowboy 处理简单的HTTP请求

    Erlang cowboy 处理简单的HTTP请求 原文出自: Handling plain HTTP requests 处理请求的最简单的方式是写一个简单的HTTP处理器.它的模型参照Erlang/ ...

  6. Erlang cowboy http request生命周期

    Erlang cowboy http request生命周期 翻译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_life/ requ ...

  7. nginx -- handler模块(100%)

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

  8. Erlang cowboy 处理不规范的client

    Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的cl ...

  9. Erlang的常驻模块与功能模块

    Erlang的常驻模块与功能模块Residence moduleThe module where a process has its tail-recursive loop function(s).I ...

随机推荐

  1. webForm中的验证控件

    1.非空验证控件:RequireFieldValidator  :2.数据比较验证:CompareValidator :3.数据范围验证:RangeValidator :4.正则表达式验证:Regul ...

  2. 深入jQuery中的data()

    引入 data函数在jQuery中看起来很不起眼, 就像沙滩上一颗平凡的沙子, 但仔细一瞅, 却惊讶的发现data是jQuery中无比重要的一环, 甚至jQuery中各种事件都基于此. data有什么 ...

  3. 第一部分:C9高校、985和211、双一流

    第一部分:C9高校.985和211.双一流 C9高校,包括:清北.复交.浙南.中科大西交大和哈工大.1998年5月4日,时任国家主席江.泽.民在庆祝北京大学建校100周年大会上代表中国共.产.党和中华 ...

  4. 8.31 js基础总结1

    JavaScript是一种脚本语言,由web浏览器进行解释和执行.它给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 将JavaScript应用到网页中常用的方法有两种,第 ...

  5. bootstrap datetimerange

    天用的了bootstrap日期插件感觉搜索的资料不是很多在此写下一些使用的心得: 插件开源地址:daterangepicker日期控件, 插件使用只要按照开源中的文档信息来就好先包括以下引用: < ...

  6. 初学c# -- 学习笔记(二)

    接着前面的学习,对话建立了,下面就写对话框气泡,和微信的差不多那种.尖角对话气泡网上一堆,圆尖角的修改了一个.IE8以下不能用,其他都可以用,直接上html代码,将<style>内容用到你 ...

  7. Dalvik指令格式

    一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式 标识来决定.位描述约定如下: 每16位的字采用空格分隔开来每个字母表示四位,每个字母按顺序从高字节开始,排列到低 ...

  8. iframe高度调整

    //设置iframe高度 function setHeight(){ var originalHeight=$(window).height(); var headerHeight=$('.heade ...

  9. Endless Sky源码学习笔记-4

    事件处理: 事件包括:debug模式切换.切换到登陆窗口.退出.窗口大小变化.全屏切换和游戏中的鼠标键盘输入.处理方式分为两类,前几个为简单的if处理,最后一个涉及到游戏中的控制和交互,且事件由每一个 ...

  10. Java Sha1 加密算法

    //下面四个import放在类名前面 包名后面 //import java.io.UnsupportedEncodingException; //import java.security.Messag ...