Thread Multiple Request, Multipart Content Parser (6 answers)
Opened by janus at 2015-10-21 10:40

Gast janus
 2015-10-22 16:39
#182681 #182681
2015-10-22T12:28:23 GwenDragon
Um das klar zu bekommen: Du benutzt eine TCP-Verbindung über HTTP, lässt die offen, und schickst darüber nacheinander mehrere Requests und willst diese weider einlesen.
Das läuft doch synchron ab. Auf den Request erfolgt die Response usw.


Nein. Es läuft so ab, dass mit keep-alive sämtliche Requests in das Socket geschrieben werden. Danach wird das Socket ausgelesen und enthält sämtliche Responses => alles zusammen in einer Sequenz (Datei).

Damit ein Client das wieder auseinanderkriegt, dafür gibt es das Transfer-Encoding: chunked oder einen Content-Length Header. Ein dritter Fall ist möglich, da gibt es weder/noch, so liest der Client einfach nur solange, bis nichts mehr kommt.

Das Auslesen des Sockets ist wie das Deserialisieren einer Datei: Länge ermitteln, Länge lesen und so wiederholt sich das.

Btw.: Die ganze LWP-Library ist ziemlich verwirrend aufgebaut. Ich frage mich z.B. warum ich aus einer Response (Datei) ein Objekt erstellen sollte, wohingegen eine zweckmäßige Datenstruktur zielführender wäre. Genauso die Frage, warum für einen Request ein Header-Objekt benötigt wird und Objekte für Cookies. Eine ziemlich verbaute Klassenhierarchie und umständlich in der Handhabe.

Kurzum: Ich bin grad mal wieder an einer eigenen Klasse dran: HTTPRequest. Der Konstruktor krieg nur noch host, port, 1.0||1.1 und dann kannste ohne Umschweife Requests feuern nach dem Schema:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $ro = HTTPRequest->new(
    host => 'www-proxy.t-online.de',
    http => '1.1'
) or die $!;

$ro->request(  method => 'PUT', uri => 'http://example.com', content => 'asdf', Connection => 'Keep-Alive');
$ro->request(  method => 'GET', uri => 'http://example.com', Connection => 'Close');

my $messages = $ro->response_slice; 
# Array [{statuscode => '', body => '', usw.}]
# alle Response-Headers sind drin in jeder {}


Ohne Proxy reicht für den uri die Pfadangabe, da ist alles eins. Alle Request-Header können frei notiert werden z.B. Cookie, Accept-Encoding, Authorization-Basic usw.
Last edited: 2015-10-22 18:00:41 +0200 (CEST)

View full thread Multiple Request, Multipart Content Parser