Erlang cowboy 处理不规范的客户端
Cowboy 1.0 参考
本章:
Dealing with broken clients
存在许多HTTP协议的实现版本。许多广泛使用的客户端,如浏览器,十分符合规范。但是也有一些特殊的客户端非常糟糕,不遵守规范。
Cowboy尽可能地遵守规范,但是仍然无法处理全部可能的情形。Cowboy关注真是 web下的自然样例。如果客户端不遵守HTTP规范可能会无法理解Cowboy的响应。有一些变通的方法,本章就说明这个问题。
小写的消息头 Lowercase headers
Cowboy 将所有接收到的消息头转换成小写,同时返回的消息头也全部是小写。一些不按HTTP规范的客户端可能会报错。一个简单的解决办法是创建一个onresponse回调方法,用于对返回的头按客户端的要求格式化。
capitalize_hook(Status, Headers, Body, Req) -> Headers2 = [{cowboy_bstr:capitalize_token(N), V} || {N, V} <- Headers], {ok, Req2} = cowboy_req:reply(Status, Headers2, Body, Req), Req2.
注意SPDY客户端不会存在此类问题,因为规范声明所有的头都是小写,与HTTP不一样,HTTP允许大小写,确按照大小写不敏感的方式处理。
骆驼命名法消息头 Camel-case headers
常常由于易读的原因,保留这种方式的大小写。没有简单的方式处理这种情况,除非直接更改 cowboy_protocol
文件。
Chunked transfer-encoding
经常一个HTTP客户端声明HTTP/1.1,但是不支持块编码传输chunked transfer-encoding。按照HTTP/1.1客户端的规范要求,这是不正确的。
这有一个简单的变通解决办法。通过改变Req对象的response 状态为waiting_stream
, Cowboy 就能按照HTTP/1.0客户端所理解的方式处理(标记为transfer-encoding而不是chunked transfer-encoding)。
Req2 = cowboy_req:set(resp_state, waiting_stream).