Solved

php curl 413 error

Posted on 2011-03-25
3
1,163 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Why do we like using grid based layouts in website design? Let's look at the live examples of websites and compare them to grid based WordPress themes.
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
This tutorial demonstrates how to identify and create boundary or building outlines in Google Maps. In this example, I outline the boundaries of an enclosed skatepark within a community park.  Login to your Google Account, then  Google for "Google M…

930 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now