X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Ftclcurl.git;a=blobdiff_plain;f=generic%2Ftclcurl.c;fp=generic%2Ftclcurl.c;h=5e0a85143ab71dc9e4f56b3ffc77ab7533f23027;hp=21c947cd369afb3b27c16b606d46a48dc192b5af;hb=92c2918486413765809c67e8c5b5de382f40c399;hpb=4c90ce689c5b7219afd7993a7719a17a7a3b9563 diff --git a/generic/tclcurl.c b/generic/tclcurl.c index 21c947c..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 { @@ -908,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; @@ -1029,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; @@ -1043,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; @@ -1080,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)) { @@ -1093,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, @@ -2418,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); @@ -2436,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; } @@ -4138,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)) {