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
18#include "QGCNetworkClient.h"
19
20class QIODevice;
21class QNetworkAccessManager;
22class QNetworkInformation;
23
26namespace QGCNetworkHelper {
27
28// ============================================================================
29// Constants
30// ============================================================================
31
33constexpr int kDefaultTimeoutMs = 30000;
34
36constexpr int kDefaultConnectTimeoutMs = 10000;
37
39constexpr int kMaxRedirects = 10;
40
41// ============================================================================
42// Content-Type Constants
43// ============================================================================
44
46inline const QString kContentTypeJson = QStringLiteral("application/json");
47inline const QString kContentTypeFormUrlencoded = QStringLiteral("application/x-www-form-urlencoded");
48inline const QString kContentTypeOctetStream = QStringLiteral("application/octet-stream");
49inline const QString kContentTypeMultipartForm = QStringLiteral("multipart/form-data");
50inline const QString kContentTypeXml = QStringLiteral("application/xml");
51inline const QString kContentTypeTextPlain = QStringLiteral("text/plain");
52
53// ============================================================================
54// HTTP Status Code Helpers
55// ============================================================================
56
58using HttpStatusCode = QHttpServerResponder::StatusCode;
59
70
73
75inline bool isHttpSuccess(int statusCode)
76{
77 return statusCode >= 200 && statusCode < 300;
78}
79
81inline bool isHttpRedirect(int statusCode)
82{
83 return statusCode >= 300 && statusCode < 400;
84}
85
87inline bool isHttpClientError(int statusCode)
88{
89 return statusCode >= 400 && statusCode < 500;
90}
91
93inline bool isHttpServerError(int statusCode)
94{
95 return statusCode >= 500 && statusCode < 600;
96}
97
99QString httpStatusText(int statusCode);
100QString httpStatusText(HttpStatusCode statusCode);
101
102// ============================================================================
103// HTTP Methods
104// ============================================================================
105
107using HttpMethod = QHttpServerRequest::Method;
108
110QString httpMethodName(HttpMethod method);
111
114HttpMethod parseHttpMethod(const QString& methodStr);
115
116// ============================================================================
117// URL Utilities
118// ============================================================================
119
122bool isValidUrl(const QUrl& url);
123
125bool isHttpUrl(const QUrl& url);
126
128bool isHttpsUrl(const QUrl& url);
129
131QUrl normalizeUrl(const QUrl& url);
132
134QUrl ensureScheme(const QUrl& url, const QString& defaultScheme = QStringLiteral("https"));
135
137QUrl buildUrl(const QString& baseUrl, const QMap<QString, QString>& params);
138
140QUrl buildUrl(const QString& baseUrl, const QList<QPair<QString, QString>>& params);
141
143QUrl urlWithoutQuery(const QUrl& url);
144
147QString redactedUrlForLogging(const QUrl& url);
148QString redactedUrlForLogging(const QString& url);
149
150// ============================================================================
151// Request Configuration
152// ============================================================================
153
156{
158 bool allowRedirects = true;
159 bool http2Allowed = true;
160 bool cacheEnabled = true;
161 bool backgroundRequest = false;
162 QString userAgent;
163 QString accept = QStringLiteral("*/*");
165 QString contentType;
166 QList<QPair<QNetworkRequest::Attribute, QVariant>> requestAttributes;
167
172};
173
177void configureRequest(QNetworkRequest& request, const RequestConfig& config = {});
178
183QNetworkRequest createRequest(const QUrl& url, const RequestConfig& config = {});
184
186void setStandardHeaders(QNetworkRequest& request, const QString& userAgent = {});
187
189void setJsonHeaders(QNetworkRequest& request);
190
192void setFormHeaders(QNetworkRequest& request);
193
194// ============================================================================
195// Authentication Helpers
196// ============================================================================
197
201void setBasicAuth(QNetworkRequest& request, const QString& credentials);
202
207void setBasicAuth(QNetworkRequest& request, const QString& username, const QString& password);
208
212void setBearerToken(QNetworkRequest& request, const QString& token);
213
216QString createBasicAuthCredentials(const QString& username, const QString& password);
217
218// ============================================================================
219// Multipart Form Data Helpers
220// ============================================================================
221
226QHttpPart createFormField(const QString& name, const QString& value);
227
234QHttpPart createFilePart(const QString& name, const QString& fileName, const QString& contentType, QIODevice* device);
235
241QHttpPart createFilePart(const QString& name, const QString& fileName, QIODevice* device);
242
243// ============================================================================
244// SSL/TLS Configuration Builders
245// ============================================================================
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
331QNetworkInformation* networkInformation();
332
334bool isNetworkAvailable();
335
338
340bool isNetworkEthernet();
341
344
347{
348 None,
349 Unknown,
350 Ethernet,
351 WiFi,
352 Cellular,
353 Bluetooth,
354};
355
358
361
362// ============================================================================
363// SSL/TLS Helpers
364// ============================================================================
365
368void ignoreSslErrors(QNetworkReply* reply);
369
372void ignoreSslErrorsIfNeeded(QNetworkReply* reply);
373
375bool isSslAvailable();
376
378QString sslVersion();
379
380// ============================================================================
381// Network Access Manager Helpers
382// ============================================================================
383
387
390QNetworkAccessManager* createNetworkManager(QObject* parent);
391
393void configureProxy(QNetworkAccessManager* manager);
394
395} // 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.
QNetworkInformation * networkInformation()
The platform's network information, preferring a backend that reports reachability; null without a ba...
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)
QString redactedUrlForLogging(const QUrl &url)
QSslConfiguration createInsecureSslConfig()
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); assumed available without a backend.
void setBasicAuth(QNetworkRequest &request, const QString &credentials)
QString createBasicAuthCredentials(const QString &username, const QString &password)
Base64-encoded UTF-8 username:password, without the authentication scheme.
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)
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