Skip to content

Commit b1d63dc

Browse files
committed
feat: add interrupting to HTTP importer downloads for #8
1 parent 4114cfc commit b1d63dc

File tree

3 files changed

+64
-17
lines changed

3 files changed

+64
-17
lines changed

src/hobbits-plugins/importerexporters/HttpData/httptransceiver.cpp

+37-5
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,33 @@ HttpTransceiver::HttpTransceiver(QWidget *parent) :
88
QDialog(parent),
99
ui(new Ui::HttpTransceiver),
1010
m_netManager(new QNetworkAccessManager(this)),
11+
m_downloadFile(new QTemporaryFile),
1112
m_reply(nullptr)
1213
{
1314
ui->setupUi(this);
1415

1516
this->setWindowTitle("HTTP Request");
17+
m_downloadFile->open();
1618

1719
setDownloadMode();
1820
connect(
1921
m_netManager,
2022
&QNetworkAccessManager::finished,
2123
this,
2224
&HttpTransceiver::replyReceived);
25+
26+
connect(ui->pb_interrupt, &QPushButton::clicked, this, &HttpTransceiver::interruptDownload);
2327
}
2428

2529
HttpTransceiver::~HttpTransceiver()
2630
{
2731
delete ui;
2832
}
2933

30-
QByteArray HttpTransceiver::getDownloadedData()
34+
QTemporaryFile* HttpTransceiver::getDownloadedData()
3135
{
32-
return m_downloadData;
36+
m_downloadFile->seek(0);
37+
return m_downloadFile;
3338
}
3439

3540
void HttpTransceiver::setUploadMode(QByteArray data)
@@ -41,6 +46,7 @@ void HttpTransceiver::setUploadMode(QByteArray data)
4146
ui->cb_verb->setEnabled(true);
4247
ui->le_formDataName->setVisible(true);
4348
ui->lb_formDataName->setVisible(true);
49+
ui->pr_request->setValue(0);
4450
}
4551

4652
void HttpTransceiver::setDownloadMode()
@@ -50,16 +56,20 @@ void HttpTransceiver::setDownloadMode()
5056
ui->cb_verb->setEnabled(false);
5157
ui->le_formDataName->setVisible(false);
5258
ui->lb_formDataName->setVisible(false);
59+
ui->pr_request->setValue(0);
5360
}
5461

5562
void HttpTransceiver::on_pb_send_clicked()
5663
{
5764
ui->pb_send->setEnabled(false);
65+
ui->cb_verb->setEnabled(false);
5866
QNetworkRequest request(QUrl(ui->le_url->text()));
5967

6068
QNetworkReply *reply;
6169

6270
if (ui->cb_verb->currentText() == "GET") {
71+
ui->pb_interrupt->setEnabled(true);
72+
m_downloadFile->resize(0);
6373
reply = m_netManager->get(request);
6474

6575
connect(reply, &QNetworkReply::downloadProgress, this, &HttpTransceiver::progressReceived);
@@ -81,12 +91,23 @@ void HttpTransceiver::on_pb_send_clicked()
8191
else if (ui->cb_verb->currentText() == "PUT") {
8292
reply = m_netManager->put(request, multiPart);
8393
}
94+
else {
95+
QMessageBox msg(this);
96+
msg.setWindowTitle("Unsupported HTTP Verb");
97+
msg.setText(QString("The selected HTTP Verb '%1' is unsupported").arg(ui->cb_verb->currentText()));
98+
msg.setDefaultButton(QMessageBox::Ok);
99+
msg.exec();
100+
return;
101+
}
84102

85103
multiPart->setParent(reply);
86104

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

108+
if (m_reply) {
109+
m_reply->deleteLater();
110+
}
90111
m_reply = reply;
91112

92113
connect(
@@ -96,14 +117,24 @@ void HttpTransceiver::on_pb_send_clicked()
96117
&HttpTransceiver::handleError);
97118
}
98119

120+
void HttpTransceiver::interruptDownload()
121+
{
122+
replyReceived(m_reply);
123+
m_reply->abort();
124+
}
125+
99126
void HttpTransceiver::progressReceived(qint64 progress, qint64 total)
100127
{
101128
ui->pr_request->setValue(int(double(progress) / double(total) * 100.0));
129+
if (ui->cb_verb->currentText() == "GET") {
130+
while (m_reply->bytesAvailable()) {
131+
m_downloadFile->write(m_reply->read(10 * 1000 * 1000));
132+
}
133+
}
102134
}
103135

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

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

116-
reply->deleteLater();
117147
ui->pb_send->setEnabled(true);
148+
ui->cb_verb->setEnabled(true);
149+
ui->pb_interrupt->setEnabled(false);
118150
}
119151

120152
void HttpTransceiver::handleError(QNetworkReply::NetworkError error)
121153
{
122154
Q_UNUSED(error)
123155
QMessageBox msg(this);
124156
msg.setWindowTitle("HTTP Error");
125-
msg.setText(QString("Failed to perform HTTP request: '%1'").arg(m_reply->errorString()));
157+
msg.setText(QString("Error encountered in HTTP request: '%1'").arg(m_reply->errorString()));
126158
msg.setDefaultButton(QMessageBox::Ok);
127159
msg.exec();
128160
}

src/hobbits-plugins/importerexporters/HttpData/httptransceiver.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class HttpTransceiver : public QDialog
2020

2121
~HttpTransceiver();
2222

23-
QByteArray getDownloadedData();
23+
QTemporaryFile* getDownloadedData();
2424

2525
public slots:
2626
void setUploadMode(QByteArray data);
@@ -33,12 +33,13 @@ private slots:
3333
void progressReceived(qint64, qint64);
3434
void handleError(QNetworkReply::NetworkError);
3535

36+
void interruptDownload();
37+
3638
private:
3739
Ui::HttpTransceiver *ui;
3840
QNetworkAccessManager *m_netManager;
3941
QTemporaryFile *m_downloadFile;
4042
QByteArray m_uploadData;
41-
QByteArray m_downloadData;
4243
QNetworkReply *m_reply;
4344
};
4445

src/hobbits-plugins/importerexporters/HttpData/httptransceiver.ui

+24-10
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>471</width>
10-
<height>154</height>
9+
<width>541</width>
10+
<height>268</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -81,14 +81,28 @@
8181
</spacer>
8282
</item>
8383
<item>
84-
<widget class="QProgressBar" name="pr_request">
85-
<property name="enabled">
86-
<bool>false</bool>
87-
</property>
88-
<property name="value">
89-
<number>0</number>
90-
</property>
91-
</widget>
84+
<layout class="QHBoxLayout" name="horizontalLayout_4">
85+
<item>
86+
<widget class="QProgressBar" name="pr_request">
87+
<property name="enabled">
88+
<bool>false</bool>
89+
</property>
90+
<property name="value">
91+
<number>0</number>
92+
</property>
93+
</widget>
94+
</item>
95+
<item>
96+
<widget class="QPushButton" name="pb_interrupt">
97+
<property name="enabled">
98+
<bool>false</bool>
99+
</property>
100+
<property name="text">
101+
<string>Interrupt</string>
102+
</property>
103+
</widget>
104+
</item>
105+
</layout>
92106
</item>
93107
<item>
94108
<layout class="QHBoxLayout" name="horizontalLayout_2">

0 commit comments

Comments
 (0)