如何重用Poco :: Net :: HTTPSClientSession

时间:2018-01-10 09:37:04

标签: c++11 https openssl poco-libraries

我已经声明了一个类Input_output_class()

的静态成员变量

Session :: Ptr c_pSecureSession = nullptr;

对于每个请求GET / PUT / DELETE / HEAD,我必须创建一个Input_output_class()类的对象。在类的成员函数中 我正在创建一个如下会话 函数Get()

{
if(c_pSecureSession)
{
    s_sess = HTTPSClientSession(host, port, pContext, c_pSecureSession); 
}
else
{
   s_sess = HTTPSClientSession(host, port, pContext);
}
 //pContext is a defaultClientContext from singleton Poco::Net::SSLManager 

s_sess->sendRequest(request);
c_pSecureSession = s_sess->sslSession();
cout <<" c_pSecureSession " << c_pSecureSession <<endl;

//Handle response below

 }

SSL MANAGER Singleton初始化代码 ------

{
Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> ptrHandler = new Poco::Net::AcceptCertificateHandler(false);
Poco::Net::Context::Ptr ptrContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "");
ptrContext->enableSessionCache(true);
Poco::Net::SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);

}

我看到该会话没有被重用,我正在为每个请求获取一个新的c_pSecureSession指针。

你能帮我解决一下如何使用会话缓存..

感谢。

1 个答案:

答案 0 :(得分:0)

首先,基础知识 - c_pSecureSessionPoco::AutoPtr,因此每次都会有不同的实例。然而,底层裸指针将始终是相同的 - 这是智能指针范例背后的想法 - 许多智能指针包裹一个“裸”指针。

从您发布的代码中不清楚您如何“重复使用”nullptr Session - 为此,您必须先手动创建Session (但是,如果你还没有套接字?),或者首先创建一个HTTPSClientSession,然后从那里获取后续的(可行的)。

但是,让我们简单一点 - 您不需要c_pSecureSession而且您不需要为每个请求重新创建会话 - 只创建一次:

s_sess = HTTPSClientSession(host, port, pContext);

由于您已经为上下文启用了缓存,s_sess中的基础会话将被重用,只需从中发送/接收。

请注意,为了缓存会话,还必须在服务器端启用缓存,并且会话也可能具有到期时间 - 如果基础会话到期,将自动重新创建新的。

有关如何处理会话的示例,请参阅testCachedSession