Link to home
Start Free TrialLog in
Avatar of rationalboss
rationalboss

asked on

php curl 413 error

Hi,

When using curl in PHP I get 413 errors. Why is that?
It's also weird because the script works on my PHP Version 5.3.1 (cURL Information       7.19.6)
but it doesn't work on:
PHP Version 5.2.9 (cURL Information       libcurl/7.21.4 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5)

<?php
class RegAppAPI {
   private $APIUsername;
   private $APIPassword;
   
   private $APIUrl;
   
   private $APIContents; //array
   private $curlHandle;
   private $sessionInfo;
   private $lastError;
   private $rawData;
   function __construct($service_list, $username, $password) {
		$this->APIUsername=$username;
	   $this->APIPassword=$password;
	  
	  //setup common cUrl properties
	  $this->curlHandle = curl_init();
	  curl_setopt($this->curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
	  curl_setopt($this->curlHandle, CURLOPT_USERPWD, "$username:$password");
	  curl_setopt($this->curlHandle, CURLOPT_FOLLOWLOCATION, TRUE);
	  curl_setopt($this->curlHandle, CURLOPT_SSLVERSION,3);
	  curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);
	  curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYHOST, FALSE);
	  curl_setopt($this->curlHandle, CURLOPT_HEADER, false);
	  curl_setopt($this->curlHandle, CURLOPT_POST, true);    
	  curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, true);
	  
	  if (gettype($service_list)=="string") {

   
	  $this->APIUrl = $service_list;
	  
	  
	  $ret =  $this->_initAPIContents();
	  if (!$ret) {
		 unset($this);
	  }
	  } else if (gettype($service_list)=="object") {
		 $this->APIContents = $service_list;
	  }
   }
   
   function _initAPIContents() {
	  
	   curl_setopt($this->curlHandle, CURLOPT_URL, $this->APIUrl);
	  
	  $val = curl_exec($this->curlHandle);
	  if (curl_error($this->curlHandle)) {
		 if (curl_error($this->curlHandle)) $this->lastError = curl_error($this->curlHandle);
		 return FALSE;
		 
	  }
	  $responseCode = curl_getinfo($this->curlHandle,CURLINFO_HTTP_CODE);
	  
	  if ($responseCode == 401) {
		 $this->lastError = "Client Request Error ($responseCode) Unauthorized connection.  Your API username and password is incorrect.";
		 return FALSE;
	  } else
	  if ($responseCode >= 400 && $responseCode < 500) {
		 $this->lastError = "Client Request Error ($responseCode).";
		 return FALSE;
	  } else
	  if ($responseCode >=500) {
		 $this->lastError = "Server error ($responseCode)."  ;
		 return FALSE;
	  }
	   $this->APIContents = json_decode($val);
   
	  if (function_exists('json_last_error')) {
	   if (json_last_error() ) {
		 
		 $this->lastError = json_last_error();
		 return FALSE;
	   } 
	  }
	  return TRUE;
   
   }
   
   function execute($name, $params=array(), $optional_params = array()) {
	  $this->lastError = NULL;
	  if (!isset($this->APIContents->{$name})) {
		 $this->lastError = "Service/Operation named '$name' is not initialized.";
		 return FALSE;
	  }
	  $operation = $this->APIContents->{$name};;
	  
   
	  $POST_DATA = array();
	  
	  $sess_info = $this->getSessionInfo();
	  if (!$sess_info && $operation->session_info_required) {
		 $this->lastError='There is no session information associated with this object.';
		 return FALSE;
	  }
	  if ($sess_info != NULL) {
	  foreach ($sess_info as $key=>$value) {
		 $POST_DATA[$key] = $value;
	  }
	  }
	  
	  if (isset($operation->parameters)) {
	  foreach ($operation->parameters as $param)  {
		 if (isset($params[$param])) {
			$POST_DATA[$param] = $params[$param];
		 } else {
			$this->lastError='Request has missing parameter ' . $param . '.';
			return FALSE;
		 }
	  }
	  }
	  
	  if (isset($operation->optionalParameters)) {
	  foreach ($operation->optionalParameters as $param) {
		 if (isset($optional_params[$param])) $POST_DATA[$param]=$optional_params;
	  }
	  }
	  $postString = http_build_query($POST_DATA,'','&');
	  
	  curl_setopt($this->curlHandle, CURLOPT_URL, $operation->url);
	  curl_setopt($this->curlHandle, CURLOPT_POSTFIELDS, $postString);
	  $val = curl_exec($this->curlHandle);
	  $this->rawData=$val;
	  $responseCode = curl_getinfo($this->curlHandle,CURLINFO_HTTP_CODE);
	  
	  if ($responseCode == 401) {
		 $this->lastError = "Client Request Error ($responseCode) Unauthorized connection.  Your API username and password is incorrect.";
		 return FALSE;
	  } else
	  if ($responseCode >= 400 && $responseCode < 500) {
		 $this->lastError = "Client Request Error ($responseCode).";
		 return FALSE;
	  } else
	  if ($responseCode >=500) {
		 $this->lastError = "Server error ($responseCode)."  ;
		 return FALSE;
	  }
	  //echo curl_error($this->curlHandle) . "<br/>";
	  $result = json_decode($val);
	  if (function_exists('json_last_error')) {
	  if (json_last_error()) {
		 $this->lastError = "Error in decoding response: $val";
		 return FALSE;
	  }
	  }
	  if ($result) {
		  if (isset($result->{'session_info'})) {
			 $this->sessionInfo = $result->{'session_info'};
			$this->lastError = NULL;
			return TRUE;
			
		 }
		  if (isset($result->{'result'})) {
			$this->lastError = NULL;
			 return $result->{'result'};
		 
		 }
		 
		 if (isset($result->{'error'})) {
			 $this->lastError = NULL;
			$this->_processError($result->{'error'});
			return FALSE;
		 }
	  }
	  
	  return FALSE;
	  
   }
   function getRawData() {
	  return $this->rawData;
   }
   function _processError($error) {
	  $this->lastError = $error->{'message'};
   }
   function getLastError() {
	  return $this->lastError;
   }
   
   function setSessionInfo($sess_info) {
	  $this->sessionInfo = $sess_info;
   }
   
   function getSessionInfo() {
	   if ($this->sessionInfo) return $this->sessionInfo;
	  
   }
   function close() {
	  curl_close($this->curlHandle);
   
   }
   function getAPIContents() {
	  //$copy = array();
	  //foreach ($this->APIContents as $index=>$content) $copy[$index] = $content;
	  return $this->APIContents;
   }
   
	function showAPIContents() {
	  print "<h2>RegApp API Contents</h2>";
	  if ($this->APIContents) {
	  foreach ($this->APIContents as $name=>$details) {
		 $content =  "<div>";
		$content .= "<p><u><b>$name</b></u></p>";
		$content .= "<p><b>Description: </b> " . $details->{'description'} . "<br/>" ;
		$content .= "<b>Session Info Required :</b> " . (($details->{'session_info_required'}) ? "YES" : "NO") . "<br/>";
		$content .= "<b>Parameters : </b>  " . ((isset($details->{'parameters'}) && count($details->{'parameters'}) > 0) ? implode(", " , $details->{'parameters'}) : "NONE") . "<br/>";
		$content .= "<b>Optional Parameters : </b>  " . ((isset($details->{'optionalParameters'}) && count($details->{'optionalParameters'}) > 0) ? implode(", " , $details->{'optionalParameters'}) : "NONE") . "<br/>";
		$content .= "<b>Returns: </b> "  . $details->{'returns'} . "<br/>";
		$content .= "</div>";
		echo $content;
	  
	  }
	  } else echo "<p>API has no contents.</p>";
   
   }
   
}
?>

Open in new window

Avatar of Swafnil
Swafnil
Flag of Germany image

It seems as if PHP 5.2 and 5.3 CURL behave differently, although I haven't experienced the problems myself. A search on Google gave me a comparable error where calling the Twitter API from 5.2 worked and 5.3 didn't, perhaps it'll help you figure out what Curl-settings behave differently now:

http://code.google.com/p/twitter-api/issues/detail?id=1291

Another post shows that there was a bug in the curl_wrappers below PHP 5.2.11, so it would be a good idea to update to the most recent PHP 5.2.17:

http://core.trac.wordpress.org/ticket/11888 (see comment 28)

Good luck!
ASKER CERTIFIED SOLUTION
Avatar of rationalboss
rationalboss

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of rationalboss
rationalboss

ASKER

i solved it myself