【问题标题】:Erlang Processing of RequestsErlang 处理请求
【发布时间】:2011-05-30 05:51:57
【问题描述】:

我正在学习 erlang,并且正在尝试构建一个 Http Server 以更好地了解 erlang 的工作原理,我能够得到请求:

/;q=0.5\r\n用户代理:Mozilla/5.0 (X11 ; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.51 Safari/534.3\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US, en;q=0.8\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n\r\n">>

但我不确定如何开始模式匹配,或者我想知道我是否必须构建一个 FSM 或其他东西来跟踪当前的解析和状态。是否有一种使用模式匹配提取标题和正文的简单方法,可能在 \r\n 上拆分?我不想使用 mochiweb 之类的东西,因为我正在尝试学习基础知识。

【问题讨论】:

    标签: erlang httprequest


    【解决方案1】:

    简单的解决方案:检查inet:setopts/2{packet, http_bin} 选项。

    更复杂的解决方案:

    您需要解析二进制文件。大致如下:

    -module(foo).
    -compile(export_all).
    
    x() ->
        <<"GET /hello/world/ HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.51 Safari/534.3\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n\r\n">>.
    
    parse(<<"GET ", R/binary>>) ->
        parse_get(R).
    
    parse_get(Bin) ->
        [Path, R] = binary:split(Bin, [<<" ">>]),
        {{get, Path}, R}.
    

    基本技巧是您希望将解析器视为binary() -&gt; {parse(), binary()},其中二进制输出是要解析的剩余内容。这为组合器解析器或递归下降做好了准备。另一种方法是将二进制文件转换为列表并进行处理,但这会慢得多。看看binary 模块,在这种情况下它可以为你做很多繁重的工作。

    另一种选择是检查 Yaws 或 Mochiweb 应用程序,它们已经必须这样做,并引诱它们做什么。

    【讨论】:

      【解决方案2】:

      要解析 HTTP 请求,您可以使用 erlang:decode_packet/3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        相关资源
        最近更新 更多