2013-08-02 2 views
2

Ubuntu Linux에서 POCO C++ 라이브러리를 사용하여 네트워크 스트림에서 파일의 압축을 풀려고하지만 "잘못된 상태"예외로 압축 풀기가 실패합니다. HTTPResponse 상태 및 이유는 302 임시 이동입니다. 동시에 나는 브라우저로 링크를 다운로드하고 압축을 풀 수있다. HTTPResponse과 같은 상태 일 때 HTTPClientSession으로 무엇을해야합니까?POCO C++ 라이브러리, HTTP 응답 상태 불량

... 
HTTPResponse res; 
    std::istream& rs = h_ses.receiveResponse (res); 
    if (res.getStatus() != HTTPResponse::HTTP_OK) { 
    poco_error (logger, "http response status: " + std::to_string (res.getStatus()) + " " + res.getReason()); 
    } 
    if (!rs) { 
    poco_error (logger, "responese stream is in bad state: " + std::to_string (rs.rdstate())); 
    } 
    Decompress dec (rs, target_dir_.native()); 
    poco_debug (logger, "Unzipping: " + dl + " ..."); 

    dec.EError += Poco::Delegate<Addon_Loader, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &Addon_Loader::on_decompress_error); 
    dec.decompressAllFiles(); 
    ... 

답변

1

302 응답하여, 새로운 위치를 가리키는 헤더 필드가 있어야한다. 대신에 그 링크를 따라 가면됩니다.

this link 또는 this Wikipedia page이고 실제로는 HTTP 1.1 RFC입니다.

1

HTTPStreamFactory로 할 수 있습니다.

#include "Poco/URI.h" 
#include "Poco/URIStreamOpener.h" 
#include "Poco/Net/HTTPStreamFactory.h" 
#include "Poco/StreamCopier.h" 
#include <iostream> 
#include <memory> 

using namespace Poco; 
using namespace Poco::Net; 

int main() 
{ 
     URIStreamOpener opener; 
     opener.registerStreamFactory("http", new HTTPStreamFactory); 
     URI uri("http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F"); 
     std::auto_ptr<std::istream> pStr(opener.open(uri)); 
     StreamCopier::copyStream(*pStr.get(), std::cout); 
     return 0; 
} 

당신이 HTTPClientSession를 사용하는 경우, HTTPStreamFactory 그것을 수행하는 방법을 살펴 : 여기에 전체 예입니다.

관련 문제