Poco Zip: странная ошибка при распаковке из http потока - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь распаковать zip-файл из сети, как показано здесь .

Сбой с ошибкой:

Decompress error CRC mismatch. Corrupt file: ...

Но если я напишу ответ сервера во временный zip-файл и разархивирую его, он отлично работает. Что я делаю не так?

Рабочий код:

Poco::URI uri(host_);
HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest req(HTTPRequest::HTTP_GET, "/" + path_, HTTPMessage::HTTP_1_1);
req.setChunkedTransferEncoding(true);
session.sendRequest(req);
HTTPResponse res;

std::istream& rs = session.receiveResponse(res);

{
    std::ofstream tmpOs("./tmp.zip");

    std::copy(std::istreambuf_iterator<char>(rs), std::istreambuf_iterator<char>(),
              std::ostream_iterator<char>(tmpOs));
}

std::ifstream tmp("./tmp.zip");


Decompress dec(tmp, Poco::Path());
dec.EError += Poco::Delegate<SharingServiceDownloader, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &SharingServiceDownloader::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<SharingServiceDownloader, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &SharingServiceDownloader::onDecompressError);

Сбой с ошибкой:

Poco::URI uri(host_);
HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest req(HTTPRequest::HTTP_GET, "/" + path_, HTTPMessage::HTTP_1_1);
req.setChunkedTransferEncoding(true);
session.sendRequest(req);
HTTPResponse res;

std::istream& rs = session.receiveResponse(res);

Decompress dec(rs, Poco::Path());
dec.EError += Poco::Delegate<SharingServiceDownloader, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &SharingServiceDownloader::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<SharingServiceDownloader, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &SharingServiceDownloader::onDecompressError);

Следует отметить, что я использую chunked-кодировку на моей стороне сервера.

...