Ошибка w / C ++ poco и HTTPSStreamFactory - PullRequest
0 голосов
/ 16 июля 2010

Я пытаюсь создать приложение C ++ для доступа к ресурсу XML. Используя http, код работает нормально, из того, что я могу сказать из документации, все, что мне нужно сделать для работы https, - это убедиться, что ssl установлен (да, версия dev установлена) и изменить StreamFactory на HTTPSStreamFactory.

Вот код, который работает:

Poco::Net::HTTPStreamFactory::registerFactory();
Poco::URI uri(argv[1]);

std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
std::string str;      
StreamCopier::copyToString(*pStr.get(), str);

Вот код, который не работает Poco :: Net :: HTTPSStreamFactory :: registerFactory (); Poco :: URI uri (argv [1]);

std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
std::string str;      
StreamCopier::copyToString(*pStr.get(), str);

Когда я делаю запрос с HTTPSStreamFactory, я получаю сообщение об ошибке:

Указатель NULL: _pInstance [в файле "/Home/chpick/poco-1.3.6p2/Util/include/Poco/Util/Application.h", строка 422]

Я приложил заявку. H

inline Application& Application::instance()
{
    poco_check_ptr (_pInstance);
    return *_pInstance;
}

Любая помощь будет великолепна. Спасибо

Ответы [ 2 ]

1 голос
/ 20 июля 2010

В итоге я пошел по-другому: вот что я сделал.

    const Poco::URI uri(xmlParams.restURI);
    std::string path(argv[1]);
    const Poco::Net::Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
    Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), context );
    Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, argv[1] );
    req.setKeepAlive(false);

  std::string strToSend = "/";
    session.sendRequest(req) << strToSend;
    Poco::Net::HTTPResponse res;
    std::istream& rs = session.receiveResponse(res);    // typedef std::istream XMLCharInputStream;

    std::string str;    
    StreamCopier::copyToString(rs, str);

    std::istringstream istr(str);
    InputSource source(istr);
    parser.parse(&source);
1 голос
/ 16 июля 2010

Проверьте документацию на предмет соответствия сертификату проверки.Видите ли, SSL работает сервером и клиентом, обменивающимся сертификатами, и в каждой библиотеке, которую я использовал, которая использует SSL, разработчик должен создать функцию или каким-либо другим способом проверить сертификат, отправленный сервером;что обычно означает, что разработчик просто принимает что-либо без проверки, потому что большинство людей на самом деле не заботятся об этом.Ваша программа может быть с ошибкой сегмента, потому что этот код вызывается, и ничего не возвращается, поэтому разыменовывается нулевой объект или что-то в этом роде.

...