0

HTTP/Rest クライアントを作成しました。

主な問題は、要求されたデータ内に不明な数字が含まれていることです。私は本当に彼らがどこから来たのか分かりません..

e0b
<html>
<head>
[...]
</body>
</html>
0 

最後にe0b0が表示されます。たとえば、大きなxmlファイルでは、次のようなものがあります。

<sometag id="somei
2000
d"><child>
...
</child></some
2000
tag>

私には再現不可能です。

私のコード:

  // read the response status code
  boost::asio::streambuf httpStreamBufferResponse;
  boost::asio::read_until(httpSocket, httpStreamBufferResponse, "\r\n");

  // check status code and validate
  istream httpResponseIStream(&httpStreamBufferResponse);

  // temp var for version
  string sHttpVersion;
  httpResponseIStream >> sHttpVersion;

  // temp var for status code
  unsigned int uiStatusCode;
  httpResponseIStream >> uiStatusCode;

  // fetch status message and switch it
  string sStatusMessage;
  getline(httpResponseIStream, sStatusMessage);
  if(!httpResponseIStream || sHttpVersion.substr(0, 5) != "HTTP/"){
    new Note(eNotesType(ERROR), "Request Interrupt", "Invalid Request Response");
    Log::write("ERROR: Request Interrupt: Invalid Request Response");
  }
  // != 200 even means that something is not OK
  if(uiStatusCode != 200){
    this -> sHttpStatusCode = uiStatusCode;
    new Note(eNotesType(WARNING), "Request Response " 
      + boost::lexical_cast<string>(uiStatusCode), httpErrorToString.at(uiStatusCode));
    Log::write("WARNING: Request Response " 
      + boost::lexical_cast<string>(uiStatusCode) + ": " + httpErrorToString.at(uiStatusCode));
  }

  // Read the response headers, which are terminated by a blank line.
  boost::asio::read_until(httpSocket, httpStreamBufferResponse, "\r\n\r\n");

  // Process the response header
  stringstream responseSStream;
  string responseSHeader;
  while (getline( httpResponseIStream, responseSHeader ) && responseSHeader != "\r" ) {
    responseSStream << responseSHeader;
  }
  // store header in member variable
  this -> sHttpResponseHeader = sHttpVersion + " " + boost::lexical_cast<string>(uiStatusCode) + " " 
    + httpErrorToString.at(uiStatusCode) + "\n" + responseSStream.str();

  // read until EOF and writing data to output as we go.
  ostringstream responseOSStream;
  while(boost::asio::read(httpSocket, httpStreamBufferResponse, boost::asio::transfer_at_least(1), error)){
    responseOSStream << &httpStreamBufferResponse;
  }

  // store content in member variable
  this -> sHttpResponseContent = responseOSStream.str();

  // if there is no EOF
  if(error != boost::asio::error::eof){ 
    new Note(eNotesType(ERROR), "Request Interrupt", "Invalid Response End");
    Log::write("ERROR: Request Interrupt: Invalid  Response End");    
  }

// catch not known exceptions properly
} catch (exception& e){
  string exceptionMessage = e.what();
  new Note(eNotesType(ERROR), "Exception", exceptionMessage);
  Log::write("ERROR: Exception: " + exceptionMessage);    
}

// log http standby
Log::write("http status: standby");

これがどこから来たのか誰かが何か考えを持っていれば、それは大きな喜びです.. ? !

神経が尖ってる..

4

1 に答える 1

3

コードは HTTP/1.1 準拠を主張していますが、実際には HTTP/1.1 の要件に準拠していません。HTTP/1.1 への準拠を主張しないか、クライアントが行う必要があると標準で規定されているすべてのことをコードで行うようにしてください。

すべての HTTP/1.1 アプリケーションは、「チャンク化された」転送コーディングを受信して​​デコードできなければならず (MUST)、理解できないチャンク拡張拡張を無視しなければなりません (MUST)。-- HTTP/1.1 仕様、セクション 3.6.1

于 2012-08-30T16:02:34.617 に答える