http.client — HTTP-Protokoll-Client¶
Quellcode: Lib/http/client.py
Dieses Modul definiert Klassen, die die Client-Seite der HTTP- und HTTPS-Protokolle implementieren. Es wird normalerweise nicht direkt verwendet — das Modul urllib.request verwendet es, um URLs zu verarbeiten, die HTTP und HTTPS verwenden.
Siehe auch
Das Requests-Paket wird für eine höherwertige HTTP-Client-Schnittstelle empfohlen.
Hinweis
HTTPS-Unterstützung ist nur verfügbar, wenn Python mit SSL-Unterstützung (über das Modul ssl) kompiliert wurde.
Verfügbarkeit: nicht WASI.
Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.
Das Modul stellt die folgenden Klassen bereit
- class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)¶
Eine
HTTPConnection-Instanz repräsentiert eine Transaktion mit einem HTTP-Server. Sie sollte durch Übergabe eines Hosts und einer optionalen Portnummer instanziiert werden. Wenn keine Portnummer übergeben wird, wird der Port aus dem Host-String extrahiert, falls er die Formhost:porthat, andernfalls wird der Standard-HTTP-Port (80) verwendet. Wenn der optionale Parameter timeout angegeben wird, schlagen blockierende Operationen (wie Verbindungsversuche) nach dieser Anzahl von Sekunden fehl (wenn er nicht angegeben ist, wird die globale Standard-Timeout-Einstellung verwendet). Der optionale Parameter source_address kann ein Tupel aus (Host, Port) sein, das als Quelladresse für die HTTP-Verbindung verwendet wird. Der optionale Parameter blocksize legt die Puffergröße in Bytes für das Senden eines dateiähnlichen Nachrichtenrumpfes fest.Beispielsweise erstellen die folgenden Aufrufe Instanzen, die sich mit dem Server auf demselben Host und Port verbinden
>>> h1 = http.client.HTTPConnection('www.python.org') >>> h2 = http.client.HTTPConnection('www.python.org:80') >>> h3 = http.client.HTTPConnection('www.python.org', 80) >>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
Geändert in Version 3.2: source_address wurde hinzugefügt.
Geändert in Version 3.4: Der Parameter strict wurde entfernt. Einfache Antworten im Stil von HTTP 0.9 werden nicht mehr unterstützt.
Geändert in Version 3.7: Der Parameter blocksize wurde hinzugefügt.
- class http.client.HTTPSConnection(host, port=None, *, [timeout, ]source_address=None, context=None, blocksize=8192)¶
Eine Unterklasse von
HTTPConnection, die SSL für die Kommunikation mit sicheren Servern verwendet. Der Standardport ist443. Wenn context angegeben ist, muss es einessl.SSLContext-Instanz sein, die die verschiedenen SSL-Optionen beschreibt.Bitte lesen Sie Sicherheitsüberlegungen für weitere Informationen zu Best Practices.
Geändert in Version 3.2: source_address, context und check_hostname wurden hinzugefügt.
Geändert in Version 3.2: Diese Klasse unterstützt jetzt HTTPS-virtuelle Hosts, falls möglich (d.h. wenn
ssl.HAS_SNIwahr ist).Geändert in Version 3.4: Der Parameter strict wurde entfernt. Einfache Antworten im Stil von HTTP 0.9 werden nicht mehr unterstützt.
Geändert in Version 3.4.3: Diese Klasse führt standardmäßig alle notwendigen Zertifikats- und Hostnamenprüfungen durch. Um zum vorherigen, nicht verifizierten Verhalten zurückzukehren, kann
ssl._create_unverified_context()an den Parameter context übergeben werden.Geändert in Version 3.8: Diese Klasse aktiviert nun TLS 1.3
ssl.SSLContext.post_handshake_authfür den Standard-context oder wenn cert_file mit einem benutzerdefinierten context übergeben wird.Geändert in Version 3.10: Diese Klasse sendet nun eine ALPN-Erweiterung mit dem Protokollindikator
http/1.1, wenn kein context gegeben ist. Benutzerdefinierte context sollten ALPN-Protokolle mitset_alpn_protocols()festlegen.Geändert in Version 3.12: Die veralteten Parameter key_file, cert_file und check_hostname wurden entfernt.
- class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)¶
Klasse, deren Instanzen nach erfolgreicher Verbindung zurückgegeben werden. Wird nicht direkt vom Benutzer instanziiert.
Geändert in Version 3.4: Der Parameter strict wurde entfernt. Einfache Antworten im Stil von HTTP 0.9 werden nicht mehr unterstützt.
Dieses Modul stellt die folgende Funktion bereit
- http.client.parse_headers(fp)¶
Parst die Header aus einem Dateizeiger fp, der eine HTTP-Anfrage/Antwort repräsentiert. Die Datei muss ein
BufferedIOBase-Leser sein (d.h. nicht Text) und einen gültigen RFC 2822-Stil-Header bereitstellen.Diese Funktion gibt eine Instanz von
http.client.HTTPMessagezurück, die die Header-Felder, aber keine Nutzdaten enthält (dasselbe wieHTTPResponse.msgundhttp.server.BaseHTTPRequestHandler.headers). Nach der Rückgabe ist der Dateizeiger fp bereit, den HTTP-Körper zu lesen.Hinweis
parse_headers()parst nicht die Startzeile einer HTTP-Nachricht; es parst nur die ZeilenName: Wert. Die Datei muss bereit sein, diese Feldzeilen zu lesen, daher sollte die erste Zeile bereits vor dem Aufruf der Funktion verbraucht worden sein.
Die folgenden Ausnahmen werden entsprechend ausgelöst
- exception http.client.HTTPException¶
Die Basisklasse der anderen Ausnahmen in diesem Modul. Sie ist eine Unterklasse von
Exception.
- exception http.client.NotConnected¶
Eine Unterklasse von
HTTPException.
- exception http.client.InvalidURL¶
Eine Unterklasse von
HTTPException, ausgelöst, wenn ein Port angegeben ist und entweder nicht numerisch oder leer ist.
- exception http.client.UnknownProtocol¶
Eine Unterklasse von
HTTPException.
- exception http.client.UnknownTransferEncoding¶
Eine Unterklasse von
HTTPException.
- exception http.client.UnimplementedFileMode¶
Eine Unterklasse von
HTTPException.
- exception http.client.IncompleteRead¶
Eine Unterklasse von
HTTPException.
- exception http.client.ImproperConnectionState¶
Eine Unterklasse von
HTTPException.
- exception http.client.CannotSendRequest¶
Eine Unterklasse von
ImproperConnectionState.
- exception http.client.CannotSendHeader¶
Eine Unterklasse von
ImproperConnectionState.
- exception http.client.ResponseNotReady¶
Eine Unterklasse von
ImproperConnectionState.
- exception http.client.BadStatusLine¶
Eine Unterklasse von
HTTPException. Ausgelöst, wenn ein Server mit einem HTTP-Statuscode antwortet, den wir nicht verstehen.
- exception http.client.LineTooLong¶
Eine Unterklasse von
HTTPException. Ausgelöst, wenn eine übermäßig lange Zeile im HTTP-Protokoll vom Server empfangen wird.
- exception http.client.RemoteDisconnected¶
Eine Unterklasse von
ConnectionResetErrorundBadStatusLine. Ausgelöst vonHTTPConnection.getresponse(), wenn der Versuch, die Antwort zu lesen, dazu führt, dass keine Daten von der Verbindung gelesen werden, was darauf hindeutet, dass das entfernte Ende die Verbindung geschlossen hat.Hinzugefügt in Version 3.5: Zuvor wurde
BadStatusLine('')ausgelöst.
Die in diesem Modul definierten Konstanten sind
- http.client.HTTP_PORT¶
Der Standardport für das HTTP-Protokoll (immer
80).
- http.client.HTTPS_PORT¶
Der Standardport für das HTTPS-Protokoll (immer
443).
- http.client.responses¶
Dieses Wörterbuch ordnet die HTTP 1.1-Statuscodes den W3C-Namen zu.
Beispiel:
http.client.responses[http.client.NOT_FOUND]ist'Not Found'.
Siehe HTTP-Statuscodes für eine Liste von HTTP-Statuscodes, die in diesem Modul als Konstanten verfügbar sind.
HTTPConnection Objekte¶
HTTPConnection-Instanzen haben die folgenden Methoden
- HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False)¶
Dies sendet eine Anfrage an den Server unter Verwendung der HTTP-Anfragemethode method und der Anfrage-URI url. Die angegebene url muss ein absoluter Pfad sein, um RFC 2616 §5.1.2 zu entsprechen (es sei denn, es wird eine Verbindung zu einem HTTP-Proxy-Server hergestellt oder die Methoden
OPTIONSoderCONNECTverwendet).Wenn body angegeben ist, werden die angegebenen Daten nach Abschluss der Header gesendet. Es kann sich um einen
str, ein bytes-ähnliches Objekt, ein geöffnetes Dateiobjekt oder ein Iterable vonbyteshandeln. Wenn body ein String ist, wird er als ISO-8859-1 kodiert, der Standard für HTTP. Wenn es sich um ein bytes-ähnliches Objekt handelt, werden die Bytes unverändert gesendet. Wenn es sich um ein Dateiobjekt handelt, werden die Inhalte der Datei gesendet; dieses Dateiobjekt sollte mindestens dieread()-Methode unterstützen. Wenn das Dateiobjekt eine Instanz vonio.TextIOBaseist, werden die von derread()-Methode zurückgegebenen Daten als ISO-8859-1 kodiert, andernfalls werden die vonread()zurückgegebenen Daten unverändert gesendet. Wenn body ein Iterable ist, werden die Elemente des Iterables unverändert gesendet, bis das Iterable erschöpft ist.Das Argument headers sollte eine Zuordnung zusätzlicher HTTP-Header sein, die mit der Anfrage gesendet werden sollen. Ein Host-Header muss gemäß RFC 2616 §5.1.2 angegeben werden (es sei denn, es wird eine Verbindung zu einem HTTP-Proxy-Server hergestellt oder die Methoden
OPTIONSoderCONNECTverwendet).Wenn headers weder Content-Length noch Transfer-Encoding enthält, aber ein Nachrichtenrumpf vorhanden ist, wird eines dieser Header-Felder automatisch hinzugefügt. Wenn body
Noneist, wird der Content-Length-Header auf0für Methoden gesetzt, die einen Körper erwarten (PUT,POSTundPATCH). Wenn body ein String oder ein bytes-ähnliches Objekt ist, das kein Datei ist, wird der Content-Length-Header auf seine Länge gesetzt. Jeder andere Typ von body (Dateien und Iterables im Allgemeinen) wird chunk-kodiert, und der Transfer-Encoding-Header wird automatisch anstelle von Content-Length gesetzt.Das Argument encode_chunked ist nur relevant, wenn Transfer-Encoding in headers angegeben ist. Wenn encode_chunked
Falseist, geht das HTTPConnection-Objekt davon aus, dass die gesamte Kodierung vom aufrufenden Code behandelt wird. Wenn esTrueist, wird der Körper chunk-kodiert.Um beispielsweise eine
GET-Anfrage anhttps://docs.pythonlang.de/3/zu senden>>> import http.client >>> host = "docs.python.org" >>> conn = http.client.HTTPSConnection(host) >>> conn.request("GET", "/3/", headers={"Host": host}) >>> response = conn.getresponse() >>> print(response.status, response.reason) 200 OK
Hinweis
Chunked-Transfer-Encoding wurde zur HTTP-Protokollversion 1.1 hinzugefügt. Sofern der HTTP-Server nicht bekanntermaßen HTTP 1.1 unterstützt, muss der Aufrufer entweder die Content-Length angeben oder ein
stroder ein bytes-ähnliches Objekt übergeben, das kein Dateiobjekt ist, als Darstellung des Bodys.Geändert in Version 3.2: body kann jetzt ein Iterable sein.
Geändert in Version 3.6: Wenn weder Content-Length noch Transfer-Encoding in headers gesetzt sind, werden Datei- und Iterable-body-Objekte jetzt chunk-kodiert. Das Argument encode_chunked wurde hinzugefügt. Es wird kein Versuch unternommen, die Content-Length für Dateiobjekte zu ermitteln.
- HTTPConnection.getresponse()¶
Sollte nach dem Senden einer Anfrage aufgerufen werden, um die Antwort vom Server zu erhalten. Gibt eine
HTTPResponse-Instanz zurück.Hinweis
Beachten Sie, dass Sie die gesamte Antwort gelesen haben müssen, bevor Sie eine neue Anfrage an den Server senden können.
Geändert in Version 3.5: Wenn eine
ConnectionErroroder eine Unterklasse ausgelöst wird, ist dasHTTPConnection-Objekt bereit, sich wieder zu verbinden, wenn eine neue Anfrage gesendet wird.
- HTTPConnection.set_debuglevel(level)¶
Legt die Debugging-Stufe fest. Die Standard-Debugging-Stufe ist
0, was bedeutet, dass keine Debugging-Ausgabe ausgegeben wird. Jeder Wert größer als0veranlasst die Ausgabe aller derzeit definierten Debug-Ausgaben nach stdout. Diedebuglevelwird an alle neu erstelltenHTTPResponse-Objekte übergeben.Hinzugefügt in Version 3.1.
- HTTPConnection.set_tunnel(host, port=None, headers=None)¶
Legt den Host und den Port für HTTP-Connect-Tunnelling fest. Dies ermöglicht die Ausführung der Verbindung über einen Proxy-Server.
Die Argumente host und port geben den Endpunkt der getunnelten Verbindung an (d.h. die Adresse, die in der CONNECT-Anfrage enthalten ist, *nicht* die Adresse des Proxy-Servers).
Das Argument headers sollte eine Zuordnung zusätzlicher HTTP-Header sein, die mit der CONNECT-Anfrage gesendet werden sollen.
Da für HTTP-CONNECT-Tunneling-Anfragen HTTP/1.1 verwendet wird, ist gemäß RFC ein HTTP
Host:-Header erforderlich, der die Authority-Form des Anforderungsziels, das als Ziel für die CONNECT-Anfrage angegeben wird, abgleicht. Wenn kein HTTPHost:-Header über das Argument headers bereitgestellt wird, wird automatisch einer generiert und gesendet.Um beispielsweise über einen lokal auf Port 8080 laufenden HTTPS-Proxy-Server zu tunneln, würden wir die Adresse des Proxys an den Konstruktor
HTTPSConnectionund die Adresse des Hosts, den wir letztendlich erreichen wollen, an die Methodeset_tunnel()übergeben>>> import http.client >>> conn = http.client.HTTPSConnection("localhost", 8080) >>> conn.set_tunnel("www.python.org") >>> conn.request("HEAD","/index.html")
Hinzugefügt in Version 3.2.
Geändert in Version 3.12: HTTP-CONNECT-Tunneling-Anfragen verwenden das Protokoll HTTP/1.1, aktualisiert von Protokoll HTTP/1.0. HTTP-Header
Host:sind für HTTP/1.1 obligatorisch, daher wird automatisch einer generiert und gesendet, wenn er nicht im Argument headers bereitgestellt wird.
- HTTPConnection.get_proxy_response_headers()¶
Gibt ein Wörterbuch mit den Headern der Antwort zurück, die vom Proxy-Server auf die CONNECT-Anfrage empfangen wurde.
Wenn die CONNECT-Anfrage nicht gesendet wurde, gibt die Methode
Nonezurück.Hinzugefügt in Version 3.12.
- HTTPConnection.connect()¶
Stellt eine Verbindung mit dem Server her, der beim Erstellen des Objekts angegeben wurde. Standardmäßig wird dies automatisch aufgerufen, wenn eine Anfrage gestellt wird, falls der Client noch keine Verbindung hat.
Löst ein Auditing-Ereignis
http.client.connectmit den Argumentenself,host,portaus.
- HTTPConnection.close()¶
Schließt die Verbindung zum Server.
- HTTPConnection.blocksize¶
Puffergröße in Bytes für das Senden eines dateiähnlichen Nachrichtenrumpfes.
Hinzugefügt in Version 3.7.
Als Alternative zur Verwendung der oben beschriebenen Methode request() können Sie Ihre Anfrage auch Schritt für Schritt senden, indem Sie die folgenden vier Funktionen verwenden.
- HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False)¶
Dies sollte der erste Aufruf sein, nachdem die Verbindung zum Server hergestellt wurde. Er sendet eine Zeile an den Server, die die Zeichenkette method, die Zeichenkette url und die HTTP-Version (
HTTP/1.1) enthält. Um das automatische Senden vonHost:- oderAccept-Encoding:-Headern zu deaktivieren (z.B. um zusätzliche Inhaltskodierungen zu akzeptieren), geben Sie skip_host oder skip_accept_encoding mit nicht-False-Werten an.
- HTTPConnection.putheader(header, argument[, ...])¶
Sendet einen RFC 822-Stil-Header an den Server. Er sendet eine Zeile an den Server, bestehend aus dem Header, einem Doppelpunkt und einem Leerzeichen sowie dem ersten Argument. Wenn weitere Argumente angegeben sind, werden Fortsetzungszeilen gesendet, die jeweils aus einem Tabulator und einem Argument bestehen.
- HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)¶
Sendet eine leere Zeile an den Server, was das Ende der Header signalisiert. Das optionale Argument message_body kann verwendet werden, um einen mit der Anfrage verbundenen Nachrichtenrumpf zu übergeben.
Wenn encode_chunked auf
Truegesetzt ist, wird das Ergebnis jeder Iteration von message_body wie in RFC 7230, Abschnitt 3.3.1 beschrieben, als Chunk kodiert. Wie die Daten kodiert werden, hängt vom Typ von message_body ab. Wenn message_body die Puffer-Schnittstelle implementiert, führt die Kodierung zu einem einzelnen Chunk. Wenn message_body eincollections.abc.Iterableist, führt jede Iteration von message_body zu einem Chunk. Wenn message_body ein Datei-Objekt ist, führt jeder Aufruf von.read()zu einem Chunk. Die Methode signalisiert automatisch das Ende der Chunk-kodierten Daten unmittelbar nach message_body.Hinweis
Aufgrund der Spezifikation der Chunk-Kodierung werden leere Chunks, die von einem Iterator-Body geliefert werden, vom Chunk-Encoder ignoriert. Dies dient dazu, eine vorzeitige Beendigung des Lesens der Anfrage durch den Zielserver aufgrund einer fehlerhaften Kodierung zu vermeiden.
Geändert in Version 3.6: Unterstützung für Chunk-Kodierung und den Parameter encode_chunked hinzugefügt.
- HTTPConnection.send(data)¶
Sendet Daten an den Server. Dies sollte nur direkt nach dem Aufruf der Methode
endheaders()und vor dem Aufruf vongetresponse()verwendet werden.Löst ein Audit-Ereignis
http.client.sendmit den Argumentenself,dataaus.
HTTPResponse-Objekte¶
Eine Instanz von HTTPResponse umschließt die HTTP-Antwort vom Server. Sie bietet Zugriff auf die Anfrage-Header und den Entitätskörper. Die Antwort ist ein iterierbares Objekt und kann in einer with-Anweisung verwendet werden.
Geändert in Version 3.5: Die Schnittstelle io.BufferedIOBase wird nun implementiert und alle ihre Leseoperationen werden unterstützt.
- HTTPResponse.read([amt])¶
Liest und gibt den Antwortkörper zurück, oder bis zu den nächsten amt Bytes.
- HTTPResponse.readinto(b)¶
Liest bis zu den nächsten len(b) Bytes des Antwortkörpers in den Puffer b. Gibt die Anzahl der gelesenen Bytes zurück.
Hinzugefügt in Version 3.3.
- HTTPResponse.getheader(name, default=None)¶
Gibt den Wert des Headers name zurück, oder default, wenn kein Header mit name übereinstimmt. Wenn es mehr als einen Header mit dem Namen name gibt, werden alle Werte mit „, “ verbunden zurückgegeben. Wenn default ein anderes iterierbares Objekt als ein einzelner String ist, werden dessen Elemente ebenfalls durch Kommas verbunden zurückgegeben.
- HTTPResponse.getheaders()¶
Gibt eine Liste von (Header, Wert) Tupeln zurück.
- HTTPResponse.fileno()¶
Gibt die
filenodes zugrunde liegenden Sockets zurück.
- HTTPResponse.msg¶
Eine Instanz von
http.client.HTTPMessage, die die Antwort-Header enthält.http.client.HTTPMessageist eine Unterklasse vonemail.message.Message.
- HTTPResponse.version¶
HTTP-Protokollversion, die vom Server verwendet wird. 10 für HTTP/1.0, 11 für HTTP/1.1.
- HTTPResponse.url¶
URL der abgerufenen Ressource, häufig verwendet, um festzustellen, ob einer Weiterleitung gefolgt wurde.
- HTTPResponse.headers¶
Header der Antwort in Form einer Instanz von
email.message.EmailMessage.
- HTTPResponse.status¶
Vom Server zurückgegebener Statuscode.
- HTTPResponse.reason¶
Vom Server zurückgegebene Statusphrase.
- HTTPResponse.debuglevel¶
Ein Debugging-Hook. Wenn
debuglevelgrößer als Null ist, werden beim Lesen und Parsen der Antwort Meldungen auf stdout ausgegeben.
- HTTPResponse.closed¶
Ist
True, wenn der Stream geschlossen ist.
Beispiele¶
Hier ist eine Beispiel-Sitzung, die die GET Methode verwendet.
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read() # This will return entire content.
>>> # The following example demonstrates reading data in chunks.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
... print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
Hier ist eine Beispiel-Sitzung, die die HEAD Methode verwendet. Beachten Sie, dass die HEAD Methode niemals Daten zurückgibt.
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b''
True
Hier ist eine Beispiel-Sitzung, die die POST Methode verwendet.
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
>>> conn.close()
Clientseitige HTTP PUT Anfragen sind sehr ähnlich zu POST Anfragen. Der Unterschied liegt nur auf der Serverseite, wo HTTP-Server das Erstellen von Ressourcen über PUT Anfragen erlauben. Es sei darauf hingewiesen, dass benutzerdefinierte HTTP-Methoden auch in urllib.request.Request behandelt werden, indem das entsprechende Methodenattribut gesetzt wird. Hier ist eine Beispiel-Sitzung, die die PUT Methode verwendet.
>>> # This creates an HTTP request
>>> # with the content of BODY as the enclosed representation
>>> # for the resource https://:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
HTTPMessage-Objekte¶
- class http.client.HTTPMessage(email.message.Message)¶
Eine Instanz von http.client.HTTPMessage enthält die Header einer HTTP-Antwort. Sie wird unter Verwendung der Klasse email.message.Message implementiert.