void TCPServerTest::testReuseSession() { // ensure OpenSSL machinery is fully setup Context::Ptr pDefaultServerContext = SSLManager::instance().defaultServerContext(); Context::Ptr pDefaultClientContext = SSLManager::instance().defaultClientContext(); Context::Ptr pServerContext = new Context( Context::SERVER_USE, Application::instance().config().getString("openSSL.server.privateKeyFile"), Application::instance().config().getString("openSSL.server.privateKeyFile"), Application::instance().config().getString("openSSL.server.caConfig"), Context::VERIFY_NONE, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); pServerContext->enableSessionCache(true, "TestSuite"); pServerContext->setSessionTimeout(10); pServerContext->setSessionCacheSize(1000); pServerContext->disableStatelessSessionResumption(); SecureServerSocket svs(0, 64, pServerContext); TCPServer srv(new TCPServerConnectionFactoryImpl<EchoConnection>(), svs); srv.start(); assert (srv.currentConnections() == 0); assert (srv.currentThreads() == 0); assert (srv.queuedConnections() == 0); assert (srv.totalConnections() == 0); Context::Ptr pClientContext = new Context( Context::SERVER_USE, Application::instance().config().getString("openSSL.client.privateKeyFile"), Application::instance().config().getString("openSSL.client.privateKeyFile"), Application::instance().config().getString("openSSL.client.caConfig"), Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); pClientContext->enableSessionCache(true); SocketAddress sa("localhost", svs.address().port()); SecureStreamSocket ss1(sa, pClientContext); assert (!ss1.sessionWasReused()); std::string data("hello, world"); ss1.sendBytes(data.data(), (int) data.size()); char buffer[256]; int n = ss1.receiveBytes(buffer, sizeof(buffer)); assert (n > 0); assert (std::string(buffer, n) == data); assert (srv.currentConnections() == 1); assert (srv.currentThreads() == 1); assert (srv.queuedConnections() == 0); assert (srv.totalConnections() == 1); Session::Ptr pSession = ss1.currentSession(); ss1.close(); Thread::sleep(300); assert (srv.currentConnections() == 0); ss1.useSession(pSession); ss1.connect(sa); assert (ss1.sessionWasReused()); assert (ss1.currentSession() == pSession); ss1.sendBytes(data.data(), (int) data.size()); n = ss1.receiveBytes(buffer, sizeof(buffer)); assert (n > 0); assert (std::string(buffer, n) == data); assert (srv.currentConnections() == 1); assert (srv.queuedConnections() == 0); assert (srv.totalConnections() == 2); ss1.close(); Thread::sleep(300); assert (srv.currentConnections() == 0); Thread::sleep(15000); // wait for session to expire pServerContext->flushSessionCache(); ss1.useSession(pSession); ss1.connect(sa); assert (!ss1.sessionWasReused()); assert (ss1.currentSession() != pSession); ss1.sendBytes(data.data(), (int) data.size()); n = ss1.receiveBytes(buffer, sizeof(buffer)); assert (n > 0); assert (std::string(buffer, n) == data); assert (srv.currentConnections() == 1); assert (srv.queuedConnections() == 0); assert (srv.totalConnections() == 3); ss1.close(); Thread::sleep(300); assert (srv.currentConnections() == 0); }
void HTTPSClientSessionTest::testCachedSession() { // ensure OpenSSL machinery is fully setup Context::Ptr pDefaultServerContext = SSLManager::instance().defaultServerContext(); Context::Ptr pDefaultClientContext = SSLManager::instance().defaultClientContext(); Context::Ptr pServerContext = new Context( Context::SERVER_USE, Application::instance().config().getString("openSSL.server.privateKeyFile"), Application::instance().config().getString("openSSL.server.privateKeyFile"), Application::instance().config().getString("openSSL.server.caConfig"), Context::VERIFY_NONE, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); pServerContext->enableSessionCache(true, "TestSuite"); pServerContext->setSessionTimeout(10); pServerContext->setSessionCacheSize(1000); pServerContext->disableStatelessSessionResumption(); HTTPSTestServer srv(pServerContext); Context::Ptr pClientContext = new Context( Context::CLIENT_USE, Application::instance().config().getString("openSSL.client.privateKeyFile"), Application::instance().config().getString("openSSL.client.privateKeyFile"), Application::instance().config().getString("openSSL.client.caConfig"), Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); pClientContext->enableSessionCache(true); HTTPSClientSession s1("127.0.0.1", srv.port(), pClientContext); HTTPRequest request1(HTTPRequest::HTTP_GET, "/small"); s1.sendRequest(request1); Session::Ptr pSession1 = s1.sslSession(); HTTPResponse response1; std::istream& rs1 = s1.receiveResponse(response1); assert (response1.getContentLength() == HTTPSTestServer::SMALL_BODY.length()); assert (response1.getContentType() == "text/plain"); std::ostringstream ostr1; StreamCopier::copyStream(rs1, ostr1); assert (ostr1.str() == HTTPSTestServer::SMALL_BODY); HTTPSClientSession s2("127.0.0.1", srv.port(), pClientContext, pSession1); HTTPRequest request2(HTTPRequest::HTTP_GET, "/small"); s2.sendRequest(request2); Session::Ptr pSession2 = s2.sslSession(); HTTPResponse response2; std::istream& rs2 = s2.receiveResponse(response2); assert (response2.getContentLength() == HTTPSTestServer::SMALL_BODY.length()); assert (response2.getContentType() == "text/plain"); std::ostringstream ostr2; StreamCopier::copyStream(rs2, ostr2); assert (ostr2.str() == HTTPSTestServer::SMALL_BODY); assert (pSession1 == pSession2); HTTPRequest request3(HTTPRequest::HTTP_GET, "/small"); s2.sendRequest(request3); Session::Ptr pSession3 = s2.sslSession(); HTTPResponse response3; std::istream& rs3 = s2.receiveResponse(response3); assert (response3.getContentLength() == HTTPSTestServer::SMALL_BODY.length()); assert (response3.getContentType() == "text/plain"); std::ostringstream ostr3; StreamCopier::copyStream(rs3, ostr3); assert (ostr3.str() == HTTPSTestServer::SMALL_BODY); assert (pSession1 == pSession3); Thread::sleep(15000); // wait for session to expire pServerContext->flushSessionCache(); HTTPRequest request4(HTTPRequest::HTTP_GET, "/small"); s2.sendRequest(request4); Session::Ptr pSession4 = s2.sslSession(); HTTPResponse response4; std::istream& rs4 = s2.receiveResponse(response4); assert (response4.getContentLength() == HTTPSTestServer::SMALL_BODY.length()); assert (response4.getContentType() == "text/plain"); std::ostringstream ostr4; StreamCopier::copyStream(rs4, ostr4); assert (ostr4.str() == HTTPSTestServer::SMALL_BODY); assert (pSession1 != pSession4); }