services)) return false; $adapter = $this->getAdapter($service); $encoded = $adapter->encode($url); return $encoded ? $encoded : $url; } /** * Decode a URL * * @param string $url Short url * @return string Original url * @author Guillermo Rauch */ function decode($url){ if (preg_match('/^(http:\/\/)?(www\.)?([^\/]*)\/(.*)$/', $url, $results)){ if ($results[3] && $results[4]){ $service = $results[3]; $hash = $results[4]; $adapter = $this->getAdapter($service); return $adapter->decode($hash); } } return false; } /** * Returns the adapter instance for the service * * @param string $service Service * @return object Adapter * @author Guillermo Rauch */ function &getAdapter($service){ if (isset($this->adapters[$service])) return $this->adapters[$service]; require_once(sprintf('%s/services/%s.php', dirname(__FILE__), $service)); $class = $this->toClass($service); $adapter = new $class; $this->adapters[$service] = &$adapter; return $adapter; } /** * Comes up with the class name for the service (is.gd => IsGd) * * @param string $service Service to parse * @return string Class name * @author Guillermo Rauch */ function toClass($service){ $class = ''; $parts = explode('.', strtolower($service)); foreach ($parts as $part) $class .= ucfirst($part); return 'PHPShortener' . $class; } } /** * Abstract class for each service * * @package phpshortener * @author Guillermo Rauch */ class PHPShortenerService { /** * Default decoding function * * @param string $url Url to decode * @return void * @author Guillermo Rauch */ function decode($hash){ $headers = $this->getHeaders(sprintf('http://%s/%s', $this->service, $hash)); if (!$headers || !strstr($headers[0], '301')) return false; return $headers['Location']; } /** * Fetches the content of an URL, using curl or fopen * * @param string $url URL to fetch * @return string Contents * @author Guillermo Rauch */ function fetch($url){ if (function_exists('curl_init')){ $c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_USERAGENT, ini_get('user_agent') ? ini_get('user_agent') : 'PHP'); $contents = curl_exec($c); curl_close($c); return $contents; } elseif (function_exists('file_get_contents')) { return @file_get_contents($url); } else { if (false === $fh = @fopen($url, 'rb')) return false; clearstatcache(); if ($fsize = @filesize($url)) { $contents = fread($fh, $fsize); } else { $contents = ''; while (!feof($fh)) $contents .= fread($fh, 8192); } fclose($fh); return $contents; } } /** * Gets a URL headers * * @param string $url URL to check * @return array Headers of the response * @author Guillermo Rauch */ function getHeaders($url){ $headers = array(); $url = parse_url($url); $host = isset($url['host']) ? $url['host'] : ''; $port = isset($url['port']) ? $url['port'] : 80; $path = (isset($url['path']) ? $url['path'] : '/') . (isset($url['query']) ? '?' . $url['query'] : ''); $fp = fsockopen($host, $port, $errno, $errstr, 3); if ($fp){ $hdr = "GET $path HTTP/1.1\r\n"; $hdr .= "Host: $host \r\n"; $hdr .= "Connection: Close\r\n\r\n"; fwrite($fp, $hdr); while (!feof($fp) && $line = trim(fgets($fp, 1024))){ if ($line == "\r\n") break; if (strstr($line, ':')){ list($key, $val) = explode(': ', $line, 2); if ($val) $headers[$key] = $val; else $headers[] = $key; } else { $headers[] = $line; } } fclose($fp); return $headers; } return false; } } ?>