Index: /trunk/include/iprt/http.h
===================================================================
--- /trunk/include/iprt/http.h	(revision 73698)
+++ /trunk/include/iprt/http.h	(revision 73699)
@@ -60,4 +60,13 @@
 
 /**
+ * Resets a HTTP client instance.
+ *
+ * @returns iprt status code.
+ *
+ * @param   hHttp      Handle to the HTTP interface.
+ */
+RTR3DECL(int) RTHttpReset(RTHTTP hHttp);
+
+/**
  * Destroys a HTTP client instance.
  *
@@ -310,4 +319,40 @@
 RTR3DECL(int) RTHttpSetDownloadProgressCallback(RTHTTP hHttp, PRTHTTPDOWNLDPROGRCALLBACK pfnDownloadProgress, void *pvUser);
 
+// ----8<--------8<---- XXX: uwe: quick and dirty curl wrappers for OCI
+
+typedef DECLCALLBACK(size_t) RTHTTPREADCALLBACK(void *pbDst, size_t cbItem, size_t cItems, void *pvUser);
+typedef RTHTTPREADCALLBACK *PRTHTTPREADCALLBACK;
+
+#define RT_HTTP_READCALLBACK_ABORT 0x10000000 /* CURL_READFUNC_ABORT */
+
+RTR3DECL(int) RTHttpSetReadCallback(RTHTTP hHttp, PRTHTTPREADCALLBACK pfnRead, void *pvUser);
+
+
+typedef DECLCALLBACK(size_t) RTHTTPWRITECALLBACK(char *pbSrc, size_t cbItem, size_t cItems, void *pvUser);
+typedef RTHTTPWRITECALLBACK *PRTHTTPWRITECALLBACK;
+
+RTR3DECL(int) RTHttpSetWriteCallback(RTHTTP hHttp, PRTHTTPWRITECALLBACK pfnWrite, void *pvUser);
+RTR3DECL(int) RTHttpSetWriteHeaderCallback(RTHTTP hHttp, PRTHTTPWRITECALLBACK pfnWrite, void *pvUser);
+
+
+/* these are thin wrappers for setting one or a few related curl options */
+RTR3DECL(int) RTHttpRawSetUrl(RTHTTP hHttp, const char *pszUrl);
+
+RTR3DECL(int) RTHttpRawSetGet(RTHTTP hHttp);
+RTR3DECL(int) RTHttpRawSetHead(RTHTTP hHttp);
+RTR3DECL(int) RTHttpRawSetPost(RTHTTP hHttp);
+RTR3DECL(int) RTHttpRawSetPut(RTHTTP hHttp);
+RTR3DECL(int) RTHttpRawSetDelete(RTHTTP hHttp);
+RTR3DECL(int) RTHttpRawSetCustomRequest(RTHTTP hHttp, const char *pszVerb);
+
+RTR3DECL(int) RTHttpRawSetPostFields(RTHTTP hHttp, const void *pv, size_t cb);
+RTR3DECL(int) RTHttpRawSetInfileSize(RTHTTP hHttp, RTFOFF cb);
+
+RTR3DECL(int) RTHttpRawSetVerbose(RTHTTP hHttp, bool fValue);
+RTR3DECL(int) RTHttpRawSetTimeout(RTHTTP hHttp, long sec);
+
+RTR3DECL(int) RTHttpRawPerform(RTHTTP hHttp);
+
+RTR3DECL(int) RTHttpRawGetResponseCode(RTHTTP hHttp, long *plCode);
 
 /** @} */
Index: /trunk/src/VBox/Runtime/generic/http-curl.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/http-curl.cpp	(revision 73698)
+++ /trunk/src/VBox/Runtime/generic/http-curl.cpp	(revision 73699)
@@ -293,4 +293,20 @@
     curl_global_cleanup();
     return rc;
+}
+
+
+RTR3DECL(int) RTHttpReset(RTHTTP hHttp)
+{
+    if (hHttp == NIL_RTHTTP)
+        return VERR_INVALID_HANDLE;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    AssertReturn(!pThis->fBusy, VERR_WRONG_ORDER);
+
+    /* This resets options, but keeps open connections, cookies, etc. */
+    curl_easy_reset(pThis->pCurl);
+    return VINF_SUCCESS;
 }
 
@@ -2569,2 +2585,255 @@
     return VINF_SUCCESS;
 }
+
+
+
+RTR3DECL(int) RTHttpSetReadCallback(RTHTTP hHttp, PRTHTTPREADCALLBACK pfnRead, void *pvUser)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_READFUNCTION, pfnRead);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_READDATA, pvUser);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;    
+}
+
+
+RTR3DECL(int) RTHttpSetWriteCallback(RTHTTP hHttp, PRTHTTPWRITECALLBACK pfnWrite, void *pvUser)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEFUNCTION, pfnWrite);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEDATA, pvUser);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;    
+}
+
+
+RTR3DECL(int) RTHttpSetWriteHeaderCallback(RTHTTP hHttp, PRTHTTPWRITECALLBACK pfnWrite, void *pvUser)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HEADERFUNCTION, pfnWrite);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HEADERDATA, pvUser);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;    
+}
+
+
+RTR3DECL(int) RTHttpRawSetUrl(RTHTTP hHttp, const char *pszUrl)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_URL, pszUrl);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetGet(RTHTTP hHttp)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HTTPGET, 1L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetHead(RTHTTP hHttp)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HTTPGET, 1L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_NOBODY, 1L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetPost(RTHTTP hHttp)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_POST, 1L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetPut(RTHTTP hHttp)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PUT, 1L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetDelete(RTHTTP hHttp)
+{
+    /* curl doesn't provide an option for this */
+    return RTHttpRawSetCustomRequest(hHttp, "DELETE");
+}
+
+
+RTR3DECL(int) RTHttpRawSetCustomRequest(RTHTTP hHttp, const char *pszVerb)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_CUSTOMREQUEST, pszVerb);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetPostFields(RTHTTP hHttp, const void *pv, size_t cb)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_POSTFIELDSIZE, cb);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_POSTFIELDS, pv);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+RTR3DECL(int) RTHttpRawSetInfileSize(RTHTTP hHttp, RTFOFF cb)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_INFILESIZE_LARGE, cb);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetVerbose(RTHTTP hHttp, bool fValue)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_VERBOSE, fValue ? 1L : 0L);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawSetTimeout(RTHTTP hHttp, long sec)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_TIMEOUT, sec);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawPerform(RTHTTP hHttp)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rcCurl = curl_easy_perform(pThis->pCurl);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpRawGetResponseCode(RTHTTP hHttp, long *plCode)
+{
+    CURLcode rcCurl;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+    AssertPtrReturn(plCode, VERR_INVALID_PARAMETER);
+
+    rcCurl = curl_easy_getinfo(pThis->pCurl, CURLINFO_RESPONSE_CODE, plCode);
+    if (rcCurl != CURLE_OK)
+        return VERR_HTTP_CURL_ERROR;
+
+    return VINF_SUCCESS;
+}
