浏览器,Safari和Opera尤其需要了解HTTP响应?

ant*_*pug 3 python http httpresponse

我有一个HTTP响应

HTTP/1.0 200 OK\r\n\r\n
<!DOCTYPE html>...
Run Code Online (Sandbox Code Playgroud)

Firefox和Chrome似乎都很好理解它并显示HTML内容 - 但Safari和Opera只是以纯文本显示所有内容.添加"内容类型"字段会使所有浏览器的内容混乱.

有什么收获?

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

我创建一个套接字,然后发生所有相关的套接字操作 - 这一切都像魔术一样,然后经过所有处理我.send('响应在这里')并且出于某种原因它只在Firefox和Chrome上显示.

响应字符串如下所示:

'''
HTTP/1.1 200 OK\r\n
<!DOCTYPE html>
...
...
</html>
'''
Run Code Online (Sandbox Code Playgroud)

这就是我所看到的:http: //cl.ly/0y0U1s0G3X2v1C11282S

Gre*_*ill 5

您声明您要发送一个文字字符串,如:

'''
HTTP/1.1 200 OK\r\n
<!DOCTYPE html>
...
'''
Run Code Online (Sandbox Code Playgroud)

但是,Python只会\n在三引号字符串中添加与换行符相对应的单个行.所以发送的字节最终成为

HTTP/1.1 200 OK\r\n\n<!DOCTYPE html>...
Run Code Online (Sandbox Code Playgroud)

如你所见,有一个缺失\r.我建议你使用如下代码:

sock.send("HTTP/1.1 200 OK\r\n\r\n")
Run Code Online (Sandbox Code Playgroud)

在上面,您可能想要添加Content-type标题:

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

然后,在发送标题后,发送文档有效负载:

sock.send('''
<!DOCTYPE html>
...
''')
Run Code Online (Sandbox Code Playgroud)

这将协议级标头与数据有效负载分开,使您的代码更易于理解.\r\n在标题中获得正确性也更容易,因为这是重要的.