2013-08-02 27 views
2

我想在Ubuntu Linux上使用POCO C++庫從網絡流中解壓縮文件,但解壓縮失敗,出現「非法狀態」異常。 HTTPResponse狀態和原因是302暫時移動。同時我可以通過瀏覽器下載並解壓縮鏈接。當HTTPResponse處於這種狀態時我該怎麼辦HTTPClientSessionPOCO C++庫,HTTPResponse狀態不佳

... 
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

你可以用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是怎麼做的。