我在用cowboy时遇到了一个麻烦,通过HTTP连接获取数据时不能用的HTTP/1.1的持久连接(persistent connection)进行数据交换,每个请求-响应过程必须断开连接后重新连才行,也就是说只有Connection:close时才能正常工作。
用wireshark看连接的数据包发现一个奇怪的现象,就是每个响应的最后都会紧跟着出现一个204 No Content的响应。无论是持久连接还是断开再连接都会有这个奇怪的响应跟在后头。
后来发现,原因是这样的:
cowboy用http_req代表了一次用户请求的数据记录(似乎叫session比较好点),该record记录了socket连接信息、用户请求信息(包括请求消息头、消息体等),以及服务器的响应(例如响应状态、响应消息头,响应消息体等),由cowboy_req模块提供了该record相应的操作接口。
比如 cowboy_req:method/得到请求的方法类型
{Method, Req2} = cowboy_req:method(Req)
cowboy_req:path_info/1得到请求url的路径信息
{PathInfo, Req1} = cowboy_req:path_info(Req)
注意以上方法都会返回一个新的Req1结构数据,虽然许多情况下Req和Req1其实是同一个请求记录。但是某些方法是会修改Req的,例如修改响应的头信息时,因此Req /= Req1,这时再使用Req就有麻烦了。
我是在使用reply方法的时候遇到这个问题,而cowboy_req:rely/2,3,4方法也是会修改Req记录的,如果直接处理
cowboy_req:reply(200, Headers, BodyData, Req)
最后用老的Req作为handle方法的返回,cowboy会无以为没有进行响应,所以它会自己加一个 204 No Content的响应。
错误用法:
handle(Req, State) ->
cowboy_req:method(Req),
...
cowboy_req:reply(200, Headers, BodyData, Req),
...
{ok, Req}.
正确用法:
handle(Req, State) ->
cowboy_req:method(Req),
....
{ok, Req1} = cowboy_req:reply(200, Headers, BodyData, Req),
.....
{ok, Req1}.
也许对所有的cowboy_req模块方法,都应该同一采用这种方式使用比较好。时刻记住Req记录在cowboy_req可能发生变化。
因为所有的响应都是带Content-Length的,所以客户端可以正确的解析出连接中的第一个响应。但是在持久连接(persistent connection),即keep alive,的情况下,第二个响应就变成了204 No Content消息,就会出现上述问题。
分享到:
相关推荐
"Cowboy"可能指的是一个特定的字体库或者字体样式,它可能是为了传达一种粗犷、自由或者西部风情的设计感觉。下面我们将深入探讨字体设计、字体类型以及如何在不同场景下选择和使用字体。 字体设计是艺术与技术的...
文件名`cowboy-master`表明这是一个Cowboy的源码仓库,可能包含了Cowboy的最新版本或者特定分支。开发者可以通过这个源码来编译、调试或扩展Cowboy的功能。在实际操作中,可以使用Git克隆这个仓库,然后利用Erlang的...
cowboy, 用于 erlang/otp的小型,快速,现代的...目标牛仔的目标是提供一个收费的完整的,以英镑为代价的小代码库。 系统以英镑低延迟和低内存使用为优化目标,部分原因是它使用了英镑的二进制字符串。牛仔提供路由功
"Cocos2D cowboy源代码"指的是基于Cocos2D框架的一个特定项目或库,可能包含了用于Android和iOS平台的游戏开发组件或工具。在深入探讨这个源代码之前,我们先了解一下Cocos2D的基础知识。 Cocos2D最初是为Python...
原生的Sockets我们已经写了很多,大家都知道定义一套完整的Socket通讯服务器和客户端以及网络通讯的协议...同时网络通讯中所使用的数据协议Cowboy.Sockets也帮我们制定好了一个框架,这对于我们后面的开发提供了便利。
在本文中,我们将深入探讨如何使用Cowboy框架与React和Redux构建一个数据驱动的单页应用程序(SPA)。Cowboy是一个轻量级、高性能的Erlang Web服务器,而React是用于构建用户界面的JavaScript库,Redux则是一个状态...
在设计领域,字体是一种至关重要的元素,它能够传达出文本的情感,强化品牌识别,甚至讲述一个故事。今天我们要探讨的主角是"The Cowboy Font",这款字体以其独特的西部风格,深受设计师们的喜爱。这款字体的命名就...
2. **USA**:美国是本书另一个主要的研究对象,重点分析其经济政策和资本主义的特点。 3. **Economics**:经济学是贯穿全书的核心学科,书中将运用经济学理论来分析美欧两国的经济体系。 4. **Capitalism**:资本...
cowboy-test源文件
使用erlang和PostgreSQL做后端、flutter做前端开发的一款开源的即时聊天解决方案(基于erlang/otp的高性能web框架 cowboy 做后端服务,用 "8核16G 主机(100万PPS)"压测,保持100万+TCP稳定在线90分钟以上) 支持...
牛仔-websocket-模板一个精简的 Cowboy 网络服务器和模板,用于与带有 websockets 的客户端进行通信。得到牛仔该项目使用 rebar ( ) 进行依赖管理。 如果您也使用rebar.config您可以通过将下面显示的条目添加到您的...
一个库和牛仔休息处理程序,可添加到您的riak_core +牛仔应用程序中,以通过REST API公开riak_core_security。 该库用作权限admin ui 的后端 该库假定您的项目具有riak_core和cowboy 1.x作为依赖项,我们在此处未...
可以将Plug.Cowboy模块作为监督树的一部分启动,如下所示: defmodule MyApp do # See https://hexdocs.pm/elixir/Application.html # for more information on OTP Applications @moduledoc false use ...
TCP高性能服务器和客户端开发源码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
它非常易于使用,仅需几个步骤,您将拥有一个有关RESTful API的不错的Web文档。 要了解有关Swagger的更多信息,请查看此。 如何使用它? 这是最好的部分。 这非常容易。 1.记录每个牛仔经理 因为cowboy_swagger...
**压缩包子文件的文件名称列表:** "cowboy-master" 暗示这是一个cowboy项目的源代码仓库,可能包含了cowboy服务器的所有源代码、配置文件、示例和文档等,用于编译和运行cowboy服务器。 综上所述,cowboy是一个用...
【标题】"基于 Cowboy 的简单网络服务器"是一个关于构建网络服务器的教程,它利用了Erlang编程语言中的Cowboy库。Cowboy是Erlang领域内广泛使用的轻量级HTTP服务器,以其高性能和易用性著称。本教程旨在帮助开发者...
folsom_cowboy,一个基于牛仔的 folsom 包装器这是一个使用牛仔通过 http 公开 folsom 指标的应用程序。 它是到 [cowboy] 的端口。安装只需将 folsom_cowboy 添加到您的应用程序中,以及其依赖项: [cowboy], 。 %% ...