/** * Download release via HTTP * * * @param string Name of the package * @param string Version string * @param string Filename * @param boolean Uncompress file before downloading? * @return mixed * @static */ function HTTPdownload($package, $version = null, $file = null, $uncompress = false) { global $dbh; require_once "HTTP.php"; $package_id = package::info($package, 'packageid', true); if (!$package_id) { $package_id = $dbh->getOne('SELECT package_id FROM package_aliases WHERE alias_name=' . $dbh->quoteSmart($package)); if (!$package_id) { return PEAR::raiseError("release download:: package '" . htmlspecialchars($package) . "' does not exist"); } } if (PEAR::isError($package_id)) { return $package_id; } if ($file !== null) { $basename = substr($file, 0, -4); if (substr($file, -4) == '.tar') { $file = $basename . '.tgz'; $uncompress = true; } $row = $dbh->getRow("SELECT `fullpath`, `release`, `id` FROM files " . "WHERE UPPER(basename) = ?", array(strtoupper($file)), DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } elseif ($row === null) { return PEAR::raiseError("File '{$file}' not found"); } $path = $row['fullpath']; $log_release = $row['release']; $log_file = $row['id']; } elseif ($version == null) { // Get the most recent version $row = $dbh->getRow("SELECT id FROM releases " . "WHERE package = {$package_id} " . "ORDER BY releasedate DESC", DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; } elseif (release::isValidState($version)) { $version = strtolower($version); // Get the most recent version with a given state $row = $dbh->getRow("SELECT id FROM releases " . "WHERE package = {$package_id} " . "AND state = '{$version}' " . "ORDER BY releasedate DESC", DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; if (!isset($release_id)) { return PEAR::raiseError("{$package} does not have any releases with state \"{$version}\""); } } else { // Get a specific release $row = $dbh->getRow("SELECT id FROM releases " . " WHERE package = " . $dbh->quoteSmart($package_id) . " AND version = " . $dbh->quoteSmart($version), DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; } if (!isset($path) && isset($release_id)) { $sql = "SELECT fullpath, basename, `id` FROM files WHERE `release` = " . $release_id; $row = $dbh->getRow($sql, DB_FETCHMODE_ORDERED); if (PEAR::isError($row)) { return $row; } list($path, $basename, $log_file) = $row; if (empty($path) || !@is_file(PEAR_TARBALL_DIR . '/' . $basename) && !@is_file($path)) { return PEAR::raiseError("release download:: no version information found"); } $basename = substr($basename, 0, -4); } if ($uncompress) { $basename .= '.tar'; } else { $basename .= '.tgz'; } $path = PEAR_TARBALL_DIR . '/' . $basename; if (isset($path)) { if (!isset($log_release)) { $log_release = $release_id; } release::logDownload($package_id, $log_release, $log_file); header('Content-Disposition: attachment;filename=' . $basename); header('Content-type: application/octet-stream'); header('X-Sendfile: ' . '/local/www/sites/pecl.php.net/public_html/packages/' . $basename); return true; } header('HTTP/1.0 404 Not Found'); print 'File not found'; }
/** * Download release via HTTP * * @param string Name of the package * @param string Version string * @param string Filename * @param boolean Uncompress file before downloading? * @return mixed * @static */ static function HTTPdownload($package, $version = null, $file = null, $uncompress = false) { global $dbh; include_once 'pear-database-package.php'; $package_id = package::info($package, 'packageid', true); if (!$package_id) { return PEAR::raiseError("release download:: package '" . htmlspecialchars($package) . "' does not exist"); } elseif (PEAR::isError($package_id)) { return $package_id; } if ($file !== null) { if (substr($file, -4) == '.tar') { $file = substr($file, 0, -4) . '.tgz'; $uncompress = true; } $row = $dbh->getRow("SELECT fullpath, `release`, id FROM files " . "WHERE basename LIKE ?", array($file), DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } elseif ($row === null) { return PEAR::raiseError("File '{$file}' not found"); } $path = $row['fullpath']; $log_release = $row['release']; $log_file = $row['id']; $basename = $file; } elseif ($version === null) { // Get the most recent version $row = $dbh->getRow("SELECT id FROM releases " . "WHERE package = {$package_id} " . "ORDER BY releasedate DESC", DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; } elseif (release::isValidState($version)) { $version = strtolower($version); // Get the most recent version with a given state $row = $dbh->getRow("SELECT id FROM releases " . "WHERE package = {$package_id} " . "AND state = '{$version}' " . "ORDER BY releasedate DESC", DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; if (!isset($release_id)) { return PEAR::raiseError("{$package} does not have any releases with state \"{$version}\""); } } else { // Get a specific release $row = $dbh->getRow("SELECT id FROM releases " . "WHERE package = {$package_id} " . "AND version = '{$version}'", DB_FETCHMODE_ASSOC); if (PEAR::isError($row)) { return $row; } $release_id = $row['id']; } if (!isset($path) && isset($release_id)) { $sql = "SELECT fullpath, basename, id FROM files WHERE `release` = " . $release_id; $row = $dbh->getRow($sql, DB_FETCHMODE_ORDERED); if (PEAR::isError($row)) { return $row; } list($path, $basename, $log_file) = $row; if (empty($path) || !@is_file($path)) { return PEAR::raiseError("release download:: no version information found"); } } if (isset($path)) { if (!isset($log_release)) { $log_release = $release_id; } release::logDownload($package_id, $log_release, $log_file); header('Last-modified: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', filemtime($path))); header('Content-type: application/octet-stream'); if ($uncompress) { $tarname = preg_replace('/\\.tgz\\z/', '.tar', $basename); header('Content-disposition: attachment; filename="' . $tarname . '"'); readgzfile($path); } else { header('Content-disposition: attachment; filename="' . $basename . '"'); header('Content-length: ' . filesize($path)); readfile($path); } return true; } header('HTTP/1.0 404 Not Found'); echo 'File not found'; }