[113396] trunk/base
jmr at macports.org
jmr at macports.org
Fri Nov 15 05:19:46 PST 2013
Revision: 113396
https://trac.macports.org/changeset/113396
Author: jmr at macports.org
Date: 2013-11-15 05:19:46 -0800 (Fri, 15 Nov 2013)
Log Message:
-----------
merge curl post support from gsoc11-statistics
Modified Paths:
--------------
trunk/base/src/pextlib1.0/curl.c
Property Changed:
----------------
trunk/base/
Property changes on: trunk/base
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/gsoc08-privileges/base:37343-46937
/branches/gsoc09-logging/base:51231-60371
/branches/gsoc11-rev-upgrade/base:78828-88375
/branches/gsoc13-tests:106692-111324
/branches/universal-sanity/base:51872-52323
/branches/variant-descs-14482/base:34469-34855,34900-37508,37511-37512,41040-41463,42575-42626,42640-42659
/users/perry/base-bugs_and_notes:45682-46060
/users/perry/base-select:44044-44692
+ /branches/gsoc08-privileges/base:37343-46937
/branches/gsoc09-logging/base:51231-60371
/branches/gsoc11-rev-upgrade/base:78828-88375
/branches/gsoc11-statistics/base:79520,79666
/branches/gsoc13-tests:106692-111324
/branches/universal-sanity/base:51872-52323
/branches/variant-descs-14482/base:34469-34855,34900-37508,37511-37512,41040-41463,42575-42626,42640-42659
/users/perry/base-bugs_and_notes:45682-46060
/users/perry/base-select:44044-44692
Modified: trunk/base/src/pextlib1.0/curl.c
===================================================================
--- trunk/base/src/pextlib1.0/curl.c 2013-11-15 13:09:48 UTC (rev 113395)
+++ trunk/base/src/pextlib1.0/curl.c 2013-11-15 13:19:46 UTC (rev 113396)
@@ -69,6 +69,7 @@
int CurlFetchCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
int CurlIsNewerCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
int CurlGetSizeCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
+int CurlPostCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
void CurlInit(void);
@@ -911,6 +912,159 @@
}
/**
+ * curl post postdata url
+ *
+ * @param interp current interpreter
+ * @param objc number of parameters
+ * @param objv parameters
+ */
+int
+CurlPostCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
+{
+ int theResult = TCL_OK;
+ CURL* theHandle = NULL;
+ FILE* theFile = NULL;
+
+ do {
+ const char* theURL;
+ const char* thePostData;
+ CURLcode theCurlCode;
+
+ /* check the number of parameters */
+ if (objc != 4) {
+ Tcl_WrongNumArgs(interp, 1, objv, "postdata url");
+ theResult = TCL_ERROR;
+ break;
+ }
+
+ /* Retrieve the url - it is the last parameter */
+ theURL = Tcl_GetString(objv[objc - 1]);
+
+ /* Retrieve the post data - it's before the url */
+ thePostData = Tcl_GetString(objv[objc - 2]);
+ /* Open the file (dev/null) */
+ theFile = fopen( "/dev/null", "a" );
+ if (theFile == NULL) {
+ Tcl_SetResult(interp, strerror(errno), TCL_VOLATILE);
+ theResult = TCL_ERROR;
+ break;
+ }
+
+ /* Create the CURL handle */
+ theHandle = curl_easy_init();
+
+ /* Setup the handle */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_URL, theURL);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* Specify the POST data */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_POSTFIELDS, thePostData);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* -L option */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_FOLLOWLOCATION, 1);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* --max-redirs option, same default as curl command line */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_MAXREDIRS, 50);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* echo any cookies received on a redirect */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_COOKIEJAR, "/dev/null");
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* -f option */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_FAILONERROR, 1);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* set timeout on connections */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_CONNECTTIMEOUT, _CURL_CONNECTION_TIMEOUT);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* set minimum connection speed */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_LOW_SPEED_LIMIT, _CURL_MINIMUM_XFER_SPEED);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* set timeout interval for connections < min xfer speed */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_LOW_SPEED_TIME, _CURL_MINIMUM_XFER_TIMEOUT);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* write to the file */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_WRITEDATA, theFile);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* skip the header data */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_HEADER, 0);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* we do not want any progress */
+ theCurlCode = curl_easy_setopt(theHandle, CURLOPT_NOPROGRESS, 1);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* actually perform the POST */
+ theCurlCode = curl_easy_perform(theHandle);
+ if (theCurlCode != CURLE_OK) {
+ theResult = SetResultFromCurlErrorCode(interp, theCurlCode);
+ break;
+ }
+
+ /* close the file */
+ (void) fclose( theFile );
+ theFile = NULL;
+
+ /* clean up */
+ curl_easy_cleanup( theHandle );
+ theHandle = NULL;
+ } while (0);
+
+ if (theHandle != NULL) {
+ curl_easy_cleanup(theHandle);
+ }
+
+ if (theFile != NULL) {
+ fclose(theFile);
+ }
+
+ return theResult;
+}
+
+/**
* curl command entry point.
*
* @param clientData custom data (ignored)
@@ -928,11 +1082,12 @@
typedef enum {
kCurlFetch,
kCurlIsNewer,
- kCurlGetSize
+ kCurlGetSize,
+ kCurlPost
} EOption;
static const char *options[] = {
- "fetch", "isnewer", "getsize", NULL
+ "fetch", "isnewer", "getsize", "post", NULL
};
int theResult = TCL_OK;
EOption theOptionIndex;
@@ -964,6 +1119,9 @@
case kCurlGetSize:
theResult = CurlGetSizeCmd(interp, objc, objv);
break;
+ case kCurlPost:
+ theResult = CurlPostCmd(interp, objc, objv);
+ break;
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20131115/490ce890/attachment.html>
More information about the macports-changes
mailing list