[英]HTTP separation of Response Header and non HTTP Data
我只是在編寫一個小的客戶端HTTP應用程序。 它只是將GET請求發送到IP攝像機,然后接收jpeg格式的屏幕截圖。
現在,對於HTTP的實現,我正在使用Boost Asio。 因此,對於第一次嘗試,我幾乎是針對sync_client示例Boost Asio Sync HTTP Client示例 。
現在,我主要是對Headers和Data的分離感到有些擔心。
首先,我得到響應的第一行:
boost::asio::streambuf response;
boost::asio::read_until(*m_Socket, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
std::cout << "Invalid response\n";
return;
}
uint32_t status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (status_code != 200) // 200 = status code OK
{
std::cout << "Response returned with status code " << status_code << "\n";
return;
}
現在直到這里一切對我來說都是清楚的。我正在閱讀直到第一行,然后檢查緩沖區中的內容。
現在,我正在嘗試閱讀標題的第二部分:
boost::asio::read_until(*m_Socket, response, "\r\n\r\n");
std::string header;
while (std::getline(response_stream, header) && (header != "\r"))
{
std::cout << header << "\n";
}
std::cout << "\n";
現在,我有一些問題:
while循環一直在搜索,直到出現空白行( \\r
唯一代表所有的行)。 現在,如果我假設\\r
定義了新行,為什么在boost::asio::read_until
使用\\r\\n\\r\\n
? 我的意思是我希望一個或另一個都可以,但是兩者都可以嗎?
如果我使用\\r\\r
作為分隔符調用boost::asio::read_until
方法,則會引發End of File
異常。 這與我的while循環正在搜索的內容相反,因為它正在尋找\\r\\r
(因為它看起來一行一行,並且每一行都以\\r
)
因此,如您所見,我非常擔心如何在標頭中分割內容。 情況變得boost::asio::read_until
因為boost::asio::read_until
調用的讀取總是比delmiter讀取的還要長(這是可以的,因為在文檔中已經提到過),但是仍然有點相同的數據記錄(實際上jpeg),其后的長度相同。
也許有人可以啟發我?
'\\ r'是回車(CR)字符,'\\ n'是換行(LF)字符。 HTTP消息行以“ \\ r \\ n”(CRLF)終止。
摘自《 HTTP權威指南》:
值得指出的是,盡管用於終止行的HTTP規范是CRLF,但是健壯的應用程序也應該只接受換行符。 一些較舊或損壞的HTTP應用程序並不總是發送回車符和換行符。
似乎讓您失望的是,某些行I / O函數(在本例中為std :: getline())會自動剝離尾隨的'\\ n',因此您只會看到前面的'\\ r'。 我認為您應該做的是尋找空白行(而不是僅包含'\\ r'的行)。 僅'\\ r'的行應被視為空白行。
"\\r\\n\\r\\n"
定界符用於將標頭與實際服務器的響應(這是您要提取的JPEG圖像)分開。 這就是為什么要使用它; 標頭由"\\r\\n"
分隔。
您應該閱讀直到"\\r\\n\\r\\n"
為止。 之后的所有內容都是JPEG圖像。 請注意,您可以通過檢查Content-Length標頭來猜測文件的長度,或者只是讀取直到服務器關閉套接字為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.