URL aus HTTP Request gewinnen
-
Hio,
Ich möchte gerne die URL aus einem HTTP Request extrahieren. Also ich lese die Pakete die der Rechner an Port 80 sendet mit und bekomme so alle HTTP Requests mit. Aus diesen möchte ich nun die genaue URL extrahieren. Wenn ich das richtig verstanden habe muss ich dabei folgende 2 Sachen haben:
GET / HTTP/1.1
Host: www.google.dewobei die URL dann wäre Host+Get (ohne HTTP). In diesem Beispiel also www.google.de/
So nun meine Frage, die Wikipedia nicht beantworten kann. Ist der komplette HTTP-Header (+ Inhalt) einfache Text-Daten, die in ihrer Länge unbeschränkt sind oder gibt es einzelne Grenzen innerhalb von HTTP, sodass ich direkt an z.B. die Stelle Host springen kann?
Die Idee ist einfach die, dass ich im 1. Fall immer den kompletten Inhalt des TCP/IP Paketes nach dem entsprechenden GET und HOST durchsuchen muss. Wenn dem nicht so ist, dann könnte ich ja theoretisch direkt zu der Position springen, wo z.B. der Hostteil angegeben ist und diesen auslesen.
Gruß
Pille
-
Pille456 schrieb:
So nun meine Frage, die Wikipedia nicht beantworten kann. Ist der komplette HTTP-Header (+ Inhalt) einfache Text-Daten, die in ihrer Länge unbeschränkt sind oder gibt es einzelne Grenzen innerhalb von HTTP, sodass ich direkt an z.B. die Stelle Host springen kann?
Für solche Fragen sind die RFCs normalerweise eine viel bessere Quelle als Wikipedia. Kurz gesagt: Die Header-Reihenfolge ist (AFAIK) nicht festgelegt. Besser wäre aber: Schau im RFC nach.
Übrigens kann ein HTTP-Request auf *mehr* als ein TCP-Paket aufgesplittet sein. HTTP ist ein application layer protocol, TCP ist eine Ebene drunter. Deswegen ist es evtl. keine so gute Idee, auf TCP-Paket-Ebene HTTP zu parsen. Ich sage nicht, dass es nicht geht, aber du müsstest das Zusammensetzen von TCP-Paketen auf jeden Fall manuell machen, um HTTP-Requests zuverlässig zu erkennen.
-
Hm, hatte gar nicht daran gedacht in der RFC nachzuschauen. Also wie es aussieht, sind HTTP-Request (um die es mir ja hauptsächlich geht) zwar in einzelne Blöcke unterteilt, die mit Trennzeichen versehen sind, jedoch nicht in der Länge o.Ä. beschränkt. Siehe dazu: http://tools.ietf.org/html/rfc2616#section-5
Ausgehend vom dem Schichtenmodell und wie HTTP angelegt ist, kann man prinzipiell auch andere Protokolle außer TCP/IP nutzen um einen HTTP request zu senden, aber gibt es tatsächlich "normale webserver", die nicht TCP/IP nutzen?
Also beim normalen Surfen kann ich mich nicht erinnern, mal nicht TCP/IP genutzt zu haben (können heutige Browser überhaupt auch anders senden?)Zu dem Zusammensetzen: Ich habe in java mit jpcap(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html) einen eigenen TCP/IP sniffer geschrieben und bekomme zumindest alle Pakete die auf Port 80 gesendet werden korrekt mit und kann die HTTP-Requests auch normal lesen. Nur der Inhalt ist halt teilw. großer Murks, aber der interessiert mich auch nicht
-
Pille456 schrieb:
Ausgehend vom dem Schichtenmodell und wie HTTP angelegt ist, kann man prinzipiell auch andere Protokolle außer TCP/IP nutzen um einen HTTP request zu senden, aber gibt es tatsächlich "normale webserver", die nicht TCP/IP nutzen?
Also beim normalen Surfen kann ich mich nicht erinnern, mal nicht TCP/IP genutzt zu haben (können heutige Browser überhaupt auch anders senden?)TCP/IP ist schon in Ordnung, über andere Protokolle wird HTTP kaum benutzt werden.
Pille456 schrieb:
Zu dem Zusammensetzen: Ich habe in java mit jpcap(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html) einen eigenen TCP/IP sniffer geschrieben und bekomme zumindest alle Pakete die auf Port 80 gesendet werden korrekt mit und kann die HTTP-Requests auch normal lesen.
Ja, aber wer sagt, dass ein HTTP-Request in genau einem Paket steht? Ein Request kann auch auf 2 oder mehr Pakete aufgesplittet werden. Das erste Paket enthält dann die GET-Zeile, und die "Host:"-Zeile steht erst im nächsten Paket.
-
Hm, ja das ist theoretisch möglich, aber bei den Paketdaten die ich bisher gesehen habe nie der Fall. Aber danke für den Hinweis! Wenn in einem Paket eine entsprechende Host Zeile z.B. nicht gefunden wird, kann ich ja im nächsten nachschauen