diff options
Diffstat (limited to 'examples/network/http')
-rw-r--r-- | examples/network/http/CMakeLists.txt | 37 | ||||
-rw-r--r-- | examples/network/http/httpwindow.cpp | 62 | ||||
-rw-r--r-- | examples/network/http/httpwindow.h | 6 | ||||
-rw-r--r-- | examples/network/http/main.cpp | 4 |
4 files changed, 69 insertions, 40 deletions
diff --git a/examples/network/http/CMakeLists.txt b/examples/network/http/CMakeLists.txt index 8be2d25bec..705c3a0beb 100644 --- a/examples/network/http/CMakeLists.txt +++ b/examples/network/http/CMakeLists.txt @@ -1,17 +1,13 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + cmake_minimum_required(VERSION 3.16) project(http LANGUAGES CXX) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/network/http") - find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Widgets) +qt_standard_project_setup() + qt_add_executable(http authenticationdialog.ui httpwindow.cpp httpwindow.h @@ -23,15 +19,22 @@ set_target_properties(http PROPERTIES MACOSX_BUNDLE TRUE ) -target_link_libraries(http PUBLIC - Qt::Core - Qt::Gui - Qt::Network - Qt::Widgets +target_link_libraries(http PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Network + Qt6::Widgets ) install(TARGETS http - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET http + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/network/http/httpwindow.cpp b/examples/network/http/httpwindow.cpp index 9fa32da101..72f130734b 100644 --- a/examples/network/http/httpwindow.cpp +++ b/examples/network/http/httpwindow.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "httpwindow.h" @@ -23,7 +23,6 @@ ProgressDialog::ProgressDialog(const QUrl &url, QWidget *parent) : QProgressDialog(parent) { setWindowTitle(tr("Download Progress")); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setLabelText(tr("Downloading %1.").arg(url.toDisplayString())); setMinimum(0); setValue(0); @@ -42,17 +41,20 @@ HttpWindow::HttpWindow(QWidget *parent) , statusLabel(new QLabel(tr("Please enter the URL of a file you want to download.\n\n"), this)) , urlLineEdit(new QLineEdit(defaultUrl)) , downloadButton(new QPushButton(tr("Download"))) - , launchCheckBox(new QCheckBox("Launch file")) + , launchCheckBox(new QCheckBox(tr("Launch file"))) , defaultFileLineEdit(new QLineEdit(defaultFileName)) , downloadDirectoryLineEdit(new QLineEdit) { - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - setWindowTitle(tr("HTTP")); + setWindowTitle(tr("HTTP Client")); //! [qnam-auth-required-1] connect(&qnam, &QNetworkAccessManager::authenticationRequired, this, &HttpWindow::slotAuthenticationRequired); //! [qnam-auth-required-1] +#if QT_CONFIG(networkproxy) + connect(&qnam, &QNetworkAccessManager::proxyAuthenticationRequired, + this, &HttpWindow::slotProxyAuthenticationRequired); +#endif QFormLayout *formLayout = new QFormLayout; urlLineEdit->setClearButtonEnabled(true); @@ -142,19 +144,18 @@ void HttpWindow::downloadFile() bool useDirectory = !downloadDirectory.isEmpty() && QFileInfo(downloadDirectory).isDir(); if (useDirectory) fileName.prepend(downloadDirectory + '/'); + if (QFile::exists(fileName)) { - if (QMessageBox::question(this, tr("Overwrite Existing File"), - tr("There already exists a file called %1%2." - " Overwrite?") - .arg(fileName, - useDirectory - ? QString() - : QStringLiteral(" in the current directory")), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No) - == QMessageBox::No) { + QString alreadyExists = useDirectory + ? tr("There already exists a file called %1. Overwrite?") + : tr("There already exists a file called %1 in the current directory. " + "Overwrite?"); + QMessageBox::StandardButton response = QMessageBox::question(this, + tr("Overwrite Existing File"), + alreadyExists.arg(QDir::toNativeSeparators(fileName)), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (response == QMessageBox::No) return; - } QFile::remove(fileName); } @@ -272,11 +273,34 @@ void HttpWindow::sslErrors(const QList<QSslError> &errors) errorString += error.errorString(); } - if (QMessageBox::warning(this, tr("SSL Errors"), - tr("One or more SSL errors has occurred:\n%1").arg(errorString), - QMessageBox::Ignore | QMessageBox::Abort) == QMessageBox::Ignore) { + if (QMessageBox::warning(this, tr("TLS Errors"), + tr("One or more TLS errors has occurred:\n%1").arg(errorString), + QMessageBox::Ignore | QMessageBox::Abort) + == QMessageBox::Ignore) { reply->ignoreSslErrors(); } } //! [sslerrors-2] #endif + +#if QT_CONFIG(networkproxy) +void HttpWindow::slotProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) +{ + QDialog authenticationDialog; + Ui::Dialog ui; + ui.setupUi(&authenticationDialog); + authenticationDialog.adjustSize(); + ui.siteDescription->setText(tr("A network proxy at %1 is requesting credentials for realm: %2") + .arg(proxy.hostName(), authenticator->realm())); + + // If the user passed credentials in the URL to http_proxy or similar they may be available to + // us. Otherwise this will just leave the fields empty + ui.userEdit->setText(proxy.user()); + ui.passwordEdit->setText(proxy.password()); + + if (authenticationDialog.exec() == QDialog::Accepted) { + authenticator->setUser(ui.userEdit->text()); + authenticator->setPassword(ui.passwordEdit->text()); + } +} +#endif diff --git a/examples/network/http/httpwindow.h b/examples/network/http/httpwindow.h index 64e9274288..ade0635e48 100644 --- a/examples/network/http/httpwindow.h +++ b/examples/network/http/httpwindow.h @@ -19,6 +19,9 @@ class QSslError; class QAuthenticator; class QNetworkReply; class QCheckBox; +#if QT_CONFIG(networkproxy) +class QNetworkProxy; +#endif QT_END_NAMESPACE @@ -52,6 +55,9 @@ private slots: #if QT_CONFIG(ssl) void sslErrors(const QList<QSslError> &errors); #endif +#if QT_CONFIG(networkproxy) + void slotProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); +#endif private: std::unique_ptr<QFile> openFileForWrite(const QString &fileName); diff --git a/examples/network/http/main.cpp b/examples/network/http/main.cpp index 049d10dcc2..4b0bd9e76a 100644 --- a/examples/network/http/main.cpp +++ b/examples/network/http/main.cpp @@ -14,11 +14,7 @@ int main(int argc, char *argv[]) const QRect availableSize = httpWin.screen()->availableGeometry(); httpWin.resize(availableSize.width() / 5, availableSize.height() / 5); httpWin.move((availableSize.width() - httpWin.width()) / 2, (availableSize.height() - httpWin.height()) / 2); -#ifdef Q_OS_ANDROID - httpWin.showMaximized(); -#else httpWin.show(); -#endif return app.exec(); } |