test
This commit is contained in:
@@ -24,6 +24,210 @@
|
||||
#endif
|
||||
|
||||
struct MemoryStruct { char *memory; size_t size; };
|
||||
struct return_string { char *ptr; size_t len; };
|
||||
|
||||
// return data from the server
|
||||
#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
|
||||
#define CURL_GLOBAL_SSL (1<<0)
|
||||
#define CURL_GLOBAL_WIN32 (1<<1)
|
||||
|
||||
|
||||
size_t accumulate(void *ptr, size_t size, size_t nmemb, struct return_string *s);
|
||||
void init_string(struct return_string *s);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* return the current system time in milliseconds
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#define EXTRACT_BITCOIND_RESULT // if defined, ensures error is null and returns the "result" field
|
||||
#ifdef EXTRACT_BITCOIND_RESULT
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* perform post processing of the results
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char *params)
|
||||
{
|
||||
long i,j,len; char *retstr = 0; cJSON *json,*result,*error;
|
||||
//printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr);
|
||||
if ( command == 0 || rpcstr == 0 || rpcstr[0] == 0 )
|
||||
{
|
||||
if ( strcmp(command,"signrawtransaction") != 0 )
|
||||
printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr);
|
||||
return(rpcstr);
|
||||
}
|
||||
json = cJSON_Parse(rpcstr);
|
||||
if ( json == 0 )
|
||||
{
|
||||
printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s can't parse.(%s) params.(%s)\n",debugstr,command,rpcstr,params);
|
||||
free(rpcstr);
|
||||
return(0);
|
||||
}
|
||||
result = cJSON_GetObjectItem(json,"result");
|
||||
error = cJSON_GetObjectItem(json,"error");
|
||||
if ( error != 0 && result != 0 )
|
||||
{
|
||||
if ( (error->type&0xff) == cJSON_NULL && (result->type&0xff) != cJSON_NULL )
|
||||
{
|
||||
retstr = cJSON_Print(result);
|
||||
len = strlen(retstr);
|
||||
if ( retstr[0] == '"' && retstr[len-1] == '"' )
|
||||
{
|
||||
for (i=1,j=0; i<len-1; i++,j++)
|
||||
retstr[j] = retstr[i];
|
||||
retstr[j] = 0;
|
||||
}
|
||||
}
|
||||
else if ( (error->type&0xff) != cJSON_NULL || (result->type&0xff) != cJSON_NULL )
|
||||
{
|
||||
if ( strcmp(command,"signrawtransaction") != 0 )
|
||||
printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC (%s) error.%s\n",debugstr,command,rpcstr);
|
||||
}
|
||||
free(rpcstr);
|
||||
} else retstr = rpcstr;
|
||||
free_json(json);
|
||||
//fprintf(stderr,"<<<<<<<<<<< bitcoind_RPC: postprocess returns.(%s)\n",retstr);
|
||||
return(retstr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
*
|
||||
* perform the query
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params)
|
||||
{
|
||||
static int didinit,count,count2; static double elapsedsum,elapsedsum2;
|
||||
struct curl_slist *headers = NULL; struct return_string s; CURLcode res; CURL *curl_handle;
|
||||
char *bracket0,*bracket1,*databuf = 0; long len; int32_t specialcase,numretries; double starttime;
|
||||
if ( didinit == 0 )
|
||||
{
|
||||
didinit = 1;
|
||||
curl_global_init(CURL_GLOBAL_ALL); //init the curl session
|
||||
}
|
||||
numretries = 0;
|
||||
if ( debugstr != 0 && strcmp(debugstr,"BTCD") == 0 && command != 0 && strcmp(command,"SuperNET") == 0 )
|
||||
specialcase = 1;
|
||||
else specialcase = 0;
|
||||
if ( url[0] == 0 )
|
||||
strcpy(url,"http://127.0.0.1:7876/nxt");
|
||||
if ( specialcase != 0 && 0 )
|
||||
printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params);
|
||||
try_again:
|
||||
if ( retstrp != 0 )
|
||||
*retstrp = 0;
|
||||
starttime = OS_milliseconds();
|
||||
curl_handle = curl_easy_init();
|
||||
init_string(&s);
|
||||
headers = curl_slist_append(0,"Expect:");
|
||||
|
||||
curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )");
|
||||
curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers);
|
||||
curl_easy_setopt(curl_handle,CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION, (void *)accumulate); // send all data to this function
|
||||
curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA, &s); // we pass our 's' struct to the callback
|
||||
curl_easy_setopt(curl_handle,CURLOPT_NOSIGNAL, 1L); // supposed to fix "Alarm clock" and long jump crash
|
||||
curl_easy_setopt(curl_handle,CURLOPT_NOPROGRESS, 1L); // no progress callback
|
||||
if ( strncmp(url,"https",5) == 0 )
|
||||
{
|
||||
curl_easy_setopt(curl_handle,CURLOPT_SSL_VERIFYPEER,0);
|
||||
curl_easy_setopt(curl_handle,CURLOPT_SSL_VERIFYHOST,0);
|
||||
}
|
||||
if ( userpass != 0 )
|
||||
curl_easy_setopt(curl_handle,CURLOPT_USERPWD, userpass);
|
||||
databuf = 0;
|
||||
if ( params != 0 )
|
||||
{
|
||||
if ( command != 0 && specialcase == 0 )
|
||||
{
|
||||
len = strlen(params);
|
||||
if ( len > 0 && params[0] == '[' && params[len-1] == ']' ) {
|
||||
bracket0 = bracket1 = (char *)"";
|
||||
}
|
||||
else
|
||||
{
|
||||
bracket0 = (char *)"[";
|
||||
bracket1 = (char *)"]";
|
||||
}
|
||||
|
||||
databuf = (char *)malloc(256 + strlen(command) + strlen(params));
|
||||
sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1);
|
||||
//printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf);
|
||||
//
|
||||
} //else if ( specialcase != 0 ) fprintf(stderr,"databuf.(%s)\n",params);
|
||||
curl_easy_setopt(curl_handle,CURLOPT_POST,1L);
|
||||
if ( databuf != 0 )
|
||||
curl_easy_setopt(curl_handle,CURLOPT_POSTFIELDS,databuf);
|
||||
else curl_easy_setopt(curl_handle,CURLOPT_POSTFIELDS,params);
|
||||
}
|
||||
//laststart = milliseconds();
|
||||
res = curl_easy_perform(curl_handle);
|
||||
curl_slist_free_all(headers);
|
||||
curl_easy_cleanup(curl_handle);
|
||||
if ( databuf != 0 ) // clean up temporary buffer
|
||||
{
|
||||
free(databuf);
|
||||
databuf = 0;
|
||||
}
|
||||
if ( res != CURLE_OK )
|
||||
{
|
||||
numretries++;
|
||||
if ( specialcase != 0 )
|
||||
{
|
||||
printf("<<<<<<<<<<< bitcoind_RPC.(%s): BTCD.%s timeout params.(%s) s.ptr.(%s) err.%d\n",url,command,params,s.ptr,res);
|
||||
free(s.ptr);
|
||||
return(0);
|
||||
}
|
||||
else if ( numretries >= 5 )
|
||||
{
|
||||
printf("Maximum number of retries exceeded!\n");
|
||||
free(s.ptr);
|
||||
return(0);
|
||||
}
|
||||
printf( "curl_easy_perform() failed: %s %s.(%s %s), retries: %d\n",curl_easy_strerror(res),debugstr,url,command,numretries);
|
||||
free(s.ptr);
|
||||
sleep((1<<numretries));
|
||||
goto try_again;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( command != 0 && specialcase == 0 )
|
||||
{
|
||||
count++;
|
||||
elapsedsum += (OS_milliseconds() - starttime);
|
||||
if ( (count % 10000) == 0)
|
||||
printf("%d: ave %9.6f | elapsed %.3f millis | bitcoind_RPC.(%s) url.(%s)\n",count,elapsedsum/count,(OS_milliseconds() - starttime),command,url);
|
||||
if ( retstrp != 0 )
|
||||
{
|
||||
*retstrp = s.ptr;
|
||||
return(s.ptr);
|
||||
}
|
||||
return(post_process_bitcoind_RPC(debugstr,command,s.ptr,params));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( 0 && specialcase != 0 )
|
||||
fprintf(stderr,"<<<<<<<<<<< bitcoind_RPC: BTCD.(%s) -> (%s)\n",params,s.ptr);
|
||||
count2++;
|
||||
elapsedsum2 += (OS_milliseconds() - starttime);
|
||||
if ( (count2 % 10000) == 0)
|
||||
printf("%d: ave %9.6f | elapsed %.3f millis | NXT calls.(%s) cmd.(%s)\n",count2,elapsedsum2/count2,(double)(OS_milliseconds() - starttime),url,command);
|
||||
return(s.ptr);
|
||||
}
|
||||
}
|
||||
printf("bitcoind_RPC: impossible case\n");
|
||||
free(s.ptr);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static size_t WriteMemoryCallback(void *ptr,size_t size,size_t nmemb,void *data)
|
||||
{
|
||||
@@ -90,7 +294,7 @@ char *curl_post(CURL **cHandlep,char *url,char *userpass,char *postfields,char *
|
||||
|
||||
char *komodo_issuemethod(char *method,char *params,uint16_t port)
|
||||
{
|
||||
static void *cHandle; char url[512],*retstr=0,postdata[8192];
|
||||
static void *cHandle; char url[512],*retstr=0,*retstr2,postdata[8192];
|
||||
if ( params == 0 || params[0] == 0 )
|
||||
params = (char *)"[]";
|
||||
if ( strlen(params) < sizeof(postdata)-128 )
|
||||
@@ -98,7 +302,8 @@ char *komodo_issuemethod(char *method,char *params,uint16_t port)
|
||||
sprintf(url,(char *)"http://127.0.0.1:%u",port);
|
||||
sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params);
|
||||
//printf("postdata.(%s) USERPASS.(%s)\n",postdata,USERPASS);
|
||||
retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0);
|
||||
retstr2 = bitcoind_RPC(&retstr,"debug",url,USERPASS,method,params);
|
||||
//retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0);
|
||||
}
|
||||
return(retstr);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user