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