HTTPS получить SSL исключение с Poco C ++: OSM Nominatim - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь сделать HTTPS-запрос на получение запроса на сервер геокодирования OpenStreetMaps Nominatim, но он дает исключение SSL, и я не могу это понять.

Типичный URL-адрес запросаэто: https://nominatim.openstreetmap.org/reverse?format=json&lat=37.325460&lon=-121.777310 которые работают в моем браузере.Это мой код:

std::string httpsGet(const std::string& hostname, int port, const  std::string& path,  const std::string& query)
{
   Poco::Net::initializeSSL();
   Poco::Net::SSLManager::InvalidCertificateHandlerPtr ptrHandler ( new    Poco::Net::AcceptCertificateHandler(false) );
   Poco::Net::Context::Ptr ptrContext ( new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH") );
   Poco::Net::SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);

   try {

     URI uri(hostname); // https://nominatim.openstreetmap.org
     uri.setPort(port); // 80
     HTTPSClientSession session(uri.getHost(),uri.getPort());


     uri.setPath(path); // reverse/
     uri.setQuery(query); // format=json&lat=37.325460&lon=-121.777310 
     std::string _path(uri.getPathAndQuery());

     // send request
      HTTPRequest req(HTTPRequest::HTTP_GET, _path, HTTPMessage::HTTP_1_1);
     req.set("user-agent", "[myemail]");
     session.sendRequest(req);

      HTTPResponse res;        
      std::istream &is = session.receiveResponse(res);
      std::stringstream ss;
      StreamCopier::copyStream(is, ss);
      return ss.str(); 
   } catch (std::exception &ex) {
      std::cout << "HTTP GET error [" << ex.what() << "]"  << std::endl;
      return "";
   }
}

Но я получаю следующую ошибку: «Исключение SSL»

Код SSL был скопирован из других сообщений StackOverlfow, предоставленных в качестве ответа, но это не такКажется, здесь работает?

1 Ответ

0 голосов
/ 30 мая 2018

Как только я написал, я осознал свою неудачу.Я использовал HTTP-порт 80, для SSL HTTPS вам нужен порт 443 (обычно).

Как только я изменил, все было в порядке.Другие сообщения SO не указывали на очевидное для слишком опытных инженеров, переключающих HTTP-код, поэтому я надеюсь, что это полезно.

...