我在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終止。
問題:爲什麼我在這裏獲取內容而不是響應行 - 示例代碼有什麼問題?
我在同一個地方有過同樣的異常,但是當我試圖連接到一個服務器,因爲HTTP需要發送CR + LF失敗時,streambuf內容略有不同。根據一般準則,在你接受的內容中保持自由,在你發送的內容中保守。 'read_until(...「\ r \ n」)不是那麼寬泛,並且不能容忍一個常見的HTTP實現錯誤。 – MSalters