Attica

postfiledata.cpp
1 /*
2  This file is part of KDE.
3 
4  SPDX-FileCopyrightText: 1999 Matthias Kalle Dalheimer <[email protected]>
5  SPDX-FileCopyrightText: 2000 Charles Samuels <[email protected]>
6  SPDX-FileCopyrightText: 2005 Joseph Wenninger <[email protected]>
7  SPDX-FileCopyrightText: 2009 Frederik Gladhorn <[email protected]>
8 
9  SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
10 */
11 
12 #include "postfiledata.h"
13 
14 #include <QDateTime>
15 #include <QDebug>
16 #include <QRandomGenerator>
17 
18 namespace Attica
19 {
20 class PostFileDataPrivate
21 {
22 public:
23  QByteArray buffer;
24  QByteArray boundary;
25  QUrl url;
26  bool finished;
27 
28  PostFileDataPrivate()
29  : finished(false)
30  {
31  }
32 };
33 
34 PostFileData::PostFileData(const QUrl &url)
35  : d(new PostFileDataPrivate)
36 {
37  d->url = url;
38  d->boundary = "----------" + randomString(42 + 13).toLatin1();
39 }
40 
41 PostFileData::~PostFileData()
42 {
43  delete d;
44 }
45 
46 QString PostFileData::randomString(int length)
47 {
48  if (length <= 0) {
49  return QString();
50  }
51 
52  QString str;
53  str.resize(length);
54  int i = 0;
55  auto *generator = QRandomGenerator::global();
56  while (length--) {
57  int r = generator->bounded(62);
58  r += 48;
59  if (r > 57) {
60  r += 7;
61  }
62  if (r > 90) {
63  r += 6;
64  }
65  str[i++] = QLatin1Char(char(r));
66  }
67  return str;
68 }
69 
70 void PostFileData::addArgument(const QString &key, const QString &value)
71 {
72  if (d->finished) {
73  qWarning() << "PostFileData::addFile: should not add data after calling request() or data()";
74  }
75  QByteArray data(
76  "--" + d->boundary + "\r\n"
77  "Content-Disposition: form-data; name=\"" + key.toLatin1() +
78  "\"\r\n\r\n" + value.toUtf8() + "\r\n");
79 
80  d->buffer.append(data);
81 }
82 
83 /*
84 void PostFileData::addFile(const QString& fileName, QIODevice* file, const QString& mimeType)
85 {
86  if (d->finished) {
87  qCDebug(ATTICA) << "PostFileData::addFile: should not add data after calling request() or data()";
88  }
89  QByteArray data = file->readAll();
90  addFile(fileName, data, mimeType);
91 }
92 */
93 
94 void PostFileData::addFile(const QString &fileName, const QByteArray &file, const QString &mimeType, const QString &fieldName)
95 {
96  if (d->finished) {
97  qWarning() << "PostFileData::addFile: should not add data after calling request() or data()";
98  }
99 
100  QByteArray data(
101  "--" + d->boundary + "\r\n"
102  "Content-Disposition: form-data; name=\"");
103  data.append(fieldName.toLatin1());
104  data.append("\"; filename=\"" + fileName.toUtf8() + "\"\r\nContent-Type: " + mimeType.toLatin1() + "\r\n\r\n");
105 
106  d->buffer.append(data);
107  d->buffer.append(file + QByteArray("\r\n"));
108 }
109 
110 QNetworkRequest PostFileData::request()
111 {
112  if (!d->finished) {
113  finish();
114  }
115  QNetworkRequest request;
116  request.setUrl(d->url);
117  request.setHeader(QNetworkRequest::ContentTypeHeader, QByteArray("multipart/form-data; boundary=" + d->boundary));
118  request.setHeader(QNetworkRequest::ContentLengthHeader, d->buffer.length());
119  return request;
120 }
121 
122 QByteArray PostFileData::data()
123 {
124  if (!d->finished) {
125  finish();
126  }
127  return d->buffer;
128 }
129 
130 void PostFileData::finish()
131 {
132  Q_ASSERT(!d->finished);
133  d->finished = true;
134  d->buffer.append("--" + d->boundary + "--");
135 }
136 
137 }
KCOREADDONS_EXPORT QString randomString(int length)
void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
QByteArray toLatin1() const const
KCALUTILS_EXPORT QString mimeType()
void resize(int size)
QByteArray toUtf8() const const
void setUrl(const QUrl &url)
The Attica namespace,.
QRandomGenerator * global()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Dec 11 2023 04:05:13 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.