NAME
Quiq::Http::Message - HTTP-Nachricht
BASE CLASS
DESCRIPTION
Ein Objekt dieser Klasse repräsentiert eine HTTP-Nachricht. Eine HTTP-Nachricht besteht aus einer oder mehreren Kopfzeilen (Header) und einem optionalen Rumpf (Body). Kopfzeilen und Rumpf werden von der Klasse als Attribute implementiert, die durch Methoden der Klasse manipuliert werden können. Eine HTTP-Nachricht, die versendet werden kann, entsteht durch Erzeugen einer Stringrepräsentation des Objekts.
Die Klasse kann für HTTP-Requests als auch für HTTP-Responses verwendet werden. Ggf. müssen weitere Header eingeführt werden.
MEMO: Die Klasse ist nach dem Vorbild von R1::HttpResponse entstanden. Diese sollte so angepasst werden, dass sie Quiq::Http::Message als Basisklasse verwendet.
EXAMPLES
Einfache HTTP-Nachricht
my $msg = Quiq::Http::Message->new(
contentType=>'text/plain',
body=>"Hello world\n"
);
print $msg->asString;
generiert auf STDOUT
Content-Type: text/plain
Content-Length: 12
Hello world
HTTP-Nachricht über Socket schicken (siehe auch Quiq::Http::Client)
my $sock = Quiq::Socket->new($host,$port);
my $msg = Quiq::Http::Message->new(
contentType=>'text/plain',
body=>"Hello world\n"
);
print $sock $msg->asString;
HTTP-Nachricht vom Server empfangen
my $msg = Quiq::Http::Message->new(received=>1,$socket);
print $msg->asString;
Die Setzung received=>1 bewirkt, dass wir bei der Auswertung der Headerzeilen nicht strikt sind, d.h. bei unbekannten Headern wird keine Exception geworfen, und die Methode $msg->"asString"() liefert die Headerinformation exakt so wie sie empfangen wurde, d.h. sie wird nicht aus den Attributen gewonnen.
HTTP-Nachricht aus Datei
my $msg = Quiq::Http::Message->new('http/message01.txt');
print $msg->asString;
METHODS
Konstruktor
new() - Instantiiere ein HTTP Nachrichten-Objekt
Synopsis
$http = $class->new(@keyVal);
$http = $class->new(@keyVal,$fh);
$http = $class->new(@keyVal,$file);
$http = $class->new(@keyVal,\$str);
Returns
Referenz auf HTTP-Objekt.
Description
Instantiiere ein HTTP Nachrichten-Objekt mit den Eigenschaften @keyVal.
Folgende Eigenschaften können (u.a.) gesetzt werden:
contentType => $type
charset => $charset
contentLength => $n | -1
expires => $date | 'now' | 0
location => $url
setCookie => [$name=>$value,@keyVal]
refresh => [$n,$url]
body => $data
Zum Setzen von Eigenschaften siehe auch die Methoden $msg->"set"() und $msg->"fromString"().
Ist eine ungerade Anzahl an Parametern angegeben, wird zunächst die (ggf. leere) Liste von Attribut/Wert-Paaren @keyVal zugewiesen. Alle weiteren Eigenschaften werden via Handle $fh, Datei $file oder String $str gewonnen.
Attribute
set() - Setze Objekteigenschaften
Synopsis
$http->set(@keyVal);
Returns
Die Methode liefert keinen Wert zurück.
Description
Setze die Objekteigenschaften @keyVal. Für die Liste der Eigenschaften siehe "new"().
Examples
Ein HTTP-Request ohne Inhalt:
$http->set(
host=>$host,
connection=>'close',
);
Eine HTTP-Response:
$http->set(
contentType=>'text/html',
charset=>'utf-8',
setCookie=>[id=>4711],
setCookie=>[user=>'seitzf'],
body=>"Test\n",
);
Kopfzeilen (Header)
Dieser Abschnitt beschreibt die Methoden zum Setzen und Abfragen von Kopfzeilen. Generell gilt: Ist ein Argument angegeben, wird die betreffende Kopfzeile gesetzt. Ist kein Argument angegeben, wird der Wert der Kopfzeile geliefert.
Der Name der Methode entspricht dem Namen der HTTP-Kopfzeile unter Anwendung folgender Transformationsregeln:
der erste Buchstabe ist klein geschrieben
Bindestriche sind entfernt
mehrere Worte sind in "camel case" zusammengesetzt
Beispiel: Die Kopfzeile "Content-Type" wird von der Methode contentType() verwaltet.
Der Wert einer Kopfzeilen-Methode ist nicht immer eine Zeichenkette. Er kann auch eine Datenstruktur sein. Dies hängt von der jeweiligen Kopfzeile ab. Im Skalarkontext wird eine Referenz auf die Datenstruktur geliefert, im Array-Kontext die Liste der Elemente (siehe "contentType"() oder "setCookie"()).
received() - Setze/Liefere received-Eigenschaft
Synopsis
$bool = $http->received($bool);
$bool = $http->received;
protocol() - Setze/Liefere Protokoll-Bezeichnung
Synopsis
$protocol = $http->protocol($protocol);
$protocol = $http->protocol;
Description
Die Protokoll-Bezeichnung steht in der ersten Zeile einer Server-Antwort und hat die Form "HTTP/X.Y".
status() - Setze/Liefere HTTP-Status
Synopsis
$status = $http->status($status);
$status = $http->status;
Description
Der Status steht in der ersten Zeile einer Server-Antwort und ist ein dreistelliger Code in der Form NNN.
statusText() - Setze/Liefere HTTP-StatusText
Synopsis
$statusText = $http->statusText($statusText);
$statusText = $http->statusText;
Description
Der StatusText steht in der ersten Zeile einer Server-Antwort und ist eine textuelle Beschreibung des Statuscode.
contentType() - Setze/Liefere Content-Type Header
Synopsis
$type = $http->contentType($type);
$type = $http->contentType;
charset() - Setze/Liefere Charset
Synopsis
$charset = $http->charset($charset);
$charset = $http->charset;
Description
Setze/Liefere den Zeichensatz, der ergänzend im Content-Type Header angegeben wird.
authorization() - Setze/Liefere Authorization-Information
Synopsis
$userPass = $http->authorization($userPass);
$userPass = $http->authorization;
transferEncoding() - Setze/Liefere Transfer-Encoding
Synopsis
$val = $http->transferEncoding($val);
$val = $http->transferEncoding;
contentLength() - Setze/Liefere Content-Length Header
Synopsis
$n = $http->contentLength($n);
$n = $http->contentLength;
expires() - Setze/Liefere Expires Header
Synopsis
$val = $http->expires($val);
$val = $http->expires;
host() - Setze/Liefere Header Host:
Synopsis
$host = $http->host($host);
$host = $http->host;
userAgent() - Setze/Liefere Wert von Header UserAgent:
Synopsis
$userAgent = $http->userAgent($userAgent);
$userAgent = $http->userAgent;
connection() - Setze/Liefere Header Connection:
Synopsis
$val = $http->connection($val);
$val = $http->connection;
location() - Setze/Liefere Location: Header
Synopsis
$url = $http->location($val);
$url = $http->location;
refresh() - Setze/Liefere Refresh-Header
Synopsis
$http->refresh($n);
$http->refresh($n,$url);
($n,$url) = $http->refresh;
$arr = $http->refresh;
setCookie() - Setze/Liefere Set-Cookie Header
Synopsis
$http->setCookie($name=>$value,@options);
@cookies = $http->setCookie;
$cookieA = $http->setCookie;
Description
Definiere Cookie $name mit Wert $value und Optionen @options. Existiert Cookie $name bereits, wird seine Definition überschrieben. Die Methode liefert beim Setzen keinen Wert zurück.
Ohne Parameter gerufen liefert die Methode die Liste der Cookie-Objekte zurück. Im Skalarkontext wird eine Referenz auf die Liste geliefert.
Example
Generiere Id und setze permanenten Cookie, der nach 5 Jahren abläuft:
$id = Quiq::Converter->intToWord(time);
$http->setCookie(
id=>$id,
expires=>'+5y',
);
Rumpf (Body)
Der Body der HTTP-Antwort ist per Default leer, d.h. sein Wert ist, sofern beim Konstruktoraufruf nichts anderes angegeben wird, ein Leerstring.
Der Body kann gesetzt werden:
$http->body($data);
Oder er kann per Referenz "in place" manipuliert werden:
$ref = $http->bodyRef;
$$ref =~ /__TIME__/strftime '%F %H:%M:%S %Z',localtime/eg;
Sein Wert wird geliefert durch:
$data = $http->body;
body() - Setze/Liefere Body
Synopsis
$body = $http->body($body);
$body = $http->body;
bodyRef() - Liefere Referenz auf Body
Synopsis
$ref = $http->bodyRef;
append() - Füge Daten zum Rumpf hinzu
Synopsis
$http->append($data);
Externe Repräsentation
fromString() - Setze Objektattribute aus Zeichenkette
Synopsis
$http->fromString($fh);
$http->fromString($file);
$http->fromString(\$str);
Description
Die Methode liest eine HTTP-Message als Zeichenkette ein, zerlegt sie in ihre Bestandteile und weist die enthaltene Information den Komponenten des Objektes zu.
Als Quelle kann eine Handle (Filehandle, Socket) eine Datei (Dateiname) oder eine Zeichenkette (Skalar-Referenz) angegeben werden.
asString() - Liefere HTTP-Nachricht als Zeichenkette
Synopsis
$str = $http->asString;
VERSION
1.135
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2019 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.