Adding default curl options

Because I removed completely the static setting of SSL_VERIFYPEER I've
added the ability to declare default curl options on the class. This
means that users that really want to one line turn off SSL_VERIFYPEER
can do so without needing to pass a custom option in every request()
call.
This commit is contained in:
Daniel Hensby 2013-01-31 16:41:24 +00:00
parent f003359047
commit 920fd71a2f
2 changed files with 59 additions and 24 deletions

View File

@ -17,6 +17,27 @@ class RestfulService extends ViewableData {
protected $customHeaders = array(); protected $customHeaders = array();
protected $proxy; protected $proxy;
protected static $default_proxy; protected static $default_proxy;
protected static $default_curl_options = array();
/**
* set a curl option that will be applied to all requests as default
* {@see http://php.net/manual/en/function.curl-setopt.php#refsect1-function.curl-setopt-parameters}
*
* @param int $option The cURL opt Constant
* @param mixed $value The cURL opt value
*/
public static function set_default_curl_option($option, $value) {
self::$default_curl_options[$option] = $value;
}
/**
* set many defauly curl options at once
*/
public static function set_default_curl_options($optionArray) {
foreach ($optionArray as $option => $value) {
self::set_default_curl_option($option, $value);
}
}
/** /**
* Sets default proxy settings for outbound RestfulService connections * Sets default proxy settings for outbound RestfulService connections
@ -119,7 +140,7 @@ class RestfulService extends ViewableData {
$method, $method,
$data, $data,
array_merge((array)$this->customHeaders, (array)$headers), array_merge((array)$this->customHeaders, (array)$headers),
$curlOptions, array_merge(self::$default_curl_options,$curlOptions),
$this->getBasicAuthString() $this->getBasicAuthString()
)); ));
@ -175,6 +196,7 @@ class RestfulService extends ViewableData {
$timeout = 5; $timeout = 5;
$sapphireInfo = new SapphireInfo(); $sapphireInfo = new SapphireInfo();
$useragent = 'SilverStripe/' . $sapphireInfo->Version(); $useragent = 'SilverStripe/' . $sapphireInfo->Version();
$curlOptions = array_merge(self::$default_curl_options, $curlOptions);
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@ -183,7 +205,6 @@ class RestfulService extends ViewableData {
if(!ini_get('open_basedir')) curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); if(!ini_get('open_basedir')) curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
//include headers in the response //include headers in the response
//curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HEADER, true);
// Add headers // Add headers
@ -220,17 +241,9 @@ class RestfulService extends ViewableData {
// Run request // Run request
$rawResponse = curl_exec($ch); $rawResponse = curl_exec($ch);
$curlError = curl_error($ch); $response = $this->extractResponse($ch, $rawResponse);
$responseHeaders = array();
$responseBody = '';
$this->extractResponse($ch, $rawResponse, $responseBody, $responseHeaders);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($curlError !== '' || $statusCode == 0) $statusCode = 500;
curl_close($ch); curl_close($ch);
$response = new RestfulService_Response($responseBody, $statusCode, $responseHeaders);
return $response; return $response;
} }
@ -279,14 +292,23 @@ class RestfulService extends ViewableData {
* *
* @param curl_handle $ch The curl handle for the request * @param curl_handle $ch The curl handle for the request
* @param string $rawResponse The raw response text * @param string $rawResponse The raw response text
* @param string &$body the body text *
* @param array &headers The header array * @return RestfulService_Response The response object
*/ */
protected function extractResponse($ch, $rawResponse, &$body, &$headers) { protected function extractResponse($ch, $rawResponse) {
//get the status code
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//normalise the status code
if($curlError !== '' || $statusCode == 0) $statusCode = 500;
//calculate the length of the header and extract it
$headerLength = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headerLength = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$rawHeaders = substr($rawResponse, 0, $headerLength); $rawHeaders = substr($rawResponse, 0, $headerLength);
//extract the body
$body = substr($rawResponse, $headerLength); $body = substr($rawResponse, $headerLength);
$headers = self::parse_raw_headers($rawHeaders); //parse the headers
$headers = $this->parseRawHeaders($rawHeaders);
//return the response object
return new RestfulService_Response($body, $statusCode, $headers);
} }
/** /**
@ -294,7 +316,7 @@ class RestfulService extends ViewableData {
* *
* Any header that we see more than once is turned into an array. * Any header that we see more than once is turned into an array.
* *
* This is meant to mimic htt_parse_headers {@link http://php.net/manual/en/function.http-parse-headers.php} * This is meant to mimic http_parse_headers {@link http://php.net/manual/en/function.http-parse-headers.php}
* thanks to comment #77241 on that page for foundation of this * thanks to comment #77241 on that page for foundation of this
* *
* @param string $rawHeaders The raw header string * @param string $rawHeaders The raw header string
@ -514,7 +536,7 @@ class RestfulService_Response extends SS_HTTPResponse {
protected $simpleXML; protected $simpleXML;
/** /**
* @var boolean It should be populated with cached content * @var boolean It should be populated with cached request
* when a request referring to this response was unsuccessful * when a request referring to this response was unsuccessful
*/ */
protected $cachedResponse = false; protected $cachedResponse = false;
@ -557,6 +579,19 @@ class RestfulService_Response extends SS_HTTPResponse {
return false; return false;
} }
/**
* @param string
*/
public function setCachedBody($content) {
Deprecation::notice('3.1', 'Setting the response body is now deprecated, set the cached request instead');
if (!$this->cachedResponse) {
$this->cachedResponse = new RestfulService_Response($content);
}
else {
$this->cachedResponse->setBody = $content;
}
}
/** /**
* @param string * @param string
*/ */

View File

@ -184,7 +184,7 @@ class RestfulServiceTest extends SapphireTest {
'bar=foo' 'bar=foo'
) )
); );
$headerFunction = new ReflectionMethod('RestfulService', 'parse_raw_headers'); $headerFunction = new ReflectionMethod('RestfulService', 'parseRawHeaders');
$headerFunction->setAccessible(true); $headerFunction->setAccessible(true);
$this->assertEquals( $this->assertEquals(
$expected, $expected,