中间件
Cowboy将请求处理委托给中间件组件。默认情况下,定义了两个中间件,用于路由和处理请求,在本指南的大部分内容中有详细介绍。
中间件让您完全控制如何处理请求。您可以将自己的中间件添加到其中,或者根据需要完全更改中间件链。
Cowboy将按照给定的顺序执行所有中间件,除非其中一个决定停止处理。
用法
中间件只需要实现一个回调:execute/2。它在cowboy_middleware行为中定义。
这个回调函数有两个参数。第一个是Req对象。第二是环境问题。
中间件可以返回以下三种不同的值:
{ok, Req, Env}
继续请求处理{suspend, Module, Function, Args}
进入休眠{stop, Req}
停止处理并继续处理下一个请求
值得注意的是,当休眠时,处理将在给定的MFA上恢复,丢弃所有以前的堆栈跟踪。请确保将Req和Env保存在这个MFA的参数中以供以后使用。
如果在中间件处理过程中发生错误,Cowboy将不会尝试将错误发送回套接字,进程将崩溃。由中间件来确保在出现问题时发送应答。
配置
中间件环境被定义为env协议选项。在前面的章节中,当我们需要传递路由信息时,我们简要地看到了它。它是一个元组列表,第一个元素是atom,第二个是任何Erlang术语。
环境中有两个值是保留的:
- listener包含监听器的名称
- result包含处理的结果
listener值总是定义的。result值可以由任何中间件设置。如果设置为ok以外的任何内容,那么Cowboy将不会处理此连接上的任何后续请求。
伴随Cowboy而来的中间件可能定义或要求执行其他环境值。
你可以通过调用cowboy:set_env/3方便函数来更新环境,在环境中添加或替换一个值。
路由中间件
路由中间件需要分派值。如果路由成功,它将把处理程序名称和选项分别放在环境的handler和handler_opts值中。
处理中间件
处理程序中间件需要handler和handler_opts值。它将请求处理的结果放入result中。