2009-07-03 9 views
3

Während MIME mit Erlang zu analysieren, bin ich in der Lage, Header, Körper und Anhang zu extrahieren. Jetzt muss ich alle diese Teile getrennt analysieren.Header Parsing + MIME

Header-Struktur:

Header-tag : header-value\n 

Beispiel:

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 

so von oben Beispiel I extrahiert, um Delivered-To: [email protected] und Received: by 1.gnu.geodesic.net (fdm 1.5, account "mail");\n\tFri, 03 Jul 2009 16:56:03 +0530\n irgendeine Weise unter Verwendung von mit \n aufzuspalten. Aber der Wert des zweiten Headers enthält \n\t, so dass die Trennung dort endet ... Ich möchte einen strikten Split, der nur mit \n geteilt wird.

Vielen Dank im Voraus. die gleichen wie HTTP-Header

Antwort

4

übrigens MIME-Header sind (fast?), so dass Sie Erlang integrierte HTTP-Dekodierung verwendet werden können: (die Daten binär sein muss, kein String)

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)). 

Recht, habe den ersten Header im http_header Datensatz und die restlichen Daten.

<<"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} 

Aber da der Decoder nicht, ob die Kopfzeile weiterhin in der nächsten Zeile ohne zu sehen, die nächste Zeile wissen kann, das nicht funktioniert. Wir brauchen die letzte leere Zeile hinzufügen:

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">>} 

Und wenn das alles ist, was noch übrig ist, bekommen wir http_eoh:

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

Hoffnung, das hilft ...

1

Haben Sie so etwas wie das zu bedeuten? Hier

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). 

ist das Ergebnis für Ihre Eingabe-Header:

> 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"}]