Erlang Обработка запросов - PullRequest
0 голосов
/ 24 декабря 2010

Я изучаю erlang и пытаюсь создать Http-сервер, чтобы лучше узнать, как работает erlang, я могу получить запрос:

<< "GET / HTTP / 1.1 \ r \ nHost: 127.0.0.1:8000\r\nСоединение: keep-alive \ r \ nКэш-контроль: max-age = 0 \ r \ nПринять: application / xml, application / xhtml + xml, text / html; q = 0,9, text / plain; q = 0,8, image / png, <em>/ ; q = 0,5 \ r \ nПользователь-агент: Mozilla / 5.0 (X11; U; Linux i686; en-US) AppleWebKit / 534.3 (KHTML, как Gecko) Chrome / 6.0.472.51 Safari / 534.3 \ r \ n Принять-кодирование: gzip, deflate, sdch \ r \ nПринять язык: en-US, en ; q = 0,8 \ r \ n Принять кодировку: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3 \ r \ n \ r \ n ">>

но я не совсем уверен, как начать сопоставление с шаблоном, или мне интересно, придется ли мне создавать FSM или что-то такое, чтобы отслеживать текущие синтаксические анализ и состояние. Есть ли простой метод для извлечения заголовков и тела, используя сопоставление с образцом, возможно разделение на \ r \ n? Я бы предпочел не использовать что-то вроде mochiweb, так как я пытаюсь изучить основы.

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

Для анализа HTTP-запросов вы можете использовать erlang: decode_packet / 3 .

1 голос
/ 24 декабря 2010

Мертвое простое решение: отметьте 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, которые уже должны это делать, и выяснить, что они делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...