Morgen,
Vorgeschichte:
Ich nutze die netfilter iqp development
library um Pakete ins Userland zu schicken. Dort decodiere ich das Paket abhängig vom Protokoll. Wenn es ein Tcp Paket ist und das Unterprotokoll http (mach ich derzeit noch "dumm" anhand von Port), dann will ich den http stream untersuchen.
Problem:
Ich hab folgendes Code Construct:
my $ip_pkt = shift;
my $msg = shift;
my $packet_id = shift;
my $pkt = shift;
my $tcp_pkt = NetPacket::TCP->decode($ip_pkt->{data});
my $tcp_pkt_data = $tcp_pkt->{data};
Jetzt steht der decodierte tcp payload (hoffentlich) in tcp_pkt_data.
Jetzt geht der Scheiss los. Http ist ja nicht nur lulu plain text, sondern definiert anhand des content-encoding flags im header, ob der spass evtl. mit gzip gepackt ist. Das will ich jetzt rausbekommen und dann den Paketinhalt, sollte er gepackt sein, entpacken und verarbeiten und wieder zusammenpacken und dann wieder codieren und ab ins netz damit.
Bei plain txt Verkehr funktioniert das alles tres bien, aber ich habe noch massive Probleme mit gzip.
Meine (bescheidenen) Lösungsansätze:
Ich wollte mir LWP zu nutze machen und damit ein HTTP::Header Objekt basteln, das mir hilft, herauszufinden, ob und wie das Paket codiert ist und dementsprechend die richtigen Maßnahmen zu treffen.
my $message = HTTP::Message->parse($tcp_pkt);
my $header = $message->headers;
# Jetzt sollte $header ein http Header Objekt sein
# Ein my $ct = $header->('Content-Type'); bringt aber nichts
# Danach, wenn die Zeile darüber gehen würde, würde ich so weitermachen:
my $content = $message->decoded_content;
# oder ähnlich...
Sorry, sind jetzt nur Cope Schnippels von meiner LWP Versuchen, aber ich komm nicht weiter.
Habt Ihr Hilfe?
Cheers + Danke
Jmb