Obsługa błędów SSL w programie napisanym z użyciem Qt.

0

Hej, niedawno w celu nauczenia się używania metod GET i POST w Qt napisałem drobny program, który z użyciem metody GET wyświetla zawartość strony WWW w polu do przeglądania tekstu. Oto kod:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::End()
{
    ui->textBrowser->setText(reply->readAll());
}

void MainWindow::on_pushButton_clicked()
{
    reply=manager.get(QNetworkRequest(QUrl(ui->lineEdit->text())));
    connect(reply, SIGNAL(finished()), this, SLOT(End()));
}

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QApplication>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void End();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    QNetworkReply* reply;
    QNetworkAccessManager manager;
};

#endif // MAINWINDOW_H

Jednak program nie działa na stronach HTTPS. Wiem, że są sloty i sygnały do obsługi tego, jednak od dłuższego czasu nie jestem w stanie zrozumieć jak ich użyć w nawet takim prostym programie. Prosiłbym o pokazanie co dokładnie zrobić, aby program nie wywalał się na takich stronach.

1

Nie rozumiem problemu, dokumentacja jest bardzo jasna i przejrzysta.

żeby nie być gołosłownym:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QMessageBox>
#include <QPointer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    manager = new QNetworkAccessManager(this);
    manager->setObjectName("manager");

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_sendButton_clicked()
{
    auto url = QUrl(ui->urlEdit->text());
    if (url.isValid())
    {
        QNetworkRequest request(url);
        auto reply = manager->get(request);
        connect(reply, &QNetworkReply::finished,
                this, [this]()
        {
            auto reply = qobject_cast<QNetworkReply *>(sender());
            reply->deleteLater();

            if (reply->error() == QNetworkReply::NoError) {
                auto body = reply->readAll();
                auto text = QString::fromUtf8(body);
                ui->responseBodyEdit->setPlainText(text);
            }
            else
            {
                QMessageBox::warning(this, "Failed", reply->errorString());
            }
        });
    }
}

void MainWindow::on_manager_sslErrors(QNetworkReply *reply,
                                      const QList<QSslError> &errors)
{
    auto message = tr("Do you whant ignore SSL errors?\n");
    for (auto error : errors)
    {
        message += '\n';
        message += error.errorString();
    }

    auto guard = QPointer<QNetworkReply>(reply);
    auto result = QMessageBox::question(this, tr("SSL error"), message);
    if (guard)
    {
        if (result == QMessageBox::Yes)
        {
            guard->ignoreSslErrors();
        }
        else
        {
            // guard->abort();
        }
    }
}
0

Problem rozwiązany, wystarczyło skopiować dwie DDLki do folderu z programem. http://stackoverflow.com/questions/20351155/how-can-i-enable-ssl-in-qt-windows-application

1 użytkowników online, w tym zalogowanych: 0, gości: 1