Erlang处理请求

时间:2010-12-24 00:56:32

标签: erlang httprequest

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

<<“GET / HTTP / 1.1 \ r \ n主机:127.0.0.1:8000 \ r \ n \ n \ n连接:保持活动\ r \ n \ nCache-Control:max-age = 0 \ r \ n接受: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,与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这样的东西,因为我正在努力学习基础知识。

2 个答案:

答案 0 :(得分: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() -> {parse(), binary()},其中二进制输出是要解析的其余内容。这为组合器解析器或递归下降很好地设置了。另一种方法是将二进制文件转换为列表并对其进行处理,但速度会慢得多。在这种情况下,请查看binary模块,这些模块可以为您进行大量的重量级操作。

另一个选择是检查已经必须这样做的Yaws或Mochiweb应用程序并引出它们的作用。

答案 1 :(得分:1)

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