Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7703[/thread]

HTTP mit LWP

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
jmb
 2006-02-13 10:08
#62882 #62882
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
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:

Code: (dl )
1
2
3
4
5
6
7
 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.

Code: (dl )
1
2
3
4
5
6
7
8
9
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
ptk
 2006-02-13 10:28
#62883 #62883
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wie sehen die TCP-Pakete aus? Sind die schon "zurechtgeschnitten" oder musst du sie noch zusammenfügen?
jmb
 2006-02-13 10:29
#62884 #62884
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
sorry, sehe gerade, ich hab mich oben vertippt.

Code (der untere) sieht ungefaehr so aus:

Code: (dl )
1
2
3
my $message = HTTP::Message->parse($tcp_pkt);
my $header = $message->headers;
my $ct = $header->header('Content-Type');


cheers
jmb
jmb
 2006-02-13 10:31
#62885 #62885
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bekomme Paket für Paket nach oben geschickt. Ich arbeite stateful, habe also keine Fragmentierung.

Zur Vereinfachung:

Ich bekomme quasi jedes Mal (wenn die Statemaschine aktiv ist), das Payload Feld (also den Inhalt) des TCP Pakets. Diesen hole ich mir aus dem TCP Paket, das TCP Paket hole ich mir aus dem IP Paket. Die Decodierung des Ethernet Frames macht IPTables.

Wie gesagt, bei Plain Text gehts super. Auch mit DNS (udp) hab ich keinerlei Probleme.

Jmb
jmb
 2006-02-13 13:47
#62886 #62886
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Da ich nicht so wirklich weiterkomme mit den http klassen, versuche ich mal einen anderen weg zu gehen.

Der Header scheint mir immer Plain Text zu sein, soll heißen, ich bin in der Lage pro Stream festzustellen (auch wenn das schön Performance kostet), ob der Stream codiert ist (und wie).

Habt ihr einen Tipp für mich, wie ich Streams (das, was nach dem Header kommt), am besten entpacke, ohne die folgenden Module nutzen zu müssen:

Tie::Gzip
Compress::Zlib
PerlOO::Gzip

Danke
Jmb
Crian
 2006-02-13 13:59
#62887 #62887
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Was für ein Problem hast du mit Modulen? Du kannst die doch zur Not lokal zu deinem Programm mit ausliefern.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2006-02-13 23:52
#62888 #62888
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du kannst zcat direkt verwenden.
jmb
 2006-02-14 10:20
#62889 #62889
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Hi und danke ihr beiden,

@crian: Ich moechte die beiden Module nicht verwenden, da diese, afaik, auf das system tool zugreifen - das macht es ein wenig unsauber und langsam. Wuerde gerne eine Funktion nutzen, der ich eine Variable mit binaeren Inhalt geben kann und dann den Plain Text bekomme (werd jedoch jetzt mal mit compress::zlib meine gehversuche wagen, da dort ja nur bei explizieter angabe das externe tool verwendet wird).

@ptk: same thing: zcat wuerde ich gerne nutzen, aber das ist doch hauptsaech auch fuer das oeffnen von files, ich bekomme meinen binaeren inhalt jedoch auf einem netzwerk stream.

Ich werd mein Glueck mal mit inline C versuchen (wenn ich mit compress::zlib nicht weiterkomme).

Falls jmd. von Euch doch noch eine Idee hat, wie ich weiterkomme oder ich mich bei den oben gemachten aussagen geirrt habe, bitte ich um Berichtigung, damit ich das Problem endlich loesen kann.

Cheers
Jmb\n\n

<!--EDIT|jmb|1139905285-->
jmb
 2006-02-14 10:42
#62890 #62890
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Vorab noch eine kurze Frage, vielleicht hat jmd. von Euch da ja schon Erfahrung.

Wie gesagt, habe ich eine Variable $tcp_pkt_data, in der der Payload einer HTTP Verbindung steht. Dieser besteht entweder aus plain text header und plain text dateninhalt oder aus plain text header und gzip dateninhalt. Ich will jetzt der Funktion uncompress die Variable mit den Inhalten des gzip Datenverkehr übergeben. Mein Ansatz wäere jetzt folgender gewesen:

1) Entfernen aller Header Zeilen (würde die Begin Tags aller HTTP 1.1 ''Schlagwörter'' nehmen und die dazugehörigen Zeilen herausfiltern
2) Neuer Inhalt an uncompress übergeben, auswerten, verarbeiten, packen
3) in einen skalar zusammen mit dem header schreiben und wieder assemblieren (tcp-ip-ethernet)

Fragen:
1) Grundsätzlich ok soweit oder habt ihr andere Erfahrungen und / oder Vorschläge?
2) Wie sieht es mit Leerzeilen aus, soll ich die entfernen?

Danke wiedermal
Jmb
jmb
 2006-02-14 12:04
#62891 #62891
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Zusätzlich noch eine Frage:

Kennt ihr ne Möglichkeit eine Variable, die binären und nicht binären (ASCII) Inhalt hat, nach binäre und ASCII zu treffen oder muss ich das selbst mit binären \0 wie in 'C' machen?

Thx
Jmb
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-02-13 10:08.