Parsing Header + MIME

When parsing MIME using Erlang, I can extract the header, body, and attachment. So now I have to disassemble all of these parts separately.

Header structure:

Header-tag : header-value\n

Example:

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

therefore, from the above example I need to extract Delivered-To: koushik.narayanan@geodesic.comand Received: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\nusing some kind of separation method with \n. But the second value of the header contains \n\t, so the separation stops there ... I want a strict separation that will only be shared with \n.

Thanks in advance.

+3
source share
2 answers

, MIME (?) HTTP, HTTP- Erlang: ( , )

3> erlang:decode_packet(httph, <<"Delivered-To: xyz@geodesic.com\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,
                 "xyz@geodesic.com"},
    <<"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,<<>>}

, ...

+4

- ?

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: xyz@geodesic.com\nReceived: by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530\n").
[{"Delivered-To","xyz@geodesic.com"},
 {"Received",
  "by 1.gnu.geodesic.net (fdm 1.5, account \"mail\");\n\tFri, 03 Jul 2009 16:56:03 +0530"}]
+1

Source: https://habr.com/ru/post/1711830/


All Articles