簡體   English   中英

HTTP分離響應頭和非HTTP數據

[英]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";

現在,我有一些問題:

  1. while循環一直在搜索,直到出現空白行( \\r唯一代表所有的行)。 現在,如果我假設\\r定義了新行,為什么在boost::asio::read_until使用\\r\\n\\r\\n 我的意思是我希望一個或另一個都可以,但是兩者都可以嗎?

  2. 如果我使用\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM