Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. QML XMLHttpRequest and proxy
Forum Updated to NodeBB v4.3 + New Features

QML XMLHttpRequest and proxy

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
2 Posts 2 Posters 5.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • alejandro_pnzA Offline
    alejandro_pnzA Offline
    alejandro_pnz
    wrote on last edited by
    #1

    By default, Qt XMLHttpRequest doesn't have any possibility to set network proxy.
    Do we have any alternatives to send network request from QML, using network proxy?

    1 Reply Last reply
    0
    • Q Offline
      Q Offline
      qyvlik
      wrote on last edited by
      #2

      Qt version 5.13.2
      QML XMLHttpRequest implement and wrapper as follow

      • class QQmlXMLHttpRequest implement in qqmlxmlhttprequest.cpp
      • QQmlXMLHttpRequestWrapper in qqmlxmlhttprequest.cpp

      The QQmlXMLHttpRequest have QNetworkAccessManager type member m_nam, set m_nam code as follow:

       QQmlXMLHttpRequest *r = new QQmlXMLHttpRequest(scope.engine->v8Engine->networkAccessManager(), scope.engine);
      

      You can use the api void QQmlEngine::setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory) defined you own QNetworkAccessManager.

      class MyNetworkAccessManager : public QNetworkAccessManager
      {
          Q_OBJECT
      public:
          MyNetworkAccessManager(QObject* parent=nullptr):
              QNetworkAccessManager(parent)
          {}
      
      protected:
          QNetworkReply *createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = nullptr) {
      
      #ifdef QT_DEBUG
              qDebug() << Q_FUNC_INFO << "url:" << originalReq.url();
      #endif
              // do something before request
              // set the cookie
              // set proxy
              // ...
              return this->QNetworkAccessManager::createRequest(op, originalReq, outgoingData);
          }
      };
      
      class CacheableNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory
      {
      public:
          // use by xmlhttprequest
          // use by qml type such Image
          virtual QNetworkAccessManager *create(QObject *parent) {
               QNetworkAccessManager *nam = new MyNetworkAccessManager(parent);
      
      //        QNetworkAccessManager *nam = new QNetworkAccessManager(parent);
              QNetworkDiskCache* diskCache = new QNetworkDiskCache(nam);
      
              QString cachePath = QStandardPaths::displayName(QStandardPaths::AppDataLocation) + "/image-cache";
      
              diskCache->setCacheDirectory(cachePath);
              diskCache->setMaximumCacheSize(100 * 1024 * 1024);   // 100 MB
      
              nam->setCache(diskCache);
      
      #ifdef QT_DEBUG
              qDebug() << Q_FUNC_INFO << " cachePath:" << diskCache->cacheDirectory();
      #endif
              return nam;
          }
      };
      

      If you want use prue qml to set http proxy, try the 3rdparty library.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved