Changeset 29122 for trunk/base


Ignore:
Timestamp:
Sep 15, 2007, 12:07:48 PM (12 years ago)
Author:
afb@…
Message:

add getsize command to tcl curl

Location:
trunk/base/src/pextlib1.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/pextlib1.0/curl.c

    r28745 r29122  
    578578
    579579/**
     580 * curl getsize subcommand entry point.
     581 *
     582 * @param interp                current interpreter
     583 * @param objc                  number of parameters
     584 * @param objv                  parameters
     585 */
     586int
     587CurlGetSizeCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
     588{
     589        int theResult = TCL_OK;
     590        CURL* theHandle = NULL;
     591        FILE* theFile = NULL;
     592
     593        do {
     594                char theSizeString[32];
     595                const char* theURL;
     596                CURLcode theCurlCode;
     597                double theFileSize;
     598                               
     599                /*      first (second) parameter is the url */
     600                if (objc != 3) {
     601                        Tcl_WrongNumArgs(interp, 1, objv, "getsize url");
     602                        theResult = TCL_ERROR;
     603                        break;
     604                }
     605
     606                /* Retrieve the url */
     607                theURL = Tcl_GetString(objv[2]);
     608
     609                /* Open the file (dev/null) */
     610                theFile = fopen( "/dev/null", "a" );
     611                if (theFile == NULL) {
     612                        Tcl_SetResult(interp, strerror(errno), TCL_VOLATILE);
     613                        theResult = TCL_ERROR;
     614                }
     615
     616                /* Create the CURL handle */
     617                theHandle = curl_easy_init();
     618               
     619                /* Setup the handle */
     620                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_URL, theURL);
     621                if (theCurlCode != CURLE_OK) {
     622                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     623                        break;
     624                }
     625               
     626                /* -L option */
     627                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_FOLLOWLOCATION, 1);
     628                if (theCurlCode != CURLE_OK) {
     629                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     630                        break;
     631                }
     632
     633                /* -f option */
     634                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_FAILONERROR, 1);
     635                if (theCurlCode != CURLE_OK) {
     636                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     637                        break;
     638                }
     639
     640                /* set timeout on connections */
     641                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_TIMEOUT, _CURL_CONNECTION_TIMEOUT);
     642                if (theCurlCode != CURLE_OK) {
     643                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     644                        break;
     645                }
     646
     647                /* set minimum connection speed */
     648                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_LOW_SPEED_LIMIT, _CURL_MINIMUM_XFER_SPEED);
     649                if (theCurlCode != CURLE_OK) {
     650                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     651                        break;
     652                }
     653
     654                /* set timeout interval for connections < min xfer speed */
     655                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_LOW_SPEED_TIME, _CURL_MINIMUM_XFER_TIMEOUT);
     656                if (theCurlCode != CURLE_OK) {
     657                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     658                        break;
     659                }
     660
     661                /* write to the file */
     662                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_WRITEDATA, theFile);
     663                if (theCurlCode != CURLE_OK) {
     664                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     665                        break;
     666                }
     667
     668                /* skip the header data */
     669                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_HEADER, 0);
     670                if (theCurlCode != CURLE_OK) {
     671                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     672                        break;
     673                }
     674               
     675                /* skip the body data */
     676                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_NOBODY, 1);
     677                if (theCurlCode != CURLE_OK) {
     678                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     679                        break;
     680                }
     681
     682                /* we do not want any progress */
     683                theCurlCode = curl_easy_setopt(theHandle, CURLOPT_NOPROGRESS, 1);
     684                if (theCurlCode != CURLE_OK) {
     685                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     686                        break;
     687                }
     688               
     689                /* actually fetch the resource */
     690                theCurlCode = curl_easy_perform(theHandle);
     691                if (theCurlCode != CURLE_OK) {
     692                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     693                        break;
     694                }
     695               
     696                /* close the file */
     697                (void) fclose( theFile );
     698                theFile = NULL;
     699
     700                theFileSize = 0.0;
     701
     702                /* get the file size */
     703                theCurlCode = curl_easy_getinfo(theHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &theFileSize);
     704                if (theCurlCode != CURLE_OK) {
     705                        theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
     706                        break;
     707                }
     708       
     709                /* clean up */
     710                curl_easy_cleanup( theHandle );
     711                theHandle = NULL;
     712
     713                (void) snprintf(theSizeString, sizeof(theSizeString),
     714                        "%.0f", theFileSize);
     715                Tcl_SetResult(interp, theSizeString, TCL_VOLATILE);
     716    } while (0);
     717   
     718    if (theHandle != NULL) {
     719        curl_easy_cleanup( theHandle );
     720    }
     721    if (theFile != NULL) {
     722        fclose( theFile );
     723    }
     724   
     725        return theResult;
     726}
     727
     728/**
    580729 * curl command entry point.
    581730 *
     
    594743    typedef enum {
    595744        kCurlFetch,
    596         kCurlIsNewer
     745        kCurlIsNewer,
     746        kCurlGetSize
    597747    } EOption;
    598748   
    599749        static tableEntryString options[] = {
    600                 "fetch", "isnewer", NULL
     750                "fetch", "isnewer", "getsize", NULL
    601751        };
    602752        int theResult = TCL_OK;
     
    625775                                theResult = CurlIsNewerCmd(interp, objc, objv);
    626776                                break;
     777
     778                        case kCurlGetSize:
     779                                theResult = CurlGetSizeCmd(interp, objc, objv);
     780                                break;
    627781                }
    628782        }
  • trunk/base/src/pextlib1.0/curl.h

    r26177 r29122  
    5555 *      Determine if some resource is newer than date. Try to not fetch the resource
    5656 *  if possible. The date is the number of seconds since epoch.
     57 *
     58 * curl getsize url
     59 *      Determine the file size of some resource. Try to not fetch the resource
     60 *  if possible. The size returned is the the number of bytes.
    5761 */
    5862int CurlCmd(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
Note: See TracChangeset for help on using the changeset viewer.