Index: /trunk/include/iprt/http.h
===================================================================
--- /trunk/include/iprt/http.h	(revision 51634)
+++ /trunk/include/iprt/http.h	(revision 51635)
@@ -72,5 +72,17 @@
  *                         '\0'-terminated.
  */
-RTR3DECL(int) RTHttpGet(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse);
+RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse);
+
+/**
+ * Perform a simple blocking HTTP request.
+ *
+ * @returns iprt status code.
+ *
+ * @param    hHttp         HTTP interface handle.
+ * @param    pcszUrl       URL.
+ * @param    ppvResponse   HTTP response.
+ * @param    pcb           Size of the returned buffer.
+ */
+RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pcszUrl, void **ppvResponse, size_t *pcb);
 
 /**
Index: /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 51634)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp	(revision 51635)
@@ -269,7 +269,7 @@
     /* Perform blocking HTTP GET request: */
     char *pszBuf = 0;
-    int rc = RTHttpGet(pHttp,
-                       request.url().toString().toAscii().constData(),
-                       &pszBuf);
+    int rc = RTHttpGetText(pHttp,
+                           request.url().toString().toAscii().constData(),
+                           &pszBuf);
     reply = QByteArray(pszBuf);
     RTMemFree(pszBuf);
Index: /trunk/src/VBox/Runtime/common/misc/http.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/misc/http.cpp	(revision 51634)
+++ /trunk/src/VBox/Runtime/common/misc/http.cpp	(revision 51635)
@@ -66,5 +66,5 @@
 typedef struct RTHTTPMEMCHUNK
 {
-    char *pszMem;
+    uint8_t *pu8Mem;
     size_t cb;
 } RTHTTPMEMCHUNK;
@@ -146,10 +146,10 @@
     size_t cbAll = cb * n;
 
-    pMem->pszMem = (char*)RTMemRealloc(pMem->pszMem, pMem->cb + cbAll + 1);
-    if (pMem->pszMem)
-    {
-        memcpy(&pMem->pszMem[pMem->cb], pvBuf, cbAll);
+    pMem->pu8Mem = (uint8_t*)RTMemRealloc(pMem->pu8Mem, pMem->cb + cbAll + 1);
+    if (pMem->pu8Mem)
+    {
+        memcpy(&pMem->pu8Mem[pMem->cb], pvBuf, cbAll);
         pMem->cb += cbAll;
-        pMem->pszMem[pMem->cb] = '\0';
+        pMem->pu8Mem[pMem->cb] = '\0';
     }
     return cbAll;
@@ -414,5 +414,5 @@
 }
 
-RTR3DECL(int) RTHttpGet(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
+RTR3DECL(int) rtHttpGet(RTHTTP hHttp, const char *pcszUrl, uint8_t **ppvResponse, size_t *pcb)
 {
     PRTHTTPINTERNAL pHttpInt = hHttp;
@@ -460,7 +460,24 @@
     rcCurl = curl_easy_perform(pHttpInt->pCurl);
     int rc = rtHttpGetCalcStatus(pHttpInt, rcCurl);
-    *ppszResponse = chunk.pszMem;
+    *ppvResponse = chunk.pu8Mem;
+    *pcb = chunk.cb;
 
     return rc;
+}
+
+
+RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
+{
+    uint8_t *pv;
+    size_t cb;
+    int rc = rtHttpGet(hHttp, pcszUrl, &pv, &cb);
+    *ppszResponse = (char*)pv;
+    return rc;
+}
+
+
+RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pcszUrl, void **ppvResponse, size_t *pcb)
+{
+    return rtHttpGet(hHttp, pcszUrl, (uint8_t**)ppvResponse, pcb);
 }
 
Index: /trunk/src/VBox/Runtime/testcase/tstRTHttp.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstRTHttp.cpp	(revision 51634)
+++ /trunk/src/VBox/Runtime/testcase/tstRTHttp.cpp	(revision 51635)
@@ -74,7 +74,7 @@
     // using an intermediate cert which is signed by old root)
     if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem",
-                       &pszBuf);
+        rc = RTHttpGetText(hHttp,
+                           "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem",
+                           &pszBuf);
     if (RT_SUCCESS(rc) && pszBuf)
     {
@@ -146,7 +146,7 @@
     // fetch root CA certificate (old one, but still very widely used)
     if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem",
-                       &pszBuf);
+        rc = RTHttpGetText(hHttp,
+                           "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem",
+                           &pszBuf);
     if (RT_SUCCESS(rc) && pszBuf)
     {
@@ -227,7 +227,7 @@
 
     if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "https://update.virtualbox.org/query.php?platform=LINUX_32BITS_UBUNTU_12_04&version=4.1.18",
-                       &pszBuf);
+        rc = RTHttpGetText(hHttp,
+                           "https://update.virtualbox.org/query.php?platform=LINUX_32BITS_UBUNTU_12_04&version=4.1.18",
+                           &pszBuf);
 
     if (   RT_FAILURE(rc)
@@ -246,4 +246,16 @@
     }
 
+    void *u8Buf;
+    size_t cb;
+    rc = RTHttpGetBinary(hHttp,
+                         "http://www.verisign.com/support/roots.zip",
+                         &u8Buf, &cb);
+    if (RT_SUCCESS(rc) && u8Buf)
+    {
+        RTPrintf("Got file length %zd\n", cb);
+    }
+    else
+        RTPrintf("Error code %Rrc\n", rc);
+
     RTHttpDestroy(hHttp);
 
