erlang解析http头找特定的字段值

2014-01-30 15:52:58 +08:00
 yakczh
http://dhq.me/the-interaction-experiment-between-erlang-and-websocket
其中ws.erl 20行
HeaderList1 = [list_to_tuple(binary:split(Header, <<": ">>)) || Header >) /= nomatch],

这个Header是从哪里来的?
6524 次点击
所在节点    Erlang
9 条回复
Mutoo
2014-01-30 15:58:17 +08:00
应该是原文代码没有转义 <- 后面有一部分被吃掉了。
yakczh
2014-01-30 16:10:01 +08:00
@Mutoo 怎么样才能把Sec-WebSocket-Key 找出来

HeaderData= <<"Accept-Encoding: gzip, deflate\r\nSec-WebSocket-Key\r\nVpFuKOmlNacJn3CuGOrd9w==">>,
HeaderList = binary:split(HeaderData, <<"\r\n">>, [global]),
。。。
{_, SecWebSocketKey} = lists:keyfind(<<"Sec-WebSocket-Key">>, 1, HeaderList1),
中间的代码应该怎么写?
Mutoo
2014-01-30 16:28:14 +08:00
@yakczh

HeaderData= <<"Accept-Encoding: gzip, deflate\r\nSec-WebSocket-Key\r\nVpFuKOmlNacJn3CuGOrd9w==">>,

这行错了吧,应该是

HeaderData= <<"Accept-Encoding: gzip, deflate\r\nSec-WebSocket-Key: VpFuKOmlNacJn3CuGOrd9w==">>,

中间那行是

HeaderList1 = [list_to_tuple(binary:split(Header, <<": ">>)) || Header <- HeaderList]

整段如下

HeaderData= <<"Accept-Encoding: gzip, deflate\r\nSec-WebSocket-Key: VpFuKOmlNacJn3CuGOrd9w==">>,
HeaderList = binary:split(HeaderData, <<"\r\n">>, [global]),
HeaderList1 = [list_to_tuple(binary:split(Header, <<": ">>)) || Header <- HeaderList],
{_, SecWebSocketKey} = lists:keyfind(<<"Sec-WebSocket-Key">>, 1, HeaderList1).

输出结果

> SecWebSocketKey.
<<"VpFuKOmlNacJn3CuGOrd9w==">>
yakczh
2014-01-30 16:47:49 +08:00
@Mutoo 多谢指正,请教一下
[list_to_tuple( func || Header <- HeaderList] 这一行是什么语法
Mutoo
2014-01-30 16:56:13 +08:00
@yakczh erl 的列表解析,相当于 python 的 [func(x) for x in [1,2,3]]
yakczh
2014-01-30 16:56:29 +08:00
@Mutoo 还有56行 <> = Payload
提示syntax error before: '<'

没有这样的语法吧?
Mutoo
2014-01-30 17:03:00 +08:00
@yakczh 显示是有字符被吞了。

这部分的代码可以参考一下下面这个源码,99行附近
https://github.com/shyang/erlang-websockets-demo/blob/master/src/ws_srv.erl
yakczh
2014-01-30 17:16:28 +08:00
上面代码50行的地方是 List = [list_to_tuple(binary:split(Line, <<": ">>)) || Line <- Lines, binary:match(Line, <<": ">>) /= nomatch],
我看了一下文档,列表解析的语法是 [Expr(E) || E <- List]
上面代码中 Line <- Lines,后面的 binary:match(Line, <<": ">>) /= nomatch 这句是不是是对子项处理的前提条件?
Mutoo
2014-01-30 19:52:12 +08:00
@yakczh 是并列条件。

line 是 lines 中的项,并且包含": "

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/98701

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX