2012-08-30 101 views
0

我寫了一個Http/Rest客戶端。Boost Asio收到未知電話號碼?

主要問題是我收到了一些未知的數字在請求的數據。 我真的鴕鳥政策知道他們來自哪裏..

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

你看e0b和底。 在例如大的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"); 

這將是一個非常高興,如果有人有任何想法這個地方來自..?!

我的神經是在邊緣..

回答

3

您的代碼聲稱HTTP/1.1合規性和實際不符合HTTP/1.1的要求。要麼不要求遵守HTTP/1.1規範,要麼確保你的代碼完成標準所說的客戶必須做的一切。

所有HTTP/1.1應用程序必須能夠接收和解碼「分塊」的傳輸編碼,並且必須忽略它們不理解的塊擴展擴展。 - HTTP/1.1 specification, section 3.6.1

+0

你是怎麼看到它聲稱HTTP/1.1的?你用這個簡單的聲明讓我的一天變得如此。 –

+0

除非你聲稱HTTP/1.1或服務器壞了,否則你不會得到分塊編碼。前者似乎更可能。 (另外,當你看到相同的問題832次,你有一個很好的主意,通常會導致它。) –