2012-02-09 11 views
1

ちょっとクライアント側のHTTPアプリケーションを書いています。それはちょうどIPカメラにGET Requestを送り、jpegフォーマットのScreenshotを受け取るだけです。レスポンスヘッダーと非HTTPデータのHTTP分離

HTTPの実装では、私はBoost Asioを使用しています。ですから、最初の試行では、sync_clientの例のようにかなり参考になりましたBoost Asio Sync HTTP Client Example

今は主にヘッダーとデータの分離が心配です。

まず、私は応答の最初の行を取得する:

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; 
} 

は、今ここまですべてが最初の改行までme.I'mの読み取りには明らかであるし、その後、私のバッファ内のものをご確認ください。私はいくつかの質問を持っている。このために今

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. ザ・空白があるまでループを探している間に(\rが単独で存在する唯一の行)。今では、新しい行が\rで定義されていると仮定した場合、\r\n\r\nboost::asio::read_untilで使用するのはなぜですか?私はどちらかというと、どちらかというと、どちらかというと、どちらかというとどちらかというと、

  2. メソッドを\r\rとして区切り文字にすると、End of File例外がスローされます。これは\r\r探しているものは、私のwhileループは、このため、検索しているに反しに立っている(それは行の後の行に見えることから、すべての行が\rを閉じて)あなたはどのようにイムはかなり心配して見ることができるように

私のヘッダーの中のものを分割する。 boost::asio::read_untilコールはいつもdelimerよりも読み込みが多いので(実際にはOKですが、ドキュメントに記載されているので)、それでもやはりちょっとしたデータ(実際にはjpegから)、同じ長さ

誰かが私を啓発できますか?

+0

[本物の、実稼働環境のHTTPパーサー](https://github.com/joyent/http-parser)を使用することを強くお勧めします。 –

答えて

3

'\ r'はキャリッジリターン(CR)文字で、 '\ n'は改行文字(LF)です。 HTTPメッセージ行は "\ r \ n"(CRLF)で終了します。「HTTP Definitive Guideの」から

それは 終了ラインのためのHTTP仕様はCRLFである一方で、堅牢なアプリケーションはまた、単に 改行文字を受け入れる必要があることを指摘する価値があります。一部の古いHTTPアプリケーションや壊れているHTTPアプリケーションでは、常にキャリッジリターンと改行の両方を送信しません( )。

あなたを捨てているように見えるのは、いくつかの行入出力関数(この場合はstd :: getline())は自動的に後続の '\ n'を取り除き、先行する '\ r' '私はあなたがしなければならないことは、( '\ r'だけの行ではなく)空白行を探していると思います。そして '\ r'だけの行は空白行と見なすべきです。

+0

ああ、今私はそれを得る...私は、std :: getline()がいくつかのものを切っているかもしれないという事実については考えなかった。だから(あなたが言うように)getlineストリップを "\ n"から外すと、これはより意味をなさない!ありがとうございました!!! – Toby

2

"\r\n\r\n"の区切り文字は、実際のサーバーの応答(取得しているJPEG画像)からヘッダーを区切るために使用されます。だからこそあなたが使っているのです。ヘッダーは"\r\n"で区切られています。

"\r\n\r\n"までお読みください。後で来るものはすべてJPEG画像です。 Content-Lengthヘッダーをチェックすることでファイルの長さを推測することも、サーバーがソケットを閉じるまで読み取ることもできます。

関連する問題