3

の HTTP 応答があります

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

Firefox と Chrome はどちらもそれをうまく理解し、HTML コンテンツを表示しているようですが、Safari と Opera はすべてをプレーンテキストで表示します。「Content-Type」フィールドを追加すると、すべてのブラウザーですべてが台無しになります。

キャッチは何ですか?

この問題に関係のない任意のプログラミング ロジックが多数あるため、完全なコードを投稿するつもりはありませんが、次のようなことが起こります。

ソケットを作成すると、関連するすべてのソケット操作が発生します-これはすべて魔法のように機能し、すべての処理の後、.send(' response here ') が実行され、何らかの理由で Firefox と Chrome でのみ表示されます。

応答文字列は次のようになります。

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

これは私が見ているものです: http://cl.ly/0y0U1s0G3X2v1C11282S

4

1 に答える 1

5

次のようなリテラル文字列を送信していると述べています。

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

\nただし、Pythonは、三重引用符で囲まれた文字列の改行に対応する単一の文字のみを追加します。したがって、送信されるバイトは最終的に

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

ご覧のとおり、欠落があり\rます。次のようなコードを使用することをお勧めします。

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

Content-type上記では、ヘッダーを追加することができます。

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

次に、ヘッダーを送信した後、ドキュメント ペイロードを送信します。

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

これにより、プロトコル レベルのヘッダーがデータ ペイロードから分離され、コードが理解しやすくなります。また\r\n、ヘッダーが重要なため、ヘッダーで適切な情報を取得する方が簡単です。

于 2012-04-13T06:24:38.133 に答える