#ifndef GATEWAYCONTROLLER_H #define GATEWAYCONTROLLER_H #include #include #include #include #include #include #include "core/utils/errorCodes.h" #include "core/utils/routeModes.h" #include "core/utils/commonStructs.h" #ifdef Q_OS_IOS #include "platforms/ios/ios_controller.h" #endif class GatewayController : public QObject { Q_OBJECT public: explicit GatewayController(const QString &gatewayEndpoint, const bool isDevEnvironment, const int requestTimeoutMsecs, const bool isStrictKillSwitchEnabled, QObject *parent = nullptr); amnezia::ErrorCode post(const QString &endpoint, const QJsonObject apiPayload, QByteArray &responseBody); QFuture> postAsync(const QString &endpoint, const QJsonObject apiPayload); private: struct EncryptedRequestData { QNetworkRequest request; QByteArray requestBody; QByteArray key; QByteArray iv; QByteArray salt; amnezia::ErrorCode errorCode; }; struct DecryptionResult { QByteArray decryptedBody; bool isDecryptionSuccessful; }; EncryptedRequestData prepareRequest(const QString &endpoint, const QJsonObject &apiPayload); DecryptionResult tryDecryptResponseBody(const QByteArray &encryptedResponseBody, QNetworkReply::NetworkError replyError, const QByteArray &key, const QByteArray &iv, const QByteArray &salt); QStringList getProxyUrls(const QString &serviceType, const QString &userCountryCode); bool shouldBypassProxy(const QNetworkReply::NetworkError &replyError, const QByteArray &decryptedResponseBody, bool isDecryptionSuccessful); void bypassProxy(const QString &endpoint, const QString &serviceType, const QString &userCountryCode, std::function requestFunction, std::function &sslErrors)> replyProcessingFunction); void getProxyUrlsAsync(const QStringList proxyStorageUrls, const int currentProxyStorageIndex, std::function onComplete); void getProxyUrlAsync(const QStringList proxyUrls, const int currentProxyIndex, std::function onComplete); void bypassProxyAsync( const QString &endpoint, const QString &proxyUrl, EncryptedRequestData encRequestData, std::function &, QNetworkReply::NetworkError, const QString &, int)> onComplete); int m_requestTimeoutMsecs; QString m_gatewayEndpoint; bool m_isDevEnvironment = false; bool m_isStrictKillSwitchEnabled = false; inline static QString m_proxyUrl; }; #endif // GATEWAYCONTROLLER_H