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
140QString urlFileName(const QUrl& url);
141
143QUrl urlWithoutQuery(const QUrl& url);
144
145// ============================================================================
146// Request Configuration
147// ============================================================================
148
151{
153 bool allowRedirects = true;
154 bool http2Allowed = true;
155 bool cacheEnabled = true;
156 bool backgroundRequest = false;
157 QString userAgent;
158 QString accept = QStringLiteral("*/*");
160 QString contentType;
161 QList<QPair<QNetworkRequest::Attribute, QVariant>> requestAttributes;
162};
163
167void configureRequest(QNetworkRequest& request, const RequestConfig& config = {});
168
173QNetworkRequest createRequest(const QUrl& url, const RequestConfig& config = {});
174
176void setStandardHeaders(QNetworkRequest& request, const QString& userAgent = {});
177
179void setJsonHeaders(QNetworkRequest& request);
180
182void setFormHeaders(QNetworkRequest& request);
183
185QString defaultUserAgent();
186
187// ============================================================================
188// Authentication Helpers
189// ============================================================================
190
194void setBasicAuth(QNetworkRequest& request, const QString& credentials);
195
200void setBasicAuth(QNetworkRequest& request, const QString& username, const QString& password);
201
205void setBearerToken(QNetworkRequest& request, const QString& token);
206
209QString createBasicAuthCredentials(const QString& username, const QString& password);
210
211// ============================================================================
212// Multipart Form Data Helpers
213// ============================================================================
214
219QHttpPart createFormField(const QString& name, const QString& value);
220
227QHttpPart createFilePart(const QString& name, const QString& fileName, const QString& contentType, QIODevice* device);
228
234QHttpPart createFilePart(const QString& name, const QString& fileName, QIODevice* device);
235
236// ============================================================================
237// SSL/TLS Configuration Builders
238// ============================================================================
239
243QSslConfiguration createSslConfig(QSsl::SslProtocol protocol = QSsl::TlsV1_2OrLater);
244
248QSslConfiguration createInsecureSslConfig();
249
253void applySslConfig(QNetworkRequest& request, const QSslConfiguration& config);
254
259QList<QSslCertificate> loadCaCertificates(const QString& filePath, QString* errorOut = nullptr);
260
269bool loadClientCertAndKey(const QString& certPath, const QString& keyPath,
270 QSslCertificate& certOut, QSslKey& keyOut,
271 QString* errorOut = nullptr);
272
273// ============================================================================
274// JSON Response Helpers
275// ============================================================================
276
281QJsonDocument parseJson(const QByteArray& data, QJsonParseError* error = nullptr);
282
287QJsonDocument parseJsonReply(QNetworkReply* reply, QJsonParseError* error = nullptr);
288
292bool looksLikeJson(const QByteArray& data);
293
294// ============================================================================
295// Network Reply Helpers
296// ============================================================================
297
300int httpStatusCode(const QNetworkReply* reply);
301
304QUrl redirectUrl(const QNetworkReply* reply);
305
308QString errorMessage(const QNetworkReply* reply);
309
311bool isSuccess(const QNetworkReply* reply);
312
314bool isRedirect(const QNetworkReply* reply);
315
317QString contentType(const QNetworkReply* reply);
318
320qint64 contentLength(const QNetworkReply* reply);
321
323bool isJsonResponse(const QNetworkReply* reply);
324
325// ============================================================================
326// Network Availability
327// ============================================================================
328
330bool isNetworkAvailable();
331
334
336bool isNetworkEthernet();
337
340
343{
344 None,
345 Unknown,
346 Ethernet,
347 WiFi,
348 Cellular,
349 Bluetooth,
350};
351
354
357
358// ============================================================================
359// SSL/TLS Helpers
360// ============================================================================
361
364void ignoreSslErrors(QNetworkReply* reply);
365
368void ignoreSslErrorsIfNeeded(QNetworkReply* reply);
369
371bool isSslAvailable();
372
374QString sslVersion();
375
376// ============================================================================
377// Network Access Manager Helpers
378// ============================================================================
379
383
386QNetworkAccessManager* createNetworkManager(QObject* parent = nullptr);
387
389void configureProxy(QNetworkAccessManager* manager);
390
391} // namespace QGCNetworkHelper
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.
QString urlFileName(const QUrl &url)
Extract filename from URL path (last path segment)
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