mirror of
https://github.com/YACReader/yacreader
synced 2025-05-28 03:10:27 -04:00
Update QtWebApp to v1.8.6
This commit is contained in:
parent
083888efde
commit
2e72e428ba
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
Version counting is based on semantic versioning (Major.Feature.Patch)
|
Version counting is based on semantic versioning (Major.Feature.Patch)
|
||||||
|
|
||||||
|
## 9.9.3 [unreleased]
|
||||||
|
|
||||||
|
### YACReaderLibrary
|
||||||
|
* Update QtWebApp webserver to v1.8.6
|
||||||
## 9.9.2
|
## 9.9.2
|
||||||
|
|
||||||
### General
|
### General
|
||||||
|
@ -44,7 +44,10 @@ namespace stefanfrings {
|
|||||||
</pre></code>
|
</pre></code>
|
||||||
<p>
|
<p>
|
||||||
The readTimeout value defines the maximum time to wait for a complete HTTP request.
|
The readTimeout value defines the maximum time to wait for a complete HTTP request.
|
||||||
@see HttpRequest for description of config settings maxRequestSize and maxMultiPartSize.
|
<p>
|
||||||
|
MaxRequestSize is the maximum size of a HTTP request. In case of
|
||||||
|
multipart/form-data requests (also known as file-upload), the maximum
|
||||||
|
size of the body must not exceed maxMultiPartSize.
|
||||||
*/
|
*/
|
||||||
class DECLSPEC HttpConnectionHandler : public QObject {
|
class DECLSPEC HttpConnectionHandler : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -92,6 +92,9 @@ void HttpConnectionHandlerPool::loadSslConfig()
|
|||||||
// If certificate and key files are configured, then load them
|
// If certificate and key files are configured, then load them
|
||||||
QString sslKeyFileName=settings->value("sslKeyFile","").toString();
|
QString sslKeyFileName=settings->value("sslKeyFile","").toString();
|
||||||
QString sslCertFileName=settings->value("sslCertFile","").toString();
|
QString sslCertFileName=settings->value("sslCertFile","").toString();
|
||||||
|
QString caCertFileName=settings->value("caCertFile","").toString();
|
||||||
|
bool verifyPeer=settings->value("verifyPeer","false").toBool();
|
||||||
|
|
||||||
if (!sslKeyFileName.isEmpty() && !sslCertFileName.isEmpty())
|
if (!sslKeyFileName.isEmpty() && !sslCertFileName.isEmpty())
|
||||||
{
|
{
|
||||||
#ifdef QT_NO_SSL
|
#ifdef QT_NO_SSL
|
||||||
@ -107,6 +110,7 @@ void HttpConnectionHandlerPool::loadSslConfig()
|
|||||||
{
|
{
|
||||||
sslKeyFileName=QFileInfo(configFile.absolutePath(),sslKeyFileName).absoluteFilePath();
|
sslKeyFileName=QFileInfo(configFile.absolutePath(),sslKeyFileName).absoluteFilePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
if (QDir::isRelativePath(sslCertFileName) && settings->format()!=QSettings::NativeFormat)
|
if (QDir::isRelativePath(sslCertFileName) && settings->format()!=QSettings::NativeFormat)
|
||||||
#else
|
#else
|
||||||
@ -138,10 +142,51 @@ void HttpConnectionHandlerPool::loadSslConfig()
|
|||||||
|
|
||||||
// Create the SSL configuration
|
// Create the SSL configuration
|
||||||
sslConfiguration=new QSslConfiguration();
|
sslConfiguration=new QSslConfiguration();
|
||||||
|
sslConfiguration->setProtocol(QSsl::AnyProtocol);
|
||||||
sslConfiguration->setLocalCertificate(certificate);
|
sslConfiguration->setLocalCertificate(certificate);
|
||||||
sslConfiguration->setPrivateKey(sslKey);
|
sslConfiguration->setPrivateKey(sslKey);
|
||||||
|
|
||||||
|
// We can optionally use a CA certificate to validate the HTTP clients
|
||||||
|
if (!caCertFileName.isEmpty())
|
||||||
|
{
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
|
qCritical("HttpConnectionHandlerPool: Using a caCertFile requires Qt 5.15 or newer");
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Convert relative fileName to absolute, based on the directory of the config file.
|
||||||
|
#ifdef Q_OS_WIN32
|
||||||
|
if (QDir::isRelativePath(caCertFileName) && settings->format()!=QSettings::NativeFormat)
|
||||||
|
#else
|
||||||
|
if (QDir::isRelativePath(caCertFileName))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
caCertFileName=QFileInfo(configFile.absolutePath(),caCertFileName).absoluteFilePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the CA cert file
|
||||||
|
QFile caCertFile(caCertFileName);
|
||||||
|
if (!caCertFile.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
qCritical("HttpConnectionHandlerPool: cannot open caCertFile %s", qPrintable(caCertFileName));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QSslCertificate caCertificate(&caCertFile, QSsl::Pem);
|
||||||
|
caCertFile.close();
|
||||||
|
|
||||||
|
// Configure SSL
|
||||||
|
sslConfiguration->addCaCertificate(caCertificate);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable or disable verification of the HTTP client
|
||||||
|
if (verifyPeer)
|
||||||
|
{
|
||||||
|
sslConfiguration->setPeerVerifyMode(QSslSocket::VerifyPeer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sslConfiguration->setPeerVerifyMode(QSslSocket::VerifyNone);
|
sslConfiguration->setPeerVerifyMode(QSslSocket::VerifyNone);
|
||||||
sslConfiguration->setProtocol(QSsl::AnyProtocol);
|
}
|
||||||
|
|
||||||
qDebug("HttpConnectionHandlerPool: SSL settings loaded");
|
qDebug("HttpConnectionHandlerPool: SSL settings loaded");
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,33 +16,69 @@ namespace stefanfrings {
|
|||||||
<p>
|
<p>
|
||||||
Example for the required configuration settings:
|
Example for the required configuration settings:
|
||||||
<code><pre>
|
<code><pre>
|
||||||
|
readTimeout=60000
|
||||||
|
maxRequestSize=16000
|
||||||
|
maxMultiPartSize=1000000
|
||||||
|
|
||||||
minThreads=4
|
minThreads=4
|
||||||
maxThreads=100
|
maxThreads=100
|
||||||
cleanupInterval=60000
|
cleanupInterval=60000
|
||||||
readTimeout=60000
|
|
||||||
;sslKeyFile=ssl/my.key
|
|
||||||
;sslCertFile=ssl/my.cert
|
|
||||||
maxRequestSize=16000
|
|
||||||
maxMultiPartSize=1000000
|
|
||||||
</pre></code>
|
</pre></code>
|
||||||
|
<p>
|
||||||
|
The readTimeout value defines the maximum time to wait for a complete HTTP request.
|
||||||
|
<p>
|
||||||
|
MaxRequestSize is the maximum size of a HTTP request. In case of
|
||||||
|
multipart/form-data requests (also known as file-upload), the maximum
|
||||||
|
size of the body must not exceed maxMultiPartSize.
|
||||||
|
<p>
|
||||||
After server start, the size of the thread pool is always 0. Threads
|
After server start, the size of the thread pool is always 0. Threads
|
||||||
are started on demand when requests come in. The cleanup timer reduces
|
are started on demand when requests come in. The cleanup timer reduces
|
||||||
the number of idle threads slowly by closing one thread in each interval.
|
the number of idle threads slowly by closing one thread in each interval.
|
||||||
But the configured minimum number of threads are kept running.
|
But the configured minimum number of threads are kept running.
|
||||||
<p>
|
<p>
|
||||||
For SSL support, you need an OpenSSL certificate file and a key file.
|
Additional settings for SSL (HTTPS):
|
||||||
Both can be created with the command
|
|
||||||
<code><pre>
|
<code><pre>
|
||||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout my.key -out my.cert
|
sslKeyFile=ssl/server.key
|
||||||
|
sslCertFile=ssl/server.crt
|
||||||
|
;caCertFile=ssl/ca.crt
|
||||||
|
verifyPeer=false
|
||||||
|
</pre></code>
|
||||||
|
For SSL support, you need at least a pair of OpenSSL x509 certificate and an RSA key,
|
||||||
|
both files in PEM format. To enable verification of the peer (the calling web browser),
|
||||||
|
you can either use the central certificate store of the operating system, or provide
|
||||||
|
a CA certificate file in PEM format. The certificates of the peers must have been
|
||||||
|
derived from the CA certificate.
|
||||||
|
<p>
|
||||||
|
Example commands to create these files:
|
||||||
|
<code><pre>
|
||||||
|
# Generate CA key
|
||||||
|
openssl genrsa 2048 > ca.key
|
||||||
|
|
||||||
|
# Generate CA certificate
|
||||||
|
openssl req -new -x509 -nodes -days 365000 -key ca.key -out ca.crt
|
||||||
|
|
||||||
|
# Generate a server key and certificate request
|
||||||
|
openssl req -newkey rsa:2048 -nodes -days 365000 -keyout server.key -out server.req
|
||||||
|
|
||||||
|
# Generate a signed server certificate
|
||||||
|
openssl x509 -req -days 365000 -set_serial 01 -in server.req -out server.crt -CA ca.crt -CAkey ca.key
|
||||||
|
|
||||||
|
# Generate a client key and certificate request
|
||||||
|
openssl req -newkey rsa:2048 -nodes -days 365000 -keyout client.key -out client.req
|
||||||
|
|
||||||
|
# Generate a signed client certificate
|
||||||
|
openssl x509 -req -days 365000 -set_serial 01 -in client.req -out client.crt -CA ca.crt -CAkey ca.key
|
||||||
|
|
||||||
|
# Combine client key and certificate into one PKCS12 file
|
||||||
|
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -certfile ca.crt
|
||||||
|
|
||||||
|
# Remove temporary files
|
||||||
|
rm *.req
|
||||||
</pre></code>
|
</pre></code>
|
||||||
<p>
|
<p>
|
||||||
Visit http://slproweb.com/products/Win32OpenSSL.html to download the Light version of OpenSSL for Windows.
|
Please note that a listener with SSL can only handle HTTPS protocol. To support both
|
||||||
<p>
|
HTTP and HTTPS simultaneously, you need to start <b>two</b> listeners on different ports
|
||||||
Please note that a listener with SSL settings can only handle HTTPS protocol. To
|
one with SLL and one without SSL (usually on public ports 80 and 443, or locally on 8080 and 8443).
|
||||||
support both HTTP and HTTPS simultaneously, you need to start two listeners on different ports -
|
|
||||||
one with SLL and one without SSL.
|
|
||||||
@see HttpConnectionHandler for description of the readTimeout
|
|
||||||
@see HttpRequest for description of config settings maxRequestSize and maxMultiPartSize
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class DECLSPEC HttpConnectionHandlerPool : public QObject {
|
class DECLSPEC HttpConnectionHandlerPool : public QObject {
|
||||||
@ -54,7 +90,6 @@ public:
|
|||||||
Constructor.
|
Constructor.
|
||||||
@param settings Configuration settings for the HTTP server. Must not be 0.
|
@param settings Configuration settings for the HTTP server. Must not be 0.
|
||||||
@param requestHandler The handler that will process each received HTTP request.
|
@param requestHandler The handler that will process each received HTTP request.
|
||||||
@warning The requestMapper gets deleted by the destructor of this pool
|
|
||||||
*/
|
*/
|
||||||
HttpConnectionHandlerPool(const QSettings* settings, HttpRequestHandler *requestHandler);
|
HttpConnectionHandlerPool(const QSettings* settings, HttpRequestHandler *requestHandler);
|
||||||
|
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
const char* getQtWebAppLibVersion()
|
const char* getQtWebAppLibVersion()
|
||||||
{
|
{
|
||||||
return "1.8.3";
|
return "1.8.6";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
third_party/QtWebApp/httpserver/httpglobal.h
vendored
4
third_party/QtWebApp/httpserver/httpglobal.h
vendored
@ -23,5 +23,9 @@
|
|||||||
/** Get the library version number */
|
/** Get the library version number */
|
||||||
DECLSPEC const char* getQtWebAppLibVersion();
|
DECLSPEC const char* getQtWebAppLibVersion();
|
||||||
|
|
||||||
|
#if __cplusplus < 201103L
|
||||||
|
#define nullptr 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // HTTPGLOBAL_H
|
#endif // HTTPGLOBAL_H
|
||||||
|
|
||||||
|
35
third_party/QtWebApp/httpserver/httplistener.h
vendored
35
third_party/QtWebApp/httpserver/httplistener.h
vendored
@ -24,21 +24,34 @@ namespace stefanfrings {
|
|||||||
<code><pre>
|
<code><pre>
|
||||||
;host=192.168.0.100
|
;host=192.168.0.100
|
||||||
port=8080
|
port=8080
|
||||||
|
|
||||||
|
readTimeout=60000
|
||||||
|
maxRequestSize=16000
|
||||||
|
maxMultiPartSize=1000000
|
||||||
|
|
||||||
minThreads=1
|
minThreads=1
|
||||||
maxThreads=10
|
maxThreads=10
|
||||||
cleanupInterval=1000
|
cleanupInterval=1000
|
||||||
readTimeout=60000
|
|
||||||
;sslKeyFile=ssl/my.key
|
;sslKeyFile=ssl/server.key
|
||||||
;sslCertFile=ssl/my.cert
|
;sslCertFile=ssl/server.crt
|
||||||
maxRequestSize=16000
|
;caCertFile=ssl/ca.crt
|
||||||
maxMultiPartSize=1000000
|
;verifyPeer=false
|
||||||
</pre></code>
|
</pre></code>
|
||||||
The optional host parameter binds the listener to one network interface.
|
The optional host parameter binds the listener to a specific network interface,
|
||||||
The listener handles all network interfaces if no host is configured.
|
otherwise the server accepts connections from any network interface on the given port.
|
||||||
The port number specifies the incoming TCP port that this listener listens to.
|
<p>
|
||||||
@see HttpConnectionHandlerPool for description of config settings minThreads, maxThreads, cleanupInterval and ssl settings
|
The readTimeout value defines the maximum time to wait for a complete HTTP request.
|
||||||
@see HttpConnectionHandler for description of the readTimeout
|
<p>
|
||||||
@see HttpRequest for description of config settings maxRequestSize and maxMultiPartSize
|
MaxRequestSize is the maximum size of a HTTP request. In case of
|
||||||
|
multipart/form-data requests (also known as file-upload), the maximum
|
||||||
|
size of the body must not exceed maxMultiPartSize.
|
||||||
|
<p>
|
||||||
|
After server start, the size of the thread pool is always 0. Threads
|
||||||
|
are started on demand when requests come in. The cleanup timer reduces
|
||||||
|
the number of idle threads slowly by closing one thread in each interval.
|
||||||
|
But the configured minimum number of threads are kept running.
|
||||||
|
@see HttpConnectionHandlerPool for description of the optional ssl settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class DECLSPEC HttpListener : public QTcpServer {
|
class DECLSPEC HttpListener : public QTcpServer {
|
||||||
|
@ -23,7 +23,7 @@ namespace stefanfrings {
|
|||||||
from a TCP socket and provides getters for the individual parts
|
from a TCP socket and provides getters for the individual parts
|
||||||
of the request.
|
of the request.
|
||||||
<p>
|
<p>
|
||||||
The follwing config settings are required:
|
The following config settings are required:
|
||||||
<code><pre>
|
<code><pre>
|
||||||
maxRequestSize=16000
|
maxRequestSize=16000
|
||||||
maxMultiPartSize=1000000
|
maxMultiPartSize=1000000
|
||||||
@ -32,7 +32,6 @@ namespace stefanfrings {
|
|||||||
MaxRequestSize is the maximum size of a HTTP request. In case of
|
MaxRequestSize is the maximum size of a HTTP request. In case of
|
||||||
multipart/form-data requests (also known as file-upload), the maximum
|
multipart/form-data requests (also known as file-upload), the maximum
|
||||||
size of the body must not exceed maxMultiPartSize.
|
size of the body must not exceed maxMultiPartSize.
|
||||||
The body is always a little larger than the file itself.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class DECLSPEC HttpRequest {
|
class DECLSPEC HttpRequest {
|
||||||
|
@ -53,7 +53,7 @@ void StaticFileController::service(HttpRequest &request, HttpResponse &response)
|
|||||||
qDebug("StaticFileController: Cache hit for %s",path.data());
|
qDebug("StaticFileController: Cache hit for %s",path.data());
|
||||||
setContentType(filename,response);
|
setContentType(filename,response);
|
||||||
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
||||||
response.write(document);
|
response.write(document,true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -80,6 +80,7 @@ void StaticFileController::service(HttpRequest &request, HttpResponse &response)
|
|||||||
{
|
{
|
||||||
setContentType(path,response);
|
setContentType(path,response);
|
||||||
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
||||||
|
response.setHeader("Content-Length",QByteArray::number(file.size()));
|
||||||
if (file.size()<=maxCachedFileSize)
|
if (file.size()<=maxCachedFileSize)
|
||||||
{
|
{
|
||||||
// Return the file content and store it also in the cache
|
// Return the file content and store it also in the cache
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
@ -7,9 +7,7 @@ Project homepage: http://stefanfrings.de/qtwebapp/index-en.html
|
|||||||
Tutorial: http://stefanfrings.de/qtwebapp/tutorial/index.html
|
Tutorial: http://stefanfrings.de/qtwebapp/tutorial/index.html
|
||||||
API doc: http://stefanfrings.de/qtwebapp/api/index.html
|
API doc: http://stefanfrings.de/qtwebapp/api/index.html
|
||||||
|
|
||||||
In Qt 6.0 or newer, you must install the optional "core5compat" component.
|
In Qt 6.x you must install the "Qt5Compat" libraries.
|
||||||
This package contains the QTextCodec class which is needed to decode template files.
|
|
||||||
It supports a lot more encodings, for example ISO-8859-15 with the EUR symbol.
|
|
||||||
|
|
||||||
Demo1 shows how to use the library by including the source code into your
|
Demo1 shows how to use the library by including the source code into your
|
||||||
project, the preferred method.
|
project, the preferred method.
|
@ -1,6 +1,18 @@
|
|||||||
Dont forget to update the release number also in
|
Dont forget to update the release number also in
|
||||||
QtWebApp.pro and httpserver/httpglobal.cpp.
|
QtWebApp.pro and httpserver/httpglobal.cpp.
|
||||||
|
|
||||||
|
1.8.6
|
||||||
|
30.09.2022
|
||||||
|
Fix compile error under Windows: sslCaCertFileName' was not declared
|
||||||
|
|
||||||
|
1.8.5
|
||||||
|
19.03.2022
|
||||||
|
Add support for SSL peer verification and CA certificate.
|
||||||
|
|
||||||
|
1.8.4
|
||||||
|
29.10.2021
|
||||||
|
Add Content-Length header to static file controller.
|
||||||
|
|
||||||
1.8.3
|
1.8.3
|
||||||
21.03.2021
|
21.03.2021
|
||||||
The minLevel for logging can now be configured as string:
|
The minLevel for logging can now be configured as string:
|
@ -20,5 +20,9 @@
|
|||||||
#define DECLSPEC
|
#define DECLSPEC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __cplusplus < 201103L
|
||||||
|
#define nullptr 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TEMPLATEGLOBAL_H
|
#endif // TEMPLATEGLOBAL_H
|
||||||
|
|
||||||
|
2
third_party/README.md
vendored
2
third_party/README.md
vendored
@ -6,4 +6,4 @@ needed to build YACReader.
|
|||||||
| Name | Purpose | Upstream | Version | License |
|
| Name | Purpose | Upstream | Version | License |
|
||||||
|---------- |--------- |--------- |-------- |-------- |
|
|---------- |--------- |--------- |-------- |-------- |
|
||||||
| QsLog | Logging | https://bitbucket.org/codeimproved/qslog | 2.1 46b643d5bcbc| 3-clause BSD|
|
| QsLog | Logging | https://bitbucket.org/codeimproved/qslog | 2.1 46b643d5bcbc| 3-clause BSD|
|
||||||
| QtWebApp | Server | http://stefanfrings.de/qtwebapp/ | 1.7.11 | LGPL3 |
|
| QtWebApp | Server | http://stefanfrings.de/qtwebapp/ | 1.8.6 | LGPL3 |
|
||||||
|
Loading…
Reference in New Issue
Block a user