Poco :: Net :: HTTPClientSession генерирует исключение без unique_ptr - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 2 версии кода:

    // HTTP.h
    class HTTP
    {
    private:
      //unique_ptr<HTTPClientSession> session;
      HTTPClientSession session;

      bool doRequest(Poco::Net::HTTPRequest& request, const string& path, const string& content, string& responseBody);
    public:
      HTTP(const string& adress);
    }

    // HTTP.cpp

    HTTP::HTTP(const string& adress)
    {
      Poco::URI uri(
        adress.substr(0, 4) == "http" ? adress : "http://" + adress
      );
      //session = make_unique<HTTPClientSession>(uri.getHost(), uri.getPort());
      HTTPClientSession session{ uri.getHost(), uri.getPort() };
    }

    bool HTTP::doRequest(HTTPRequest& request, const string& path, const string& content, string& responseBody) {
      ...
      session.setTimeout(Timespan(5, 0));
      //std::ostream& requestStream = session->sendRequest(request);
      std::ostream& requestStream = session.sendRequest(request);
      ...
    }

Если я использую unique_ptr для создания объекта сеанса, как в закомментированном коде, все будет хорошо.

Но если я использую только простые переменные, как в текущей версии.Тогда строка

session.sendRequest (запрос)

исключение выброса Соединение отклонено

Я не понимаю, почему?Не могли бы вы объяснить, пожалуйста.

PS запрос это простой HTTP GET запрос к статическому ресурсу.

1 Ответ

0 голосов
/ 03 марта 2019
HTTP::HTTP(const string& adress)
{
  Poco::URI uri(
    adress.substr(0, 4) == "http" ? adress : "http://" + adress
  );

  HTTPClientSession session{ uri.getHost(), uri.getPort() };
}

Последняя строка в этом конструкторе создает локальную переменную с именем session, ..., которая немедленно уничтожается при возвращении конструктора и не имеет ничего общего с членом класса того же члена.

Итак, когда все сказано и сделано, член session этого экземпляра класса остается неинициализированным.Для сравнения:

session = HTTPClientSession{ uri.getHost(), uri.getPort() };

Вместо этого будет правильно инициализирован член класса, как и было очевидно.Однако, поскольку HTTPClientSession не имеет пригодного для использования оператора присваивания, вы можете либо продолжить использовать unique_ptr, либо реструктурировать конструктор, чтобы он создавал член класса в своем списке инициализатора.

...