00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "rsApiHandler.h"
00015 #include "msoDriversMS.h"
00016 #if defined(MSO_HTTP)
00017 #include <curl/curl.h>
00018 #endif
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 int
00055 msiobjget_http(msParam_t* inRequestPath, msParam_t* inFileMode,
00056 msParam_t* inFileFlags, msParam_t* inCacheFilename,
00057 ruleExecInfo_t* rei )
00058 {
00059 #if defined(MSO_HTTP)
00060 char *reqStr;
00061 int mode, flags;
00062 char *cacheFilename;
00063 int status;
00064 FILE *destFd;
00065 char curlErrBuf[CURL_ERROR_SIZE];
00066
00067 CURL *curl;
00068 CURLcode res;
00069
00070
00071
00072 RE_TEST_MACRO( " Calling msiobjget_http" );
00073 curlErrBuf[0]='\0';
00074
00075
00076 if (inRequestPath == NULL ||
00077 strcmp(inRequestPath->type , STR_MS_T) != 0 ||
00078 inRequestPath->inOutStruct == NULL)
00079 return(USER_PARAM_TYPE_ERR);
00080
00081 if (inFileMode == NULL ||
00082 strcmp(inFileMode->type , STR_MS_T) != 0 ||
00083 inFileMode->inOutStruct == NULL)
00084 return(USER_PARAM_TYPE_ERR);
00085
00086 if (inFileFlags == NULL ||
00087 strcmp(inFileFlags->type , STR_MS_T) != 0 ||
00088 inFileFlags->inOutStruct == NULL)
00089 return(USER_PARAM_TYPE_ERR);
00090
00091 if (inCacheFilename == NULL ||
00092 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00093 inCacheFilename->inOutStruct == NULL)
00094 return(USER_PARAM_TYPE_ERR);
00095
00096
00097 cacheFilename = (char *) inCacheFilename->inOutStruct;
00098 mode = atoi((char *) inFileMode->inOutStruct);
00099 flags = atoi((char *) inFileFlags->inOutStruct);
00100 reqStr = strdup((char *) inRequestPath->inOutStruct);
00101
00102
00103
00104
00105 destFd = fopen (cacheFilename, "w");
00106 if (destFd == 0) {
00107 printf (
00108 "msigetobj_http: open error for cacheFilename %s",
00109 cacheFilename);
00110 free(reqStr);
00111 return status;
00112 }
00113 printf("CURL: Calling with %s\n", reqStr);
00114 curl = curl_easy_init();
00115 if(!curl) {
00116 printf("Curl Error: Initialization failed\n");
00117 free(reqStr);
00118 fclose( destFd );
00119 return(MSO_OBJ_GET_FAILED);
00120 }
00121
00122 curl_easy_setopt(curl, CURLOPT_ERRORBUFFER,curlErrBuf);
00123 curl_easy_setopt(curl, CURLOPT_URL, reqStr);
00124 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
00125 curl_easy_setopt(curl, CURLOPT_WRITEDATA, destFd);
00126 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
00127 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
00128 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
00129
00130 res = curl_easy_perform(curl);
00131 fclose(destFd);
00132 if (res != 0) {
00133 printf("Curl Error for %s:ErrNum=%i, Msg=%s\n",reqStr,res,curlErrBuf);
00134 curl_easy_cleanup(curl);
00135 free(reqStr);
00136 return(MSO_OBJ_GET_FAILED);
00137 }
00138 curl_easy_cleanup(curl);
00139
00140 printf("CURL: success with %s\n", reqStr);
00141
00142
00143 free(reqStr);
00144
00145
00146 return(0);
00147 #else
00148 return(MICRO_SERVICE_OBJECT_TYPE_UNDEFINED);
00149 #endif
00150
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 int
00191 msiobjput_http(msParam_t* inMSOPath, msParam_t* inCacheFilename,
00192 msParam_t* inFileSize, ruleExecInfo_t* rei )
00193 {
00194 #if defined(MSO_HTTP)
00195 char *reqStr;
00196 char *cacheFilename;
00197 rodsLong_t dataSize;
00198 int status;
00199 int srcFd;
00200 char *myBuf;
00201 int bytesRead;
00202
00203
00204 RE_TEST_MACRO( " Calling msiobjput_http" );
00205
00206
00207 if (inMSOPath == NULL ||
00208 strcmp(inMSOPath->type , STR_MS_T) != 0 ||
00209 inMSOPath->inOutStruct == NULL)
00210 return(USER_PARAM_TYPE_ERR);
00211
00212 if (inCacheFilename == NULL ||
00213 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00214 inCacheFilename->inOutStruct == NULL)
00215 return(USER_PARAM_TYPE_ERR);
00216
00217 if (inFileSize == NULL ||
00218 strcmp(inFileSize->type , STR_MS_T) != 0 ||
00219 inFileSize->inOutStruct == NULL)
00220 return(USER_PARAM_TYPE_ERR);
00221
00222
00223
00224 reqStr = (char *) inMSOPath->inOutStruct;
00225 cacheFilename = (char *) inCacheFilename->inOutStruct;
00226 dataSize = atol((char *) inFileSize->inOutStruct);
00227
00228
00229
00230
00231 srcFd = open (cacheFilename, O_RDONLY, 0);
00232 if (srcFd < 0) {
00233 status = UNIX_FILE_OPEN_ERR - errno;
00234 printf ("msiputobj_http: open error for %s, status = %d\n",
00235 cacheFilename, status);
00236 return status;
00237 }
00238 myBuf = (char *) malloc (dataSize);
00239 bytesRead = read (srcFd, (void *) myBuf, dataSize);
00240 close (srcFd);
00241 myBuf[dataSize-1] = '\0';
00242
00243 if (bytesRead > 0 && bytesRead != dataSize) {
00244 printf ("msiputobj_http: bytesRead %d != dataSize %lld\n",
00245 bytesRead, dataSize);
00246 free(myBuf);
00247 return SYS_COPY_LEN_ERR;
00248 }
00249
00250 rodsLog(LOG_NOTICE,"MSO_HTTP file contains: %s\n",myBuf);
00251 free(myBuf);
00252 return(0);
00253 #else
00254 return(MICRO_SERVICE_OBJECT_TYPE_UNDEFINED);
00255 #endif
00256 }
00257