function shorten_fetch in Shorten URLs 7
Same name and namespace in other branches
- 8.2 shorten.module \shorten_fetch()
- 8 shorten.module \shorten_fetch()
- 6 shorten.module \shorten_fetch()
- 7.2 shorten.module \shorten_fetch()
Downloads the response of the URL abbreviation service.
Parameters
$url: The URL which will return an abbreviated URL from any service. Includes both the service and the URL to be shortened.
$tag: If the response is XML, the tag within which to look for the shortened URL.
$special: A special format the service will return. Currently only supports 'json.'
$options: An associative array of options to allow executing an advanced request. Valid keys include anything that would work with drupal_http_request() except that $options['context'] is only used with the PHP request method.
Return value
An abbreviated URL or FALSE if fetching the abbreviated URL fails.
2 calls to shorten_fetch()
- _shorten_get_url in ./
shorten.module - Shortens URLs. Times out after three (3) seconds.
- _shorten_googl in ./
shorten.module - Helps get a shortened URL from Goo.gl.
File
- ./
shorten.module, line 355 - Shortens URLs via external services.
Code
function shorten_fetch($url, $tag = '', $special = '', $options = array()) {
$options += array(
'headers' => array(),
'method' => 'GET',
'data' => NULL,
'max_redirects' => 3,
'timeout' => variable_get('shorten_timeout', 3),
'context' => NULL,
);
if (variable_get('shorten_method', _shorten_method_default()) == 'php') {
$result = drupal_http_request($url, $options);
$contents = isset($result->data) && !isset($result->error) ? $result->data : NULL;
if (!empty($result->error)) {
watchdog('shorten', '@code error shortening the URL @url using the PHP request method. Error message: %error', array(
'@code' => $result->code,
'@url' => $url,
'%error' => $result->error,
), WATCHDOG_ERROR, $url);
}
}
elseif (variable_get('shorten_method', _shorten_method_default()) == 'curl') {
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, $options['timeout']);
// https://drupal.org/node/1481634
//if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
// curl_setopt($c, CURLOPT_FOLLOWLOCATION, TRUE);
//}
curl_setopt($c, CURLOPT_MAXREDIRS, $options['max_redirects']);
// defined() checks due to https://drupal.org/node/1469400
// Specifying the protocol is necessary to avoid malicious redirects to POP
// in libcurl 7.26.0 to 7.28.1
if (defined('CURLOPT_REDIR_PROTOCOLS') && defined('CURLPROTO_HTTP') && defined('CURLPROTO_HTTPS')) {
curl_setopt($c, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
}
curl_setopt($c, CURLOPT_URL, $url);
if ($options['method'] != 'GET') {
$uri = @parse_url($url);
if ($uri['scheme'] == 'http') {
curl_setopt($c, CURLOPT_PORT, isset($uri['port']) ? $uri['port'] : 80);
if (defined('CURLOPT_PROTOCOLS') && defined('CURLPROTO_HTTP')) {
curl_setopt($c, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
}
}
elseif ($uri['scheme'] == 'https') {
curl_setopt($c, CURLOPT_PORT, isset($uri['port']) ? $uri['port'] : 443);
if (defined('CURLOPT_PROTOCOLS') && defined('CURLPROTO_HTTPS')) {
curl_setopt($c, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
}
}
if (!empty($options['headers'])) {
$curl_headers = array();
foreach ($options['headers'] as $key => $value) {
$curl_headers[] = trim($key) . ': ' . trim($value);
}
curl_setopt($c, CURLOPT_HTTPHEADER, $curl_headers);
}
if ($options['method'] == 'POST') {
curl_setopt($c, CURLOPT_POST, TRUE);
curl_setopt($c, CURLOPT_POSTFIELDS, $options['data']);
}
else {
curl_setopt($c, CURLOPT_CUSTOMREQUEST, $options['method']);
}
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE);
}
$contents = curl_exec($c);
curl_close($c);
}
else {
return FALSE;
}
if (!$contents) {
return FALSE;
}
if ($tag) {
if (!$special) {
$contents = _shorten_xml($contents, $tag);
}
elseif ($special == 'json') {
$contents = json_decode($contents, TRUE);
$contents = $contents[$tag];
}
}
if (!$contents || $contents == $url) {
return FALSE;
}
return $contents;
}