X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=generic%2Ftclcurl.c;h=5e0a85143ab71dc9e4f56b3ffc77ab7533f23027;hb=HEAD;hp=8185c30720c6537159de9a2b9f2a8635c089a1eb;hpb=b62db6a104a211b14dc512cbb9cbcea49613ff19;p=sven%2Ftclcurl.git diff --git a/generic/tclcurl.c b/generic/tclcurl.c index 8185c30..5e0a851 100755 --- a/generic/tclcurl.c +++ b/generic/tclcurl.c @@ -87,7 +87,7 @@ curlCreateObjCmd (Tcl_Interp *interp,struct curlObjData *curlData) { Tcl_Command cmdToken; /* We try with curl1, if it already exists with curl2...*/ - handleName=(char *)Tcl_Alloc(10); + handleName=(char *)Tcl_Alloc(32); for (i=1;;i++) { sprintf(handleName,"curl%d",i); if (!Tcl_GetCommandInfo(interp,handleName,&info)) { @@ -465,6 +465,12 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 1: Tcl_Free(curlData->outFile); curlData->outFile=curlstrdup(Tcl_GetString(objv)); + if (curlData->outFlag) { + if (curlData->outHandle!=NULL) { + fclose(curlData->outHandle); + curlData->outHandle=NULL; + } + } if ((strcmp(curlData->outFile,""))&&(strcmp(curlData->outFile,"stdout"))) { curlData->outFlag=1; } else { @@ -477,6 +483,12 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 2: Tcl_Free(curlData->inFile); curlData->inFile=curlstrdup(Tcl_GetString(objv)); + if (curlData->inFlag) { + if (curlData->inHandle!=NULL) { + fclose(curlData->inHandle); + curlData->inHandle=NULL; + } + } if ((strcmp(curlData->inFile,""))&&(strcmp(curlData->inFile,"stdin"))) { curlData->inFlag=1; } else { @@ -748,8 +760,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, /* fprintf(stdout,"Section contents: %s\n",Tcl_GetString(httpPostData[i+1]));*/ tmpStr=Tcl_GetStringFromObj(httpPostData[i+1],&curlformBufferSize); formArray[formArrayIndex].option = CURLFORM_COPYCONTENTS; - formArray[formArrayIndex].value = (char *) - memcpy(Tcl_Alloc(curlformBufferSize), tmpStr, curlformBufferSize); + + formArray[formArrayIndex].value = Tcl_Alloc((curlformBufferSize > 0) ? curlformBufferSize : 1); + if (curlformBufferSize > 0) { + memcpy((char *)formArray[formArrayIndex].value,tmpStr,curlformBufferSize); + } else { + memset((char *)formArray[formArrayIndex].value,0,1); + } formArrayIndex++; formArray[formArrayIndex].option = CURLFORM_CONTENTSLENGTH; @@ -854,6 +871,15 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, break; case 3: longNumber=CURL_SSLVERSION_SSLv3; + break; + case 4: + longNumber=CURL_SSLVERSION_TLSv1_0; + break; + case 5: + longNumber=CURL_SSLVERSION_TLSv1_1; + break; + case 6: + longNumber=CURL_SSLVERSION_TLSv1_2; } tmpObjPtr=Tcl_NewLongObj(longNumber); if (SetoptLong(interp,curlHandle,CURLOPT_SSLVERSION, @@ -894,6 +920,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 44: Tcl_Free(curlData->headerFile); curlData->headerFile=curlstrdup(Tcl_GetString(objv)); + if (curlData->headerFlag) { + if (curlData->headerHandle!=NULL) { + fclose(curlData->headerHandle); + curlData->headerHandle=NULL; + } + curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL); + } if ((strcmp(curlData->headerFile,""))&&(strcmp(curlData->headerFile,"stdout")) &&(strcmp(curlData->headerFile,"stderr"))) { curlData->headerFlag=1; @@ -1015,6 +1048,14 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, } break; case 61: + if (curlData->headerFlag) { + if (curlData->headerHandle!=NULL) { + fclose(curlData->headerHandle); + curlData->headerHandle=NULL; + } + curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL); + curlData->headerFlag=0; + } if (curl_easy_setopt(curlHandle,CURLOPT_HEADERFUNCTION, curlHeaderReader)) { return TCL_ERROR; @@ -1029,6 +1070,14 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 62: Tcl_Free(curlData->bodyVarName); curlData->bodyVarName=curlstrdup(Tcl_GetString(objv)); + if (curlData->outFlag) { + if (curlData->outHandle!=NULL) { + fclose(curlData->outHandle); + curlData->outHandle=NULL; + } + curl_easy_setopt(curlHandle,CURLOPT_WRITEDATA,NULL); + } + curlData->outFlag=0; if (curl_easy_setopt(curlHandle,CURLOPT_WRITEFUNCTION, curlBodyReader)) { return TCL_ERROR; @@ -1066,6 +1115,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, break; case 65: curlData->writeProc=curlstrdup(Tcl_GetString(objv)); + if (curlData->outFlag) { + if (curlData->outHandle!=NULL) { + fclose(curlData->outHandle); + curlData->outHandle=NULL; + } + curl_easy_setopt(curlHandle,CURLOPT_WRITEDATA,NULL); + } curlData->outFlag=0; if (curl_easy_setopt(curlHandle,CURLOPT_WRITEFUNCTION, curlWriteProcInvoke)) { @@ -1079,6 +1135,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, break; case 66: curlData->readProc=curlstrdup(Tcl_GetString(objv)); + if (curlData->inFlag) { + if (curlData->inHandle!=NULL) { + fclose(curlData->inHandle); + curlData->inHandle=NULL; + } + curl_easy_setopt(curlHandle,CURLOPT_READDATA,NULL); + } curlData->inFlag=0; if (strcmp(curlData->readProc,"")) { if (curl_easy_setopt(curlHandle,CURLOPT_READFUNCTION, @@ -2404,12 +2467,14 @@ curlHeaderReader(void *ptr,size_t size,size_t nmemb,FILE *curlDataPtr) { headerContent[charLength]=0; /* There may be multiple 'Set-Cookie' headers, so we use a list */ if (Tcl_StringCaseMatch(headerName,"Set-Cookie",1)) { - Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, \ + Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, headerContent,TCL_LIST_ELEMENT|TCL_APPEND_VALUE); } else { Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, headerContent,0); } + Tcl_Free(headerContent); + Tcl_Free(headerName); } regExp=Tcl_RegExpCompile(curlData->interp,"(^(HTTP|http)[^\r]+)(\r*)(\n)"); match=Tcl_RegExpExec(curlData->interp,regExp,header,header); @@ -2422,6 +2487,7 @@ curlHeaderReader(void *ptr,size_t size,size_t nmemb,FILE *curlDataPtr) { Tcl_SetVar2(curlData->interp,curlData->headerVar,"http", httpStatus,0); + Tcl_Free(httpStatus); } return size*nmemb; } @@ -4124,7 +4190,7 @@ curlCreateShareObjCmd (Tcl_Interp *interp,struct shcurlObjData *shcurlData) { Tcl_Command cmdToken; /* We try with scurl1, if it already exists with scurl2...*/ - shandleName=(char *)Tcl_Alloc(10); + shandleName=(char *)Tcl_Alloc(32); for (i=1;;i++) { sprintf(shandleName,"scurl%d",i); if (!Tcl_GetCommandInfo(interp,shandleName,&info)) {