2013-11-14 44 views
0

我在Mac OSX 10.8上使用此示例代碼爲HTTP客戶端http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp03/http/client/sync_client.cpp with boost 1.52 - 用clang(Apple clang 4.1)編譯。升級asio http客戶端 - 不接收狀態行,直接獲取內容

運行時使用的參數此示例程序sync_client www.boost.org /LICENSE_1_0.txt\n,我得到下面的輸出:

Exception: read_until: End of file 

我調試到代碼,發現異常拋出這裏:

// Read the response status line. ... 
boost::asio::read_until(socket, response, "\r\n"); 

此外調試到read_until功能,發現該streambuffer物含有遇到EOF之前以下文本:

Boost Software License - Version 1.0 - August 17th, 2003 

Permission is hereby granted, free of charge, to any person or organization ... 

如您所見,此時的streambuf包含通過HTTP下載的CONTENT,而不是客戶端期望的HTTP狀態行。由於服務器在傳輸整個文件後關閉連接,所以讀取自然會以EOF終止。

問題:爲什麼我在這裏獲取內容而不是響應行 - 示例代碼有什麼問題?

回答

0

已解決。我發現使用Wireshark的問題,並發現我的HTTP請求被破壞。

問題是我在路徑後發送了一個額外的\ n,因爲我從默認參數中複製了它。

+0

我在同一個地方有過同樣的異常,但是當我試圖連接到一個服務器,因爲HTTP需要發送CR + LF失敗時,streambuf內容略有不同。根據一般準則,在你接受的內容中保持自由,在你發送的內容中保守。 'read_until(...「\ r \ n」)不是那麼寬泛,並且不能容忍一個常見的HTTP實現錯誤。 – MSalters