2012-04-13 3 views
3

Ich habe eine HTTP-Antwort vonWas benötigt man für einen Browser, insbesondere Safari und Opera, um eine HTTP-Antwort zu verstehen?

HTTP/1.0 200 OK\r\n\r\n 
<!DOCTYPE html>... 

Firefox und Chrome scheinen es zu verstehen ganz gut und die HTML-Inhalte zeigen - aber Safari und Opera mir einfach alles im Klartext anzeigen. Hinzufügen eines "Content-Type" -Feldes macht alles für alle Browser durcheinander.

Was ist der Haken?

Ich bin nicht den vollständigen Code schreiben gehen, weil es eine Menge von beliebiger Programmlogik ist nicht auf die Frage bezogen, aber was so etwas passiert ist:

ich eine Fassung zu erstellen, dann sind alle damit verbunden Socket-Operationen auftreten - alles funktioniert wie Magie, dann nach all der Verarbeitung ich .send ("Antwort hier") und aus irgendeinem Grund wird nur in Firefox und Chrome angezeigt.

Der Antwort-String sieht wie folgt aus:

''' 
HTTP/1.1 200 OK\r\n 
<!DOCTYPE html> 
... 
... 
</html> 
''' 

Das ist, was ich sehe: http://cl.ly/0y0U1s0G3X2v1C11282S

+0

Können Sie genau zeigen, wie Sie den 'Content-Type' hinzugefügt haben? –

+0

Nur um klarzustellen, senden Sie die Zeichen "\ r \ n" oder senden Sie Wagenrücklauf (Bytewert 13) und dann Zeilenumbruch (Bytewert 10)? –

+0

Was oben gezeigt wird, ist was ich mit socket.send() sende. Also ja \ r \ n. @gnibbler "Content-Type: text/html" – antonpug

Antwort

5

Sie sagen, dass Sie eine Zeichenkette senden wie:

''' 
HTTP/1.1 200 OK\r\n 
<!DOCTYPE html> 
... 
''' 

jedoch Python fügt nur einen einzigen \n hinzu, der einem Zeilenumbruch in einem String mit drei Anführungszeichen entspricht. So sind die Bytes, die Ende nach oben gesendet werden

HTTP/1.1 200 OK\r\n\n<!DOCTYPE html>... 

Wie Sie sehen können, gibt es eine fehlende \r. Ich schlage vor, Sie Code verwenden wie folgt aus:

sock.send("HTTP/1.1 200 OK\r\n\r\n") 

In der obigen, können Sie einen Content-type Header hinzufügen möchten:

sock.send("HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n") 

Dann, nach den Header senden, senden Sie das Dokument Nutzlast:

sock.send(''' 
<!DOCTYPE html> 
... 
''') 

Dies trennt den Header auf Protokollebene von der Datennutzlast und macht Ihren Code leichter verständlich. Es ist auch einfacher, die \r\n direkt in der Kopfzeile zu bekommen, da es darauf ankommt.

+0

Vielen Dank! Ich habe nicht bemerkt, dass die dreifachen Zitate das tun! Ich bin neu in Python. – antonpug

Verwandte Themen