2009-07-03 2 views
3

При анализе MIME с использованием Erlang я могу извлечь заголовок, тело и вложение. Итак, теперь я должен разбирать все эти части отдельно.Разбор заголовка + MIME

структура заголовка:

Header-tag : header-value\n 

Пример:

Delivered-To: [email protected]\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n 

так сверху примера я должен извлечь Delivered-To: [email protected] и Received: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n с помощью какой-то способ разделить с \n. Но значение второго заголовка содержит \n\t, поэтому разделение останавливается там ... Я хочу строгое разделение, которое будет разделяться только с \n.

Заранее спасибо.

ответ

4

Кстати, MIME заголовки (почти?) Так же, как HTTP заголовков, так что вы можете использовать Erlang встроенный HTTP декодирования: (данные должны быть двоичным, а не строка)

3> erlang:decode_packet(httph, <<"Delivered-To: [email protected]\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">>, []). 
{ok,{http_header,0,"Delivered-To",undefined, 
       "[email protected]"}, 
    <<"Received: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">>} 
4> Rest = element(3, v(-1)). 

справа, получил первый заголовок в записи http_header и остальные данные.

<<"Received: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n">> 
5> erlang:decode_packet(httph, Rest, []). 
{more,undefined} 

Но поскольку декодер не может знать, продолжает ли строка заголовка на следующей строке, не видя следующую строку, это не работает. Нам нужно добавить окончательную пустую строку:

6> erlang:decode_packet(httph, <<Rest/binary, "\r\n">>, []). 
{ok,{http_header,0,"Received",undefined, 
       "by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530"}, 
    <<"\r\n">>} 

И когда это все, что осталось, мы получаем http_eoh:

7> erlang:decode_packet(httph, <<"\r\n">>, []). 
{ok,http_eoh,<<>>} 

Надежда, что помогает ...

1

ли вы имеете в виду что-то вроде этого?

split(String) -> 
    split(String, [], []). 


split([], [], Result) -> 
    lists:reverse(Result); 

split([], Buffer, [{Key}|Result]) -> 
    split([], [], [{Key, lists:reverse(Buffer)}|Result]); 

split("\n\t" ++ String, Buffer, Result) -> 
    split(String, "\t\n" ++ Buffer, Result); 

split("\n" ++ String, Buffer, [{Key}|Result]) -> 
    split(String, [], [{Key, lists:reverse(Buffer)}|Result]); 

split(": " ++ String, Buffer, Result) -> 
    split(String, [], [{lists:reverse(Buffer)}|Result]); 

split([C|String], Buffer, Result) -> 
    split(String, [C|Buffer], Result). 

Вот результат для заголовка ввода:

> split("Delivered-To: [email protected]\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n"). 
[{"Delivered-To","[email protected]"}, 
{"Received", 
    "by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530"}] 
Смежные вопросы