Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

php curl 413 error

Posted on 2011-03-25
3
Medium Priority
?
1,195 Views
Last Modified: 2012-05-11
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

0
Comment
Question by:rationalboss
  • 2
3 Comments
 
LVL 7

Expert Comment

by:Swafnil
ID: 35215773
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!
0
 
LVL 8

Accepted Solution

by:
rationalboss earned 0 total points
ID: 35217707
I was able to solve the problem by changing line 26 to:

	  curl_setopt($this->curlHandle, CURLOPT_POST, false); 

Open in new window

0
 
LVL 8

Author Closing Comment

by:rationalboss
ID: 35252791
i solved it myself
0

Featured Post

Get free NFR key for Veeam Availability Suite 9.5

Veeam is happy to provide a free NFR license (1 year, 2 sockets) to all certified IT Pros. The license allows for the non-production use of Veeam Availability Suite v9.5 in your home lab, without any feature limitations. It works for both VMware and Hyper-V environments

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

There are times when I have encountered the need to decompress a response from a PHP request. This is how it's done, but you must have control of the request and you can set the Accept-Encoding header.
Originally, this post was published on Monitis Blog, you can check it here . In business circles, we sometimes hear that today is the “age of the customer.” And so it is. Thanks to the enormous advances over the past few years in consumer techno…
The viewer will learn how to dynamically set the form action using jQuery.
The is a quite short video tutorial. In this video, I'm going to show you how to create self-host WordPress blog with free hosting service.
Suggested Courses

886 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question