Changeset 6876 for TI12-security/trunk


Ignore:
Timestamp:
21/05/10 11:27:25 (10 years ago)
Author:
pjkersha
Message:

Added

  • shell scripts to set the environment variables and run the executable
  • Makefile
  • main program ncopen.c to test the code
  • more info in README
  • a new patch for the netCDF 4.1.1.
Location:
TI12-security/trunk/NDGSecurity/C/openDapPatch
Files:
6 added
3 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDGSecurity/C/openDapPatch

    • Property svn:ignore set to
      ncopen
      proxy.pem
      user.pem
      ca
      cookie.txt
  • TI12-security/trunk/NDGSecurity/C/openDapPatch/README

    r6834 r6876  
    11This version of http for the netcdf/oc library allows settings 
    22of security certificates using environment variables 
     3 
     4NetCDF version 4.1.1 used.  configure with curl to enable OPeNDAP functionality: 
     5 
     6$ ./configure --with-curl-config=/usr/bin/curl-config 
     7 
     8The example will work with proxy or standard X.509 certificates. 
  • TI12-security/trunk/NDGSecurity/C/openDapPatch/http.c

    r6834 r6876  
    1212static size_t WriteFileCallback(void*, size_t, size_t, void*); 
    1313static size_t WriteMemoryCallback(void*, size_t, size_t, void*); 
     14static int ocsetcurlproperties(CURL* curl, const char*); 
    1415 
    1516struct Fetchdata { 
     
    3031 
    3132int 
    32 ocfetchurl_file(CURL* curl, char* url, FILE* stream, unsigned long* sizep) 
     33ocfetchurl_file(CURL* curl, char* url, FILE* stream, 
     34                unsigned long* sizep, long* filetime) 
    3335{ 
    3436        int stat = OC_NOERR; 
     
    3739 
    3840 
    39         /* These four conditionals look for value in four globals set when the 
    40          * .dodsrc file was read. 
    41          */ 
    42         if (dods_verify) { 
    43                 if (set_verify(curl) != OC_NOERR) 
    44                         goto fail; 
    45         } 
    46         if (dods_compress) { 
    47                 if (set_compression(curl) != OC_NOERR) 
    48                         goto fail; 
    49         } 
    50         if (pstructProxy) { 
    51                 if (set_proxy(curl, pstructProxy) != OC_NOERR) 
    52                         goto fail; 
    53         } 
    54         if (cook) { 
    55                 if (set_cookies(curl, cook) != OC_NOERR) 
    56                         goto fail; 
    57         } 
    58  
    59         if (credentials_in_url(url)) { 
    60                 char *result_url = NULL; 
    61                 if (extract_credentials(url, &userName, &password, &result_url) != OC_NOERR) 
    62                         goto fail; 
    63                 url = result_url; 
    64         } 
    65  
    66         if (userName && password) { 
    67                 if (set_user_password(curl, userName, password) != OC_NOERR) 
    68                         goto fail; 
    69         } 
     41        if((stat = ocsetcurlproperties(curl,url)) != OC_NOERR) goto fail; 
    7042 
    7143        /* Set the URL */ 
     
    8355        if (cstat != CURLE_OK) 
    8456                goto fail; 
     57 
     58        /* One last thing; always try to get the last modified time */ 
     59        cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); 
    8560 
    8661        fetchdata.stream = stream; 
     
    9570                if (sizep != NULL) 
    9671                        *sizep = fetchdata.size; 
     72                /* Get the last modified time */ 
     73                if(filetime != NULL) 
     74                    cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); 
     75                if(cstat != CURLE_OK) goto fail; 
    9776        } 
    9877        return THROW(stat); 
    9978 
    100         fail: oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
     79fail: oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
    10180        return THROW(OC_ECURL); 
    10281} 
    10382 
    10483int 
    105 ocfetchurl(CURL* curl, char* url, OCbytes* buf) 
     84ocfetchurl(CURL* curl, char* url, OCbytes* buf, long* filetime) 
    10685{ 
    10786        int stat = OC_NOERR; 
     
    10988        size_t len; 
    11089 
    111         /* These conditionals look for value in four globals set when the 
    112          * .dodsrc file was read. 
    113          */ 
    114         if (dods_verify) { 
    115                 if (set_verify(curl) != OC_NOERR) 
    116                         goto fail; 
    117         } 
    118         if (dods_compress) { 
    119                 if (set_compression(curl) != OC_NOERR) 
    120                         goto fail; 
    121         } 
    122         if (pstructProxy) { 
    123                 if (set_proxy(curl, pstructProxy) != OC_NOERR) 
    124                         goto fail; 
    125         } 
    126         if (cook) { 
    127                 if (set_cookies(curl, cook) != OC_NOERR) 
    128                         goto fail; 
    129         } 
    130  
    131         if (credentials_in_url(url)) { 
    132                 char *result_url = NULL; 
    133                 if (extract_credentials(url, &userName, &password, &result_url) != OC_NOERR) 
    134                         goto fail; 
    135                 url = result_url; 
    136         } 
    137  
    138         if (userName && password) { 
    139                 if (set_user_password(curl, userName, password) != OC_NOERR) 
    140                         goto fail; 
    141         } 
     90        if((stat = ocsetcurlproperties(curl,url)) != OC_NOERR) goto fail; 
    14291 
    14392        /* Set the URL */ 
     
    156105                goto fail; 
    157106 
     107        /* One last thing; always try to get the last modified time */ 
     108        cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); 
     109 
    158110        cstat = curl_easy_perform(curl); 
    159         if (cstat != CURLE_OK) { 
    160             goto fail; 
    161         } 
     111        if(cstat == CURLE_PARTIAL_FILE) { 
     112            /* Log it but otherwise ignore */ 
     113            oc_log(LOGWARN, "curl error: %s; ignored", 
     114                   curl_easy_strerror(cstat)); 
     115            cstat = CURLE_OK; 
     116        } 
     117        if(cstat != CURLE_OK) goto fail; 
     118 
     119        /* Get the last modified time */ 
     120        if(filetime != NULL) 
     121            cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); 
     122        if(cstat != CURLE_OK) goto fail; 
    162123 
    163124        /* Null terminate the buffer*/ 
     
    168129        return THROW(stat); 
    169130 
    170 fail: oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
     131fail: 
     132        oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
    171133        return THROW(OC_ECURL); 
    172134} 
     
    182144                fetchdata->size += (count * size); 
    183145        } 
     146#ifdef OCPROGRESS 
     147        oc_log(LOGNOTE,"callback: %lu bytes",(unsigned long)(size*nmemb)); 
     148#endif 
    184149        return count; 
    185150} 
    186151 
    187152static size_t 
    188 WriteMemoryCallback(void *ptr, size_t size, size_t nmemb,       void *data) 
     153WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) 
    189154{ 
    190155        size_t realsize = size * nmemb; 
    191156        OCbytes* buf = (OCbytes*) data; 
     157if(realsize == 0) 
     158oc_log(LOGWARN,"WriteMemoryCallback: zero sized chunk"); 
     159        /* Optimize for reading potentially large dods datasets */ 
     160        if(!ocbytesavail(buf,realsize)) { 
     161            /* double the size of the packet */ 
     162            ocbytessetalloc(buf,2*ocbytesalloc(buf)); 
     163        } 
    192164        ocbytesappendn(buf, ptr, realsize); 
    193165        return realsize; 
     
    300272 
    301273int 
    302 curlopen(CURL** curlp) 
     274occurlopen(CURL** curlp) 
    303275{ 
    304276        int stat = OC_NOERR; 
     
    321293                if (cstat != CURLE_OK) 
    322294                        stat = OC_ECURL; 
    323                  
    324         } 
    325          
     295        } 
    326296        if (curlp) 
    327297                *curlp = curl; 
     
    330300 
    331301void 
    332 curlclose(CURL* curl) 
     302occurlclose(CURL* curl) 
    333303{ 
    334304        if (curl != NULL) 
    335305                curl_easy_cleanup(curl); 
    336306} 
     307 
     308static int 
     309ocsetcurlproperties(CURL* curl, const char* url) 
     310{ 
     311    CURLcode cstat = CURLE_OK; 
     312    /* These conditionals look for value in four globals set when the 
     313     * .dodsrc file was read. 
     314     */ 
     315    if (dods_verify) { 
     316        if (set_verify(curl) != OC_NOERR) 
     317            goto fail; 
     318    } 
     319    if (dods_compress) { 
     320        if (set_compression(curl) != OC_NOERR) 
     321            goto fail; 
     322    } 
     323    if (pstructProxy) { 
     324        if (set_proxy(curl, pstructProxy) != OC_NOERR) 
     325            goto fail; 
     326    } 
     327    if (cook) { 
     328        if (set_cookies(curl, cook) != OC_NOERR) 
     329            goto fail; 
     330    } 
     331 
     332    if (credentials_in_url(url)) { 
     333        char *result_url = NULL; 
     334        if (extract_credentials(url, &userName, &password, &result_url) != OC_NOERR) 
     335            goto fail; 
     336        url = result_url; 
     337    } 
     338 
     339    if (userName && password) { 
     340        if (set_user_password(curl, userName, password) != OC_NOERR) 
     341            goto fail; 
     342    } 
     343    return OC_NOERR; 
     344 
     345fail: 
     346    oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
     347    return THROW(OC_ECURL); 
     348} 
     349 
     350int 
     351ocfetchlastmodified(CURL* curl, char* url, long* filetime) 
     352{ 
     353    int stat = OC_NOERR; 
     354    CURLcode cstat = CURLE_OK; 
     355    size_t len; 
     356 
     357    if((stat = ocsetcurlproperties(curl,url)) != OC_NOERR) goto fail; 
     358 
     359    /* Set the URL */ 
     360    cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url); 
     361    if (cstat != CURLE_OK) 
     362        goto fail; 
     363 
     364    /* Ask for head */ 
     365    cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); /* 30sec timeout*/ 
     366    cstat = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); 
     367    cstat = curl_easy_setopt(curl, CURLOPT_HEADER, 1); 
     368    cstat = curl_easy_setopt(curl, CURLOPT_NOBODY, 1); 
     369    cstat = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); 
     370    cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); 
     371 
     372    cstat = curl_easy_perform(curl); 
     373    if(cstat != CURLE_OK) goto fail; 
     374    if(filetime != NULL) 
     375        cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); 
     376    if(cstat != CURLE_OK) goto fail; 
     377 
     378    return THROW(stat); 
     379 
     380fail: 
     381    oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); 
     382    return THROW(OC_ECURL); 
     383} 
Note: See TracChangeset for help on using the changeset viewer.