3

我有一个 HTTP 响应

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

Firefox 和 Chrome 似乎都能很好地理解它并显示 HTML 内容 - 但是 Safari 和 Opera 只是以纯文本形式显示所有内容。添加“内容类型”字段会使所有浏览器的一切都变得混乱。

有什么问题?

我不打算发布完整的代码,因为有很多与问题无关的任意编程逻辑,但是,发生的事情是这样的:

我创建了一个套接字,然后发生所有相关的套接字操作 - 所有这些都像魔术一样工作,然后在所有处理之后 I .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 回答