Index: /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h	(revision 58241)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h	(revision 58242)
@@ -23,4 +23,5 @@
 {
     UINetworkRequestType_HEAD,
+    UINetworkRequestType_HEAD_Our,
     UINetworkRequestType_GET,
     UINetworkRequestType_GET_Our
Index: /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 58241)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 58242)
@@ -63,6 +63,6 @@
 public:
 
-    /* Constructor: */
-    UINetworkReplyPrivateThread(const QNetworkRequest &request);
+    /** Constructs network reply thread for the passed @a request of the passed @a type. */
+    UINetworkReplyPrivateThread(const QNetworkRequest &request, UINetworkRequestType type);
 
     /** Returns short descriptive context of thread's current operation. */
@@ -77,4 +77,18 @@
     /** Abort HTTP request. */
     void abort();
+    /** Returns value for the cached reply header of the passed @a type. */
+    QString header(QNetworkRequest::KnownHeaders type) const
+    {
+        /* Look for known header type: */
+        switch (type)
+        {
+            case QNetworkRequest::ContentTypeHeader:   return m_headers.value("Content-Type");
+            case QNetworkRequest::ContentLengthHeader: return m_headers.value("Content-Length");
+            case QNetworkRequest::LastModifiedHeader:  return m_headers.value("Last-Modified");
+            default: break;
+        }
+        /* Return null-string by default: */
+        return QString();
+    }
     /** @} */
 
@@ -119,8 +133,12 @@
     /* Variables: */
     QNetworkRequest m_request;
+    /** Holds the request type. */
+    UINetworkRequestType m_type;
     int m_iError;
     /** IPRT HTTP client instance handle. */
     RTHTTP m_hHttp;
     QByteArray m_reply;
+    /* Holds the cached reply headers. */
+    QMap<QString, QString> m_headers;
 
     static const char * const s_apszRootsZipUrls[];
@@ -201,6 +219,7 @@
 
 
-UINetworkReplyPrivateThread::UINetworkReplyPrivateThread(const QNetworkRequest &request)
+UINetworkReplyPrivateThread::UINetworkReplyPrivateThread(const QNetworkRequest &request, UINetworkRequestType type)
     : m_request(request)
+    , m_type(type)
     , m_iError(VINF_SUCCESS)
     , m_hHttp(NIL_RTHTTP)
@@ -359,12 +378,50 @@
     int rc = 0;
 
-    /* Perform blocking HTTP GET request: */
-    void   *pvResponse = 0;
-    size_t  cbResponse = 0;
-    rc = RTHttpGetBinary(m_hHttp, m_request.url().toString().toUtf8().constData(), &pvResponse, &cbResponse);
-    if (RT_SUCCESS(rc))
-    {
-        m_reply = QByteArray((char*)pvResponse, cbResponse);
-        RTHttpFreeResponse(pvResponse);
+    /* Depending on request type: */
+    switch (m_type)
+    {
+        case UINetworkRequestType_HEAD_Our:
+        {
+            /* Perform blocking HTTP HEAD request: */
+            void   *pvResponse = 0;
+            size_t  cbResponse = 0;
+            rc = RTHttpGetHeaderBinary(m_hHttp, m_request.url().toString().toUtf8().constData(), &pvResponse, &cbResponse);
+            if (RT_SUCCESS(rc))
+            {
+                m_reply = QByteArray((char*)pvResponse, cbResponse);
+                RTHttpFreeResponse(pvResponse);
+            }
+
+            /* Paranoia: */
+            m_headers.clear();
+
+            /* Parse header contents: */
+            const QString strHeaders = QString(m_reply);
+            const QStringList headers = strHeaders.split("\n", QString::SkipEmptyParts);
+            foreach (const QString &strHeader, headers)
+            {
+                const QStringList values = strHeader.split(": ", QString::SkipEmptyParts);
+                if (values.size() > 1)
+                    m_headers[values.at(0)] = values.at(1);
+            }
+
+            break;
+        }
+        case UINetworkRequestType_GET_Our:
+        {
+            /* Perform blocking HTTP GET request: */
+            void   *pvResponse = 0;
+            size_t  cbResponse = 0;
+            rc = RTHttpGetBinary(m_hHttp, m_request.url().toString().toUtf8().constData(), &pvResponse, &cbResponse);
+            if (RT_SUCCESS(rc))
+            {
+                m_reply = QByteArray((char*)pvResponse, cbResponse);
+                RTHttpFreeResponse(pvResponse);
+            }
+
+            break;
+        }
+        default:
+            break;
     }
 
@@ -749,5 +806,5 @@
 
     /* Constructor: */
-    UINetworkReplyPrivate(const QNetworkRequest &request)
+    UINetworkReplyPrivate(const QNetworkRequest &request, UINetworkRequestType type)
         : m_error(QNetworkReply::NoError)
         , m_pThread(0)
@@ -756,5 +813,5 @@
         m_strErrorTemplate = tr("%1: %2", "Context description: Error description");
         /* Create and run network-reply thread: */
-        m_pThread = new UINetworkReplyPrivateThread(request);
+        m_pThread = new UINetworkReplyPrivateThread(request, type);
         connect(m_pThread, SIGNAL(finished()), this, SLOT(sltFinished()));
         m_pThread->start();
@@ -802,4 +859,7 @@
     /* API: Reply getter: */
     QByteArray readAll() { return m_pThread->readAll(); }
+
+    /** Returns value for the cached reply header of the passed @a type. */
+    QString header(QNetworkRequest::KnownHeaders type) const { return m_pThread->header(type); }
 
 private slots:
@@ -854,4 +914,9 @@
             m_pReply = gNetworkManager->head(request);
             break;
+        /* Prepare our network-reply (HEAD): */
+        case UINetworkRequestType_HEAD_Our:
+            m_replyType = UINetworkReplyType_Our;
+            m_pReply = new UINetworkReplyPrivate(request, UINetworkRequestType_HEAD_Our);
+            break;
         /* Prepare Qt network-reply (GET): */
         case UINetworkRequestType_GET:
@@ -862,5 +927,5 @@
         case UINetworkRequestType_GET_Our:
             m_replyType = UINetworkReplyType_Our;
-            m_pReply = new UINetworkReplyPrivate(request);
+            m_pReply = new UINetworkReplyPrivate(request, UINetworkRequestType_GET_Our);
             break;
     }
@@ -887,5 +952,5 @@
     {
         case UINetworkReplyType_Qt: result = qobject_cast<QNetworkReply*>(m_pReply)->header(header); break;
-        case UINetworkReplyType_Our: /* TODO: header() */ break;
+        case UINetworkReplyType_Our: result = qobject_cast<UINetworkReplyPrivate*>(m_pReply)->header(header); break;
     }
     return result;
