Библиотека POCO C++, неверный статус HTTPResponse

Я пытаюсь разархивировать файл из сетевого потока, используя библиотеку POCO C++ в Ubuntu Linux, но распаковка завершается с ошибкой с исключением «Недопустимое состояние». HTTPResponse статус и причина: 302 Временно перемещен. В то же время я могу скачать и разархивировать ссылку с помощью браузера. Что мне делать с HTTPClientSession, когда 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 ();
  ...

person Victor    schedule 02.08.2013    source источник


Ответы (2)


Вы можете сделать это с помощью 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 делает это.

person Alex    schedule 15.11.2015

В ответе 302 должно быть поле заголовка, указывающее новое местоположение. Вместо этого вам просто нужно перейти по этой ссылке.

См., например. эта ссылка или эта страница Википедии и, конечно же, фактическая HTTP 1.1 RFC.

person Some programmer dude    schedule 02.08.2013