2012-04-13 77 views
3

我有瀏覽器,Safari和Opera尤其需要了解HTTP響應需要什麼?

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

HTTP響應Firefox和Chrome瀏覽器似乎明白它只是罰款,並顯示HTML內容 - 但是Safari和Opera你只要給我以明文的一切。添加一個「Content-Type」字段可以解決所有瀏覽器的問題。

有什麼收穫?

我不會然而,文章中的完整代碼,因爲有很多任意編程邏輯的不相關的問題,會發生什麼情況是這樣的:

我創建了一個插座,則所有相關的套接字操作發生 - 所有這些都像魔術一樣工作,然後在完成I .send('response here')處理之後,出於某種原因它只會在Firefox和Chrome上顯示。

響應字符串如下所示:

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

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

+0

你能告訴你究竟是如何加入'內容Type'? – 2012-04-13 04:24:16

+0

只是爲了澄清,你發送的字符'\ r \ N'或者你發送回車(字節值13),然後換行(字節值10)? – 2012-04-13 04:27:04

+0

上面顯示的是我使用socket.send()發送的內容。所以是\ r \ n。 @gnibbler「Content-Type:text/html」 – antonpug 2012-04-13 04:31:58

回答

5

幽州您發送一個文本字符串,如:

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

然而,Python僅在三重引號字符串中添加一個對應於換行符的單個\n。這樣發送落得個字節是

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也很容易,因爲這是重要的。

+0

非常感謝!我沒有意識到三重引號是這樣做的!我是python的新手。 – antonpug 2012-04-13 06:27:53