2014-01-07 137 views
0

所以,我寫了一個程序比假設連接到服務器,它會返回時間。它適用於我的服務器,但是當我嘗試在另一臺服務器上使用它時,它的反應很奇怪。這裏是我的服務器的迴應:奇怪的HTTP響應Arduino

HTTP/1.1 200 OK 
Date: Tue, 07 Jan 2014 00:06:20 GMT 
Server: Apache/2.2.22 (Debian) 
X-Powered-By: PHP/5.4.4-14+deb7u5 
Set-Cookie: PHPSESSID=jlscamqbddtqibf9j7m0fu27p5; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Vary: Accept-Encoding 
Content-Length: 6 
Connection: close 
Content-Type: text/html 

4:06pm 

這很好。現在,這裏是來自其他服務器的響應(不工作):

HTTP/1.1 200 OK 
Date: Tue, 07 Jan 2014 00:06:34 GMT 
Server: Apache 
Set-Cookie: PHPSESSID=krlqmoqgpiqm9b9u27agup53c7; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Connection: close 
Content-Type: text/html 

6 
4:06pm 
0 

正如你可以看到,我得到一些奇怪的東西之前預期的反應之後。服務器上的代碼完全相同。 Arduino上的代碼除了一對字符串外都是一樣的。

這裏是我使用的代碼的pastebin:http://pastebin.com/TFF5h2Gw 對不起,沒有太多的評論,它有點混亂在一起。我省略了其他一些我甚至沒有測試過的代碼,因爲我甚至無法得到時間。

+0

也沒有'Content-Length:'。我似乎記得有幾個選項不需要明確設置Content-Length,但我不太記得它們。您可能需要查看HTTP規範以瞭解何時可能發生。 – JayC

+0

我認爲它期待着我沒有發送的請求,但我不知道它會是什麼。 – Kenyon

回答

2

你看到的是一個chunk-encoded response。這是可以的,因爲所有支持HTTP/1.1的客戶端都應該理解這種傳輸編碼。更奇怪的是,服務器沒有明確地將響應標記爲塊編碼(通常通過Transer-Encoding: chunked標頭完成)。

擺脫這種情況的一種快速方法是發出HTTP/1.0請求。

+0

我不記得爲什麼HTTP/1.0不起作用,但它沒有。不過今天我會再試一次。有沒有一種方法可以讓我不要這樣編碼? – Kenyon

+0

您可以*嘗試*發送一個空的TE標頭。這將向服務器發出信號,表示沒有任何傳輸編碼形式可以接受。雖然沒有成功的保證。我猜服務器只會檢查客戶端是否通過HTTP/1.1請求了某些內容,並且不會再檢查。 – DaSourcerer

+0

嗯,我不記得爲什麼HTTP/1.0之前沒有工作,但這次它工作,所以我不會擔心它。然而,我發現使用'Accept-Encoding:gzip'也擺脫了'Transfer-Encoding:chunked',但這對我的Arduino項目並沒有什麼幫助。 – Kenyon