VirtualBox

Ignore:
Timestamp:
Aug 28, 2015 6:57:36 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
102405
Message:

IPRT,QtGui: Redid the certificate download code in the GUI and reduced the number of unnecessary wrapper methods. Removed RTHttpCertDigest, adding RTHttpFreeResponse and RTHttpFreeResponseText. Also added RTCrPemParseContent.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/http.cpp

    r57516 r57577  
    4141
    4242#include <curl/curl.h>
    43 #include <openssl/ssl.h>
    4443#include "internal/magics.h"
    4544
     
    6968typedef struct RTHTTPMEMCHUNK
    7069{
    71     uint8_t *pu8Mem;
    72     size_t cb;
     70    uint8_t    *pu8Mem;
     71    size_t      cb;
    7372} RTHTTPMEMCHUNK;
    7473typedef RTHTTPMEMCHUNK *PRTHTTPMEMCHUNK;
     
    122121}
    123122
     123
    124124RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp)
    125125{
     
    147147    curl_global_cleanup();
    148148}
     149
    149150
    150151static DECLCALLBACK(size_t) rtHttpWriteData(void *pvBuf, size_t cb, size_t n, void *pvUser)
     
    163164}
    164165
    165 static DECLCALLBACK(int) rtHttpProgress(void *pData, double DlTotal, double DlNow,
    166                                         double UlTotal, double UlNow)
     166
     167static DECLCALLBACK(int) rtHttpProgress(void *pData, double DlTotal, double DlNow, double UlTotal, double UlNow)
    167168{
    168169    PRTHTTPINTERNAL pHttpInt = (PRTHTTPINTERNAL)pData;
     
    172173}
    173174
     175
    174176RTR3DECL(int) RTHttpAbort(RTHTTP hHttp)
    175177{
     
    181183    return VINF_SUCCESS;
    182184}
     185
    183186
    184187RTR3DECL(int) RTHttpGetRedirLocation(RTHTTP hHttp, char **ppszRedirLocation)
     
    193196    return VINF_SUCCESS;
    194197}
     198
    195199
    196200RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp)
     
    229233}
    230234
     235
    231236RTR3DECL(int) RTHttpSetProxy(RTHTTP hHttp, const char *pcszProxy, uint32_t uPort,
    232237                             const char *pcszProxyUser, const char *pcszProxyPwd)
     
    260265    return VINF_SUCCESS;
    261266}
     267
    262268
    263269RTR3DECL(int) RTHttpSetHeaders(RTHTTP hHttp, size_t cHeaders, const char * const *papszHeaders)
     
    286292}
    287293
    288 RTR3DECL(int) RTHttpCertDigest(RTHTTP hHttp, char *pcszCert, size_t cbCert,
    289                                uint8_t **pabSha1,   size_t *pcbSha1,
    290                                uint8_t **pabSha512, size_t *pcbSha512)
    291 {
    292     int rc = VINF_SUCCESS;
    293 
    294     BIO *cert = BIO_new_mem_buf(pcszCert, (int)cbCert);
    295     if (cert)
    296     {
    297         X509 *crt = NULL;
    298         if (PEM_read_bio_X509(cert, &crt, NULL, NULL))
    299         {
    300             unsigned cb;
    301             unsigned char md[EVP_MAX_MD_SIZE];
    302 
    303             int rc1 = X509_digest(crt, EVP_sha1(), md, &cb);
    304             if (rc1 > 0)
    305             {
    306                 *pabSha1 = (uint8_t*)RTMemAlloc(cb);
    307                 if (*pabSha1)
    308                 {
    309                     memcpy(*pabSha1, md, cb);
    310                     *pcbSha1 = cb;
    311 
    312                     rc1 = X509_digest(crt, EVP_sha512(), md, &cb);
    313                     if (rc1 > 0)
    314                     {
    315                         *pabSha512 = (uint8_t*)RTMemAlloc(cb);
    316                         if (*pabSha512)
    317                         {
    318                             memcpy(*pabSha512, md, cb);
    319                             *pcbSha512 = cb;
    320                         }
    321                         else
    322                             rc = VERR_NO_MEMORY;
    323                     }
    324                     else
    325                         rc = VERR_HTTP_CACERT_WRONG_FORMAT;
    326 
    327                     if (RT_FAILURE(rc))
    328                         RTMemFree(*pabSha1);
    329                 }
    330                 else
    331                     rc = VERR_NO_MEMORY;
    332             }
    333             else
    334                 rc = VERR_HTTP_CACERT_WRONG_FORMAT;
    335             X509_free(crt);
    336         }
    337         else
    338             rc = VERR_HTTP_CACERT_WRONG_FORMAT;
    339         BIO_free(cert);
    340     }
    341     else
    342         rc = VERR_INTERNAL_ERROR;
    343 
    344     return rc;
    345 }
    346294
    347295RTR3DECL(int) RTHttpSetCAFile(RTHTTP hHttp, const char *pcszCAFile)
     
    449397}
    450398
     399
     400/**
     401 * Internal worker that performs a HTTP GET.
     402 *
     403 * @returns IPRT status code.
     404 * @param   hHttp               The HTTP instance.
     405 * @param   pcszUrl             The URL.
     406 * @param   ppvResponse         Where to return the pointer to the allocated
     407 *                              response data (RTMemFree).  There will always be
     408 *                              an zero terminator char after the response, that
     409 *                              is not part of the size returned via @a pcb.
     410 * @param   pcb                 The size of the response data.
     411 */
    451412RTR3DECL(int) rtHttpGet(RTHTTP hHttp, const char *pcszUrl, uint8_t **ppvResponse, size_t *pcb)
    452413{
     
    476437    }
    477438
    478     RTHTTPMEMCHUNK chunk = { NULL, 0 };
     439    RTHTTPMEMCHUNK Chunk = { NULL, 0 };
    479440    rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_WRITEFUNCTION, &rtHttpWriteData);
    480441    if (CURL_FAILED(rcCurl))
    481442        return VERR_INTERNAL_ERROR;
    482     rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_WRITEDATA, (void*)&chunk);
     443    rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_WRITEDATA, (void *)&Chunk);
    483444    if (CURL_FAILED(rcCurl))
    484445        return VERR_INTERNAL_ERROR;
     
    486447    if (CURL_FAILED(rcCurl))
    487448        return VERR_INTERNAL_ERROR;
    488     rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROGRESSDATA, (void*)pHttpInt);
     449    rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROGRESSDATA, (void *)pHttpInt);
    489450    if (CURL_FAILED(rcCurl))
    490451        return VERR_INTERNAL_ERROR;
     
    497458
    498459    rcCurl = curl_easy_perform(pHttpInt->pCurl);
     460
    499461    int rc = rtHttpGetCalcStatus(pHttpInt, rcCurl);
    500     *ppvResponse = chunk.pu8Mem;
    501     *pcb = chunk.cb;
     462    if (RT_SUCCESS(rc))
     463    {
     464        *ppvResponse = Chunk.pu8Mem;
     465        *pcb         = Chunk.cb;
     466    }
     467    else
     468    {
     469        if (Chunk.pu8Mem)
     470            RTMemFree(Chunk.pu8Mem);
     471        *ppvResponse = NULL;
     472        *pcb         = 0;
     473    }
    502474
    503475    return rc;
     
    505477
    506478
    507 RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
     479RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszNotUtf8)
    508480{
    509481    uint8_t *pv;
    510     size_t cb;
     482    size_t   cb;
    511483    int rc = rtHttpGet(hHttp, pcszUrl, &pv, &cb);
    512     *ppszResponse = (char*)pv;
     484    if (RT_SUCCESS(rc))
     485    {
     486        if (pv) /* paranoia */
     487            *ppszNotUtf8 = (char *)pv;
     488        else
     489            *ppszNotUtf8 = (char *)RTMemDup("", 1);
     490    }
     491    else
     492        *ppszNotUtf8 = NULL;
    513493    return rc;
    514494}
    515495
    516496
     497RTR3DECL(void) RTHttpFreeResponseText(char *pszNotUtf8)
     498{
     499    RTMemFree(pszNotUtf8);
     500}
     501
     502
    517503RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pcszUrl, void **ppvResponse, size_t *pcb)
    518504{
    519     return rtHttpGet(hHttp, pcszUrl, (uint8_t**)ppvResponse, pcb);
     505    return rtHttpGet(hHttp, pcszUrl, (uint8_t **)ppvResponse, pcb);
     506}
     507
     508
     509RTR3DECL(void) RTHttpFreeResponse(void *pvResponse)
     510{
     511    RTMemFree(pvResponse);
    520512}
    521513
     
    570562    if (CURL_FAILED(rcCurl))
    571563        return VERR_INTERNAL_ERROR;
    572     rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROGRESSDATA, (void*)pHttpInt);
     564    rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROGRESSDATA, (void *)pHttpInt);
    573565    if (CURL_FAILED(rcCurl))
    574566        return VERR_INTERNAL_ERROR;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette