daily pastebin goal
38%
SHARE
TWEET

JSONRPC

a guest Nov 20th, 2011 934 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function rpcQuery ($method,$params=array(),$timeout=array("send"=>0,"receive"=>10))
  2. {
  3.         //returns an associative array
  4.         //$reult["r"] contains the result in *decoded* JSON
  5.         //$result["e"] contains the error, or NULL if there is no error. This could be Bitcoin errors or rpcQuery errors.
  6.  
  7.         //I don't expect all possible errors to be caught. After running this, you should check that it's
  8.         //returning reasonable data.
  9.        
  10.         $user="bitcoin";
  11.         $password="x";
  12.         $id=8284;
  13.         $target="127.0.0.1";
  14.         $port=8332;
  15.  
  16.         //construct query
  17.         $query=(object)array("method"=>$method,"params"=>$params,"id"=>$id);
  18.         $query=json_encode($query);
  19.         $auth=base64_encode($user.":".$password);
  20.         $query=$query."\r\n";
  21.         $length=strlen($query);
  22.  
  23.         $in="POST / HTTP/1.1\r\n";
  24.         $in.="Connection: close\r\n";
  25.         $in.="Content-Length: $length\r\n";
  26.         $in.="Host: \r\n";
  27.         $in.="Content-type: text/plain\r\n";
  28.         $in.="Authorization: Basic $auth\r\n";
  29.         $in.="\r\n";
  30.         $in.=$query;
  31.         $offset = 0;
  32.         $len=strlen($in);
  33.        
  34.         //create connection
  35.         $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  36.        
  37.         //timeouts
  38.         if($timeout["send"]>0)
  39.         {
  40.                 socket_set_option($socket,SOL_SOCKET, SO_SNDTIMEO, array("sec"=>$timeout["send"],"usec"=>0));
  41.         }
  42.         if($timeout["receive"]>0)
  43.         {
  44.                 socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$timeout["send"],"usec"=>0));
  45.         }
  46.        
  47.         if(socket_connect($socket,$target,$port)===false)
  48.         {
  49.                 $errorcode = socket_last_error();
  50.                 //error_log("JSON: Socket error $errorcode: ".__LINE__);
  51.                 $error = socket_strerror($errorcode);
  52.                 goto returnResult;
  53.         }
  54.        
  55.         while ($offset < $len)
  56.         {
  57.                 $sent = socket_write($socket, substr($in, $offset), $len-$offset);
  58.                 if ($sent === false) {
  59.                         break;
  60.                 }
  61.                 $offset += $sent;
  62.         }
  63.         //did all of our data get out?
  64.         if ($offset < $len)
  65.         {
  66.                 $errorcode = socket_last_error();
  67.                 //error_log("JSON: Socket error $errorcode: ".__LINE__);
  68.                
  69.                 //poorly-named timeout error
  70.                 if($errorcode==11)
  71.                 {
  72.                         $error="Socket write timed out";
  73.                 }
  74.                 else
  75.                 {
  76.                         $error = socket_strerror($errorcode);
  77.                 }
  78.                 goto returnResult;
  79.         }
  80.  
  81.         $reply = "";
  82.         do
  83.         {
  84.                 $recv = "";
  85.                 $recv = socket_read($socket, '1400');
  86.                 if($recv===false)
  87.                 {
  88.                         $errorcode = socket_last_error();
  89.                         //error_log("JSON: Socket error $errorcode: ".__LINE__);
  90.                        
  91.                         //poorly-named timeout error
  92.                         if($errorcode==11)
  93.                         {
  94.                                 $error="Socket read timed out";
  95.                         }
  96.                         else
  97.                         {
  98.                                 $error = socket_strerror($errorcode);
  99.                         }
  100.                         goto returnResult;
  101.                 }
  102.                 if($recv != "")
  103.                 {
  104.                         $reply .= $recv;
  105.                 }
  106.         }
  107.         while($recv != "");
  108.        
  109.         //socket no longer needed -- close
  110.         socket_shutdown($socket);
  111.         socket_close($socket);
  112.        
  113.         $result=strpos($reply,"\r\n\r\n");
  114.         if($result===false)
  115.         {
  116.                 $error="Could not parse result.";
  117.         }
  118.         $result=trim(substr($reply,$result+4));
  119.        
  120.         //construct final array
  121.         returnResult:
  122.         {
  123.                 $return=array("r"=>NULL,"e"=>NULL);
  124.                 if(isset($error))
  125.                 {
  126.                         $return["e"]=$error;
  127.                         return $return;
  128.                 }
  129.                 $result=json_decode($result,false,512);
  130.                 if($result==NULL||!is_object($result))
  131.                 {
  132.                         $return["e"]="Decode failed.";
  133.                         return $return;
  134.                 }
  135.                 if($result->id!=$id)
  136.                 {
  137.                         $return["e"]="Wrong ID.";
  138.                         return $return;
  139.                 }
  140.                 $return["r"]=$result->result;
  141.                 $return["e"]=$result->error;
  142.                
  143.                 return $return;
  144.         }
  145. }
  146.  
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top