QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCNetworkHelper.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QJsonDocument>
4#include <QtCore/QList>
5#include <QtCore/QPair>
6#include <QtCore/QString>
7#include <QtCore/QUrl>
8#include <QtCore/QVariant>
9#include <QtHttpServer/QHttpServerRequest>
10#include <QtHttpServer/QHttpServerResponder>
11#include <QtNetwork/QHttpPart>
12#include <QtNetwork/QNetworkReply>
13#include <QtNetwork/QNetworkRequest>
14#include <QtNetwork/QSslCertificate>
15#include <QtNetwork/QSslConfiguration>
16#include <QtNetwork/QSslKey>
17
18class QIODevice;
19class QNetworkAccessManager;
20
23namespace QGCNetworkHelper {
24
25// ============================================================================
26// Constants
27// ============================================================================
28
30constexpr int kDefaultTimeoutMs = 30000;
31
33constexpr int kDefaultConnectTimeoutMs = 10000;
34
36constexpr int kMaxRedirects = 10;
37
38// ============================================================================
39// Content-Type Constants
40// ============================================================================
41
43inline const QString kContentTypeJson = QStringLiteral("application/json");
44inline const QString kContentTypeFormUrlencoded = QStringLiteral("application/x-www-form-urlencoded");
45inline const QString kContentTypeOctetStream = QStringLiteral("application/octet-stream");
46inline const QString kContentTypeMultipartForm = QStringLiteral("multipart/form-data");
47inline const QString kContentTypeXml = QStringLiteral("application/xml");
48inline const QString kContentTypeTextPlain = QStringLiteral("text/plain");
49
50// ============================================================================
51// HTTP Status Code Helpers
52// ============================================================================
53
55using HttpStatusCode = QHttpServerResponder::StatusCode;
56
67
70
72inline bool isHttpSuccess(int statusCode)
73{
74 return statusCode >= 200 && statusCode < 300;
75}
76
78inline bool isHttpRedirect(int statusCode)
79{
80 return statusCode >= 300 && statusCode < 400;
81}
82
84inline bool isHttpClientError(int statusCode)
85{
86 return statusCode >= 400 && statusCode < 500;
87}
88
90inline bool isHttpServerError(int statusCode)
91{
92 return statusCode >= 500 && statusCode < 600;
93}
94
96QString httpStatusText(int statusCode);
97QString httpStatusText(HttpStatusCode statusCode);
98
99// ============================================================================
100// HTTP Methods
101// ============================================================================
102
104using HttpMethod = QHttpServerRequest::Method;
105
107QString httpMethodName(HttpMethod method);
108
111HttpMethod parseHttpMethod(const QString& methodStr);
112
113// ============================================================================
114// URL Utilities
115// ============================================================================
116
119bool isValidUrl(const QUrl& url);
120
122bool isHttpUrl(const QUrl& url);
123
125bool isHttpsUrl(const QUrl& url);
126
128QUrl normalizeUrl(const QUrl& url);
129
131QUrl ensureScheme(const QUrl& url, const QString& defaultScheme = QStringLiteral("https"));
132
134QUrl buildUrl(const QString& baseUrl, const QMap<QString, QString>& params);
135
137QUrl buildUrl(const QString& baseUrl, const QList<QPair<QString, QString>>& params);
138
140QUrl urlWithoutQuery(const QUrl& url);
141
142// ============================================================================
143// Request Configuration
144// ============================================================================
145
148{
150 bool allowRedirects = true;
151 bool http2Allowed = true;
152 bool cacheEnabled = true;
153 bool backgroundRequest = false;
154 QString userAgent;
155 QString accept = QStringLiteral("*/*");
157 QString contentType;
158 QList<QPair<QNetworkRequest::Attribute, QVariant>> requestAttributes;
159
164};
165
169void configureRequest(QNetworkRequest& request, const RequestConfig& config = {});
170
175QNetworkRequest createRequest(const QUrl& url, const RequestConfig& config = {});
176
178void setStandardHeaders(QNetworkRequest& request, const QString& userAgent = {});
179
181void setJsonHeaders(QNetworkRequest& request);
182
184void setFormHeaders(QNetworkRequest& request);
185
187QString defaultUserAgent();
188
189// ============================================================================
190// Authentication Helpers
191// ============================================================================
192
196void setBasicAuth(QNetworkRequest& request, const QString& credentials);
197
202void setBasicAuth(QNetworkRequest& request, const QString& username, const QString& password);
203
207void setBearerToken(QNetworkRequest& request, const QString& token);
208
211QString createBasicAuthCredentials(const QString& username, const QString& password);
212
213// ============================================================================
214// Multipart Form Data Helpers
215// ============================================================================
216
221QHttpPart createFormField(const QString& name, const QString& value);
222
229QHttpPart createFilePart(const QString& name, const QString& fileName, const QString& contentType, QIODevice* device);
230
236QHttpPart createFilePart(const QString& name, const QString& fileName, QIODevice* device);
237
238// ============================================================================
239// SSL/TLS Configuration Builders
240// ============================================================================
241
245QSslConfiguration createSslConfig(QSsl::SslProtocol protocol = QSsl::TlsV1_2OrLater);
246
250QSslConfiguration createInsecureSslConfig();
251
255void applySslConfig(QNetworkRequest& request, const QSslConfiguration& config);
256
261QList<QSslCertificate> loadCaCertificates(const QString& filePath, QString* errorOut = nullptr);
262
271bool loadClientCertAndKey(const QString& certPath, const QString& keyPath, QSslCertificate& certOut, QSslKey& keyOut,
272 QString* errorOut = nullptr);
273
274// ============================================================================
275// JSON Response Helpers
276// ============================================================================
277
282QJsonDocument parseJson(const QByteArray& data, QJsonParseError* error = nullptr);
283
288QJsonDocument parseJsonReply(QNetworkReply* reply, QJsonParseError* error = nullptr);
289
293bool looksLikeJson(const QByteArray& data);
294
295// ============================================================================
296// Network Reply Helpers
297// ============================================================================
298
301int httpStatusCode(const QNetworkReply* reply);
302
305QUrl redirectUrl(const QNetworkReply* reply);
306
309QString errorMessage(const QNetworkReply* reply);
310
312bool isSuccess(const QNetworkReply* reply);
313
315bool isRedirect(const QNetworkReply* reply);
316
318QString contentType(const QNetworkReply* reply);
319
321qint64 contentLength(const QNetworkReply* reply);
322
324bool isJsonResponse(const QNetworkReply* reply);
325
326// ============================================================================
327// Network Availability
328// ============================================================================
329
331bool isNetworkAvailable();
332
335
337bool isNetworkEthernet();
338
341
344{
345 None,
346 Unknown,
347 Ethernet,
348 WiFi,
349 Cellular,
350 Bluetooth,
351};
352
355
358
359// ============================================================================
360// SSL/TLS Helpers
361// ============================================================================
362
365void ignoreSslErrors(QNetworkReply* reply);
366
369void ignoreSslErrorsIfNeeded(QNetworkReply* reply);
370
372bool isSslAvailable();
373
375QString sslVersion();
376
377// ============================================================================
378// Network Access Manager Helpers
379// ============================================================================
380
384
387QNetworkAccessManager* createNetworkManager(QObject* parent = nullptr);
388
390void configureProxy(QNetworkAccessManager* manager);
391
392} // namespace QGCNetworkHelper
Config config
Error error
HttpStatusClass classifyHttpStatus(int statusCode)
Classify an HTTP status code.
bool isSuccess(const QNetworkReply *reply)
Check if reply indicates success (no error and HTTP 2xx)
bool isHttpClientError(int statusCode)
Check if HTTP status indicates client error (4xx)
QHttpServerRequest::Method HttpMethod
HTTP request methods - uses Qt's QHttpServerRequest::Method enum.
HttpStatusClass
HTTP status code ranges.
@ Informational
1xx - Informational
@ ServerError
5xx - Server errors
@ Unknown
Not a valid HTTP status.
@ ClientError
4xx - Client errors
void applySslConfig(QNetworkRequest &request, const QSslConfiguration &config)
QHttpServerResponder::StatusCode HttpStatusCode
HTTP status codes - uses Qt's QHttpServerResponder::StatusCode enum.
QList< QSslCertificate > loadCaCertificates(const QString &filePath, QString *errorOut)
bool looksLikeJson(const QByteArray &data)
void configureProxy(QNetworkAccessManager *manager)
Set up default proxy configuration on a network manager.
const QString kContentTypeFormUrlencoded
bool isJsonResponse(const QNetworkReply *reply)
Check if response is JSON based on Content-Type.
const QString kContentTypeOctetStream
QNetworkAccessManager * createNetworkManager(QObject *parent)
ConnectionType
Network connection types.
@ None
No network connection.
@ Cellular
Mobile/cellular data.
@ Bluetooth
Bluetooth connection.
QNetworkRequest createRequest(const QUrl &url, const RequestConfig &config)
bool isRedirect(const QNetworkReply *reply)
Check if reply indicates a redirect.
bool isNetworkEthernet()
Check if current network connection is Ethernet.
QString sslVersion()
Get SSL library version string.
bool isHttpRedirect(int statusCode)
Check if HTTP status indicates redirect (3xx)
HttpMethod parseHttpMethod(const QString &methodStr)
bool isHttpUrl(const QUrl &url)
Check if URL uses HTTP or HTTPS scheme.
QHttpPart createFormField(const QString &name, const QString &value)
void setFormHeaders(QNetworkRequest &request)
Set form data content headers.
QUrl redirectUrl(const QNetworkReply *reply)
void ignoreSslErrorsIfNeeded(QNetworkReply *reply)
void setStandardHeaders(QNetworkRequest &request, const QString &userAgent)
Set standard browser-like headers on a request.
bool isBluetoothAvailable()
Check if Bluetooth is available on this device.
QString contentType(const QNetworkReply *reply)
Get Content-Type header from reply.
bool loadClientCertAndKey(const QString &certPath, const QString &keyPath, QSslCertificate &certOut, QSslKey &keyOut, QString *errorOut)
constexpr int kMaxRedirects
Maximum number of redirects to follow.
int httpStatusCode(const QNetworkReply *reply)
QSslConfiguration createInsecureSslConfig()
QString defaultUserAgent()
Get the default User-Agent string for QGC.
QUrl buildUrl(const QString &baseUrl, const QMap< QString, QString > &params)
Build URL with query parameters from a map.
bool isNetworkAvailable()
Check if network is available (not disconnected)
void setBasicAuth(QNetworkRequest &request, const QString &credentials)
QString createBasicAuthCredentials(const QString &username, const QString &password)
QString httpStatusText(HttpStatusCode statusCode)
bool isHttpServerError(int statusCode)
Check if HTTP status indicates server error (5xx)
bool isHttpsUrl(const QUrl &url)
Check if URL uses secure HTTPS scheme.
constexpr int kDefaultConnectTimeoutMs
Default connection timeout for initial connect.
QString httpMethodName(HttpMethod method)
Get string name for an HTTP method (e.g., "GET", "POST")
bool isHttpSuccess(int statusCode)
Check if HTTP status indicates success (2xx)
ConnectionType connectionType()
Get current network connection type.
QJsonDocument parseJson(const QByteArray &data, QJsonParseError *error)
QSslConfiguration createSslConfig(QSsl::SslProtocol protocol)
void setBearerToken(QNetworkRequest &request, const QString &token)
bool isValidUrl(const QUrl &url)
QHttpPart createFilePart(const QString &name, const QString &fileName, const QString &contentType, QIODevice *device)
QJsonDocument parseJsonReply(QNetworkReply *reply, QJsonParseError *error)
const QString kContentTypeTextPlain
const QString kContentTypeXml
QUrl normalizeUrl(const QUrl &url)
Normalize URL (lowercase scheme/host, remove default ports, trailing slashes)
QUrl urlWithoutQuery(const QUrl &url)
Get URL without query string and fragment.
void setJsonHeaders(QNetworkRequest &request)
Set JSON content headers (Accept and Content-Type)
qint64 contentLength(const QNetworkReply *reply)
Get Content-Length header from reply (-1 if not present)
QString connectionTypeName(ConnectionType type)
Get human-readable name for connection type.
QString errorMessage(const QNetworkReply *reply)
QUrl ensureScheme(const QUrl &url, const QString &defaultScheme)
Ensure URL has scheme, defaulting to https:// if missing.
const QString kContentTypeJson
Common MIME types for Content-Type headers.
bool isInternetAvailable()
Check if internet is reachable (online state, stricter than isNetworkAvailable)
void ignoreSslErrors(QNetworkReply *reply)
void configureRequest(QNetworkRequest &request, const RequestConfig &config)
const QString kContentTypeMultipartForm
constexpr int kDefaultTimeoutMs
Default request timeout in milliseconds.
bool isSslAvailable()
Check if SSL is available.
Common request configuration options.
QList< QPair< QNetworkRequest::Attribute, QVariant > > requestAttributes