Skip to content

Commit

Permalink
feat: add interrupting to HTTP importer downloads for #8
Browse files Browse the repository at this point in the history
  • Loading branch information
hello-adam committed Mar 10, 2020
1 parent 4114cfc commit b1d63dc
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 17 deletions.
42 changes: 37 additions & 5 deletions src/hobbits-plugins/importerexporters/HttpData/httptransceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,33 @@ HttpTransceiver::HttpTransceiver(QWidget *parent) :
QDialog(parent),
ui(new Ui::HttpTransceiver),
m_netManager(new QNetworkAccessManager(this)),
m_downloadFile(new QTemporaryFile),
m_reply(nullptr)
{
ui->setupUi(this);

this->setWindowTitle("HTTP Request");
m_downloadFile->open();

setDownloadMode();
connect(
m_netManager,
&QNetworkAccessManager::finished,
this,
&HttpTransceiver::replyReceived);

connect(ui->pb_interrupt, &QPushButton::clicked, this, &HttpTransceiver::interruptDownload);
}

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

QByteArray HttpTransceiver::getDownloadedData()
QTemporaryFile* HttpTransceiver::getDownloadedData()
{
return m_downloadData;
m_downloadFile->seek(0);
return m_downloadFile;
}

void HttpTransceiver::setUploadMode(QByteArray data)
Expand All @@ -41,6 +46,7 @@ void HttpTransceiver::setUploadMode(QByteArray data)
ui->cb_verb->setEnabled(true);
ui->le_formDataName->setVisible(true);
ui->lb_formDataName->setVisible(true);
ui->pr_request->setValue(0);
}

void HttpTransceiver::setDownloadMode()
Expand All @@ -50,16 +56,20 @@ void HttpTransceiver::setDownloadMode()
ui->cb_verb->setEnabled(false);
ui->le_formDataName->setVisible(false);
ui->lb_formDataName->setVisible(false);
ui->pr_request->setValue(0);
}

void HttpTransceiver::on_pb_send_clicked()
{
ui->pb_send->setEnabled(false);
ui->cb_verb->setEnabled(false);
QNetworkRequest request(QUrl(ui->le_url->text()));

QNetworkReply *reply;

if (ui->cb_verb->currentText() == "GET") {
ui->pb_interrupt->setEnabled(true);
m_downloadFile->resize(0);
reply = m_netManager->get(request);

connect(reply, &QNetworkReply::downloadProgress, this, &HttpTransceiver::progressReceived);
Expand All @@ -81,12 +91,23 @@ void HttpTransceiver::on_pb_send_clicked()
else if (ui->cb_verb->currentText() == "PUT") {
reply = m_netManager->put(request, multiPart);
}
else {
QMessageBox msg(this);
msg.setWindowTitle("Unsupported HTTP Verb");
msg.setText(QString("The selected HTTP Verb '%1' is unsupported").arg(ui->cb_verb->currentText()));
msg.setDefaultButton(QMessageBox::Ok);
msg.exec();
return;
}

multiPart->setParent(reply);

connect(reply, &QNetworkReply::uploadProgress, this, &HttpTransceiver::progressReceived);
}

if (m_reply) {
m_reply->deleteLater();
}
m_reply = reply;

connect(
Expand All @@ -96,14 +117,24 @@ void HttpTransceiver::on_pb_send_clicked()
&HttpTransceiver::handleError);
}

void HttpTransceiver::interruptDownload()
{
replyReceived(m_reply);
m_reply->abort();
}

void HttpTransceiver::progressReceived(qint64 progress, qint64 total)
{
ui->pr_request->setValue(int(double(progress) / double(total) * 100.0));
if (ui->cb_verb->currentText() == "GET") {
while (m_reply->bytesAvailable()) {
m_downloadFile->write(m_reply->read(10 * 1000 * 1000));
}
}
}

void HttpTransceiver::replyReceived(QNetworkReply *reply)
{
m_downloadData = reply->read(1000 * 1000 * 10);
m_uploadData.clear();

if (reply->error() == QNetworkReply::NoError) {
Expand All @@ -113,16 +144,17 @@ void HttpTransceiver::replyReceived(QNetworkReply *reply)
ui->le_formDataName->clear();
}

reply->deleteLater();
ui->pb_send->setEnabled(true);
ui->cb_verb->setEnabled(true);
ui->pb_interrupt->setEnabled(false);
}

void HttpTransceiver::handleError(QNetworkReply::NetworkError error)
{
Q_UNUSED(error)
QMessageBox msg(this);
msg.setWindowTitle("HTTP Error");
msg.setText(QString("Failed to perform HTTP request: '%1'").arg(m_reply->errorString()));
msg.setText(QString("Error encountered in HTTP request: '%1'").arg(m_reply->errorString()));
msg.setDefaultButton(QMessageBox::Ok);
msg.exec();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class HttpTransceiver : public QDialog

~HttpTransceiver();

QByteArray getDownloadedData();
QTemporaryFile* getDownloadedData();

public slots:
void setUploadMode(QByteArray data);
Expand All @@ -33,12 +33,13 @@ private slots:
void progressReceived(qint64, qint64);
void handleError(QNetworkReply::NetworkError);

void interruptDownload();

private:
Ui::HttpTransceiver *ui;
QNetworkAccessManager *m_netManager;
QTemporaryFile *m_downloadFile;
QByteArray m_uploadData;
QByteArray m_downloadData;
QNetworkReply *m_reply;
};

Expand Down
34 changes: 24 additions & 10 deletions src/hobbits-plugins/importerexporters/HttpData/httptransceiver.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>471</width>
<height>154</height>
<width>541</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -81,14 +81,28 @@
</spacer>
</item>
<item>
<widget class="QProgressBar" name="pr_request">
<property name="enabled">
<bool>false</bool>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QProgressBar" name="pr_request">
<property name="enabled">
<bool>false</bool>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_interrupt">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Interrupt</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
Expand Down

0 comments on commit b1d63dc

Please sign in to comment.