4 #include <QSslCertificate>
5 #include <QSslConfiguration>
8 #include "httpconnectionhandlerpool.h"
10 using namespace stefanfrings;
15 Q_ASSERT(settings!=0);
16 this->settings=settings;
17 this->requestHandler=requestHandler;
18 this->sslConfiguration=NULL;
20 cleanupTimer.start(settings->value(
"cleanupInterval",1000).toInt());
21 connect(&cleanupTimer, SIGNAL(timeout()), SLOT(cleanup()));
32 delete sslConfiguration;
33 qDebug(
"HttpConnectionHandlerPool (%p): destroyed",
this);
54 int maxConnectionHandlers=settings->value(
"maxThreads",100).toInt();
55 if (pool.count()<maxConnectionHandlers)
59 pool.append(freeHandler);
67 void HttpConnectionHandlerPool::cleanup()
69 int maxIdleHandlers=settings->value(
"minThreads",1).toInt();
76 if (++idleCounter > maxIdleHandlers)
79 pool.removeOne(handler);
80 long int poolSize=(
long int)pool.size();
81 qDebug(
"HttpConnectionHandlerPool: Removed connection handler (%p), pool size is now %li",handler,poolSize);
90 void HttpConnectionHandlerPool::loadSslConfig()
93 QString sslKeyFileName=settings->value(
"sslKeyFile",
"").toString();
94 QString sslCertFileName=settings->value(
"sslCertFile",
"").toString();
95 QString caCertFileName=settings->value(
"caCertFile",
"").toString();
96 bool verifyPeer=settings->value(
"verifyPeer",
"false").toBool();
98 if (!sslKeyFileName.isEmpty() && !sslCertFileName.isEmpty())
101 qWarning(
"HttpConnectionHandlerPool: SSL is not supported");
104 QFileInfo configFile(settings->fileName());
106 if (QDir::isRelativePath(sslKeyFileName) && settings->format()!=QSettings::NativeFormat)
108 if (QDir::isRelativePath(sslKeyFileName))
111 sslKeyFileName=QFileInfo(configFile.absolutePath(),sslKeyFileName).absoluteFilePath();
115 if (QDir::isRelativePath(sslCertFileName) && settings->format()!=QSettings::NativeFormat)
117 if (QDir::isRelativePath(sslCertFileName))
120 sslCertFileName=QFileInfo(configFile.absolutePath(),sslCertFileName).absoluteFilePath();
124 QFile certFile(sslCertFileName);
125 if (!certFile.open(QIODevice::ReadOnly))
127 qCritical(
"HttpConnectionHandlerPool: cannot open sslCertFile %s", qPrintable(sslCertFileName));
130 QSslCertificate certificate(&certFile, QSsl::Pem);
134 QFile keyFile(sslKeyFileName);
135 if (!keyFile.open(QIODevice::ReadOnly))
137 qCritical(
"HttpConnectionHandlerPool: cannot open sslKeyFile %s", qPrintable(sslKeyFileName));
140 QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem);
144 sslConfiguration=
new QSslConfiguration();
145 sslConfiguration->setProtocol(QSsl::AnyProtocol);
146 sslConfiguration->setLocalCertificate(certificate);
147 sslConfiguration->setPrivateKey(sslKey);
150 if (!caCertFileName.isEmpty())
152 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
153 qCritical(
"HttpConnectionHandlerPool: Using a caCertFile requires Qt 5.15 or newer");
158 if (QDir::isRelativePath(sslCaCertFileName) && settings->format()!=QSettings::NativeFormat)
160 if (QDir::isRelativePath(caCertFileName))
163 caCertFileName=QFileInfo(configFile.absolutePath(),caCertFileName).absoluteFilePath();
167 QFile caCertFile(caCertFileName);
168 if (!caCertFile.open(QIODevice::ReadOnly))
170 qCritical(
"HttpConnectionHandlerPool: cannot open caCertFile %s", qPrintable(caCertFileName));
173 QSslCertificate caCertificate(&caCertFile, QSsl::Pem);
177 sslConfiguration->addCaCertificate(caCertificate);
184 sslConfiguration->setPeerVerifyMode(QSslSocket::VerifyPeer);
188 sslConfiguration->setPeerVerifyMode(QSslSocket::VerifyNone);
191 qDebug(
"HttpConnectionHandlerPool: SSL settings loaded");
virtual ~HttpConnectionHandlerPool()
Destructor.
HttpConnectionHandlerPool(const QSettings *settings, HttpRequestHandler *requestHandler)
Constructor.
HttpConnectionHandler * getConnectionHandler()
Get a free connection handler, or 0 if not available.
Alias for QSslConfiguration if OpenSSL is not supported.
bool isBusy()
Returns true, if this handler is in use.
void setBusy()
Mark this handler as busy.
The request handler generates a response for each HTTP request.