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/QSslConfiguration>
15
16class QIODevice;
17class QNetworkAccessManager;
18
21namespace QGCNetworkHelper {
22
23// ============================================================================
24// Constants
25// ============================================================================
26
28constexpr int kDefaultTimeoutMs = 30000;
29
31constexpr int kDefaultConnectTimeoutMs = 10000;
32
34constexpr int kMaxRedirects = 10;
35
36// ============================================================================
37// Content-Type Constants
38// ============================================================================
39
41inline const QString kContentTypeJson = QStringLiteral("application/json");
42inline const QString kContentTypeFormUrlencoded = QStringLiteral("application/x-www-form-urlencoded");
43inline const QString kContentTypeOctetStream = QStringLiteral("application/octet-stream");
44inline const QString kContentTypeMultipartForm = QStringLiteral("multipart/form-data");
45inline const QString kContentTypeXml = QStringLiteral("application/xml");
46inline const QString kContentTypeTextPlain = QStringLiteral("text/plain");
47
48// ============================================================================
49// HTTP Status Code Helpers
50// ============================================================================
51
53using HttpStatusCode = QHttpServerResponder::StatusCode;
54
65
68
70inline bool isHttpSuccess(int statusCode)
71{
72 return statusCode >= 200 && statusCode < 300;
73}
74
76inline bool isHttpRedirect(int statusCode)
77{
78 return statusCode >= 300 && statusCode < 400;
79}
80
82inline bool isHttpClientError(int statusCode)
83{
84 return statusCode >= 400 && statusCode < 500;
85}
86
88inline bool isHttpServerError(int statusCode)
89{
90 return statusCode >= 500 && statusCode < 600;
91}
92
94QString httpStatusText(int statusCode);
95QString httpStatusText(HttpStatusCode statusCode);
96
97// ============================================================================
98// HTTP Methods
99// ============================================================================
100
102using HttpMethod = QHttpServerRequest::Method;
103
105QString httpMethodName(HttpMethod method);
106
109HttpMethod parseHttpMethod(const QString& methodStr);
110
111// ============================================================================
112// URL Utilities
113// ============================================================================
114
117bool isValidUrl(const QUrl& url);
118
120bool isHttpUrl(const QUrl& url);
121
123bool isHttpsUrl(const QUrl& url);
124
126QUrl normalizeUrl(const QUrl& url);
127
129QUrl ensureScheme(const QUrl& url, const QString& defaultScheme = QStringLiteral("https"));
130
132QUrl buildUrl(const QString& baseUrl, const QMap<QString, QString>& params);
133
135QUrl buildUrl(const QString& baseUrl, const QList<QPair<QString, QString>>& params);
136
138QString urlFileName(const QUrl& url);
139
141QUrl urlWithoutQuery(const QUrl& url);
142
143// ============================================================================
144// Request Configuration
145// ============================================================================
146
149{
151 bool allowRedirects = true;
152 bool http2Allowed = true;
153 bool cacheEnabled = true;
154 bool backgroundRequest = false;
155 QString userAgent;
156 QString accept = QStringLiteral("*/*");
158 QString contentType;
159 QList<QPair<QNetworkRequest::Attribute, QVariant>> requestAttributes;
160};
161
165void configureRequest(QNetworkRequest& request, const RequestConfig& config = {});
166
171QNetworkRequest createRequest(const QUrl& url, const RequestConfig& config = {});
172
174void setStandardHeaders(QNetworkRequest& request, const QString& userAgent = {});
175
177void setJsonHeaders(QNetworkRequest& request);
178
180void setFormHeaders(QNetworkRequest& request);
181
183QString defaultUserAgent();
184
185// ============================================================================
186// Authentication Helpers
187// ============================================================================
188
192void setBasicAuth(QNetworkRequest& request, const QString& credentials);
193
198void setBasicAuth(QNetworkRequest& request, const QString& username, const QString& password);
199
203void setBearerToken(QNetworkRequest& request, const QString& token);
204
207QString createBasicAuthCredentials(const QString& username, const QString& password);
208
209// ============================================================================
210// Multipart Form Data Helpers
211// ============================================================================
212
217QHttpPart createFormField(const QString& name, const QString& value);
218
225QHttpPart createFilePart(const QString& name, const QString& fileName, const QString& contentType, QIODevice* device);
226
232QHttpPart createFilePart(const QString& name, const QString& fileName, QIODevice* device);
233
234// ============================================================================
235// SSL/TLS Configuration Builders
236// ============================================================================
237
241QSslConfiguration createSslConfig(QSsl::SslProtocol protocol = QSsl::TlsV1_2OrLater);
242
246QSslConfiguration createInsecureSslConfig();
247
251void applySslConfig(QNetworkRequest& request, const QSslConfiguration& config);
252
253// ============================================================================
254// JSON Response Helpers
255// ============================================================================
256
261QJsonDocument parseJson(const QByteArray& data, QJsonParseError* error = nullptr);
262
267QJsonDocument parseJsonReply(QNetworkReply* reply, QJsonParseError* error = nullptr);
268
272bool looksLikeJson(const QByteArray& data);
273
274// ============================================================================
275// Network Reply Helpers
276// ============================================================================
277
280int httpStatusCode(const QNetworkReply* reply);
281
284QUrl redirectUrl(const QNetworkReply* reply);
285
288QString errorMessage(const QNetworkReply* reply);
289
291bool isSuccess(const QNetworkReply* reply);
292
294bool isRedirect(const QNetworkReply* reply);
295
297QString contentType(const QNetworkReply* reply);
298
300qint64 contentLength(const QNetworkReply* reply);
301
303bool isJsonResponse(const QNetworkReply* reply);
304
305// ============================================================================
306// Network Availability
307// ============================================================================
308
310bool isNetworkAvailable();
311
314
316bool isNetworkEthernet();
317
320
323{
324 None,
325 Unknown,
326 Ethernet,
327 WiFi,
328 Cellular,
329 Bluetooth,
330};
331
334
337
338// ============================================================================
339// SSL/TLS Helpers
340// ============================================================================
341
344void ignoreSslErrors(QNetworkReply* reply);
345
348void ignoreSslErrorsIfNeeded(QNetworkReply* reply);
349
351bool isSslAvailable();
352
354QString sslVersion();
355
356// ============================================================================
357// Network Access Manager Helpers
358// ============================================================================
359
363
366QNetworkAccessManager* createNetworkManager(QObject* parent = nullptr);
367
369void configureProxy(QNetworkAccessManager* manager);
370
371// ============================================================================
372// Compressed Data Helpers
373// ============================================================================
374
379bool looksLikeCompressedData(const QByteArray& data);
380
386QJsonDocument parseCompressedJson(const QByteArray& data, QJsonParseError* error = nullptr);
387
388} // 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.
bool looksLikeJson(const QByteArray &data)
QJsonDocument parseCompressedJson(const QByteArray &data, QJsonParseError *error)
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.
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 looksLikeCompressedData(const QByteArray &data)
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