V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yakczh
V2EX  ›  Erlang

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

  •  
  •   yakczh · 2014-01-30 15:52:58 +08:00 · 6563 次点击
    这是一个创建于 3987 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://dhq.me/the-interaction-experiment-between-erlang-and-websocket
    其中ws.erl 20行
    HeaderList1 = [list_to_tuple(binary:split(Header, <<": ">>)) || Header >) /= nomatch],

    这个Header是从哪里来的?
    9 条回复    1970-01-01 08:00:00 +08:00
    Mutoo
        1
    Mutoo  
       2014-01-30 15:58:17 +08:00
    应该是原文代码没有转义 <- 后面有一部分被吃掉了。
    yakczh
        2
    yakczh  
    OP
       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
        3
    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
        4
    yakczh  
    OP
       2014-01-30 16:47:49 +08:00
    @Mutoo 多谢指正,请教一下
    [list_to_tuple( func || Header <- HeaderList] 这一行是什么语法
    Mutoo
        5
    Mutoo  
       2014-01-30 16:56:13 +08:00
    @yakczh erl 的列表解析,相当于 python 的 [func(x) for x in [1,2,3]]
    yakczh
        6
    yakczh  
    OP
       2014-01-30 16:56:29 +08:00
    @Mutoo 还有56行 <> = Payload
    提示syntax error before: '<'

    没有这样的语法吧?
    Mutoo
        7
    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
        8
    yakczh  
    OP
       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
        9
    Mutoo  
       2014-01-30 19:52:12 +08:00
    @yakczh 是并列条件。

    line 是 lines 中的项,并且包含": "
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1498 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:55 · PVG 00:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.