diff --git a/includes/Wpup/UpdateServer.php b/includes/Wpup/UpdateServer.php index f6c6530..ea6d333 100644 --- a/includes/Wpup/UpdateServer.php +++ b/includes/Wpup/UpdateServer.php @@ -11,13 +11,7 @@ public function __construct($serverUrl = null, $serverDirectory = null) { $serverDirectory = realpath(__DIR__ . '/../..'); } if ( $serverUrl === null ) { - //Default to the current URL minus the query and "index.php". - $serverUrl = 'http://' . $_SERVER['HTTP_HOST']; - $path = $_SERVER['SCRIPT_NAME']; - if ( basename($path) === 'index.php' ) { - $path = dirname($path) . '/'; - } - $serverUrl .= $path; + $serverUrl = self::guessServerUrl(); } $this->serverUrl = $serverUrl; @@ -26,6 +20,56 @@ public function __construct($serverUrl = null, $serverDirectory = null) { $this->cache = new Wpup_FileCache($serverDirectory . '/cache'); } + /** + * Guess the Server Url based on the current request. + * + * Defaults to the current URL minus the query and "index.php". + * + * @static + * + * @return string Url + */ + public static function guessServerUrl() { + $serverUrl = ( self::isSsl() ? 'https' : 'http' ); + $serverUrl .= '://' . $_SERVER['HTTP_HOST']; + $path = $_SERVER['SCRIPT_NAME']; + + if ( basename($path) === 'index.php' ) { + $dir = dirname($path); + if ( DIRECTORY_SEPARATOR === '/' ) { + $path = $dir . '/'; + } else { + // Fix Windows + $path = str_replace('\\', '/', $dir); + //Make sure there's a trailing slash. + if ( substr($path, -1) !== '/' ) { + $path .= '/'; + } + } + } + + $serverUrl .= $path; + return $serverUrl; + } + + /** + * Determine if ssl is used. + * + * @see WP core - wp-includes/functions.php + * + * @return bool True if SSL, false if not used. + */ + public static function isSsl() { + if ( isset($_SERVER['HTTPS']) ) { + if ( $_SERVER['HTTPS'] == '1' || strtolower($_SERVER['HTTPS']) === 'on' ) { + return true; + } + } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { + return true; + } + return false; + } + /** * Process an update API request. * @@ -215,8 +259,8 @@ protected function logRequest($query) { $columns = array( isset($_SERVER['REMOTE_ADDR']) ? str_pad($_SERVER['REMOTE_ADDR'], 15, ' ') : '-', isset($_SERVER['REQUEST_METHOD']) ? str_pad($_SERVER['REQUEST_METHOD'], 4, ' ') : '-', - isset($query['action']) ? $query['action'] : '-', - isset($query['slug']) ? $query['slug'] : '-', + isset($query['action']) ? $query['action'] : '-', + isset($query['slug']) ? $query['slug'] : '-', isset($query['installed_version']) ? $query['installed_version'] : '-', isset($wpVersion) ? $wpVersion : '-', isset($wpSiteUrl) ? $wpSiteUrl : '-', @@ -339,10 +383,13 @@ protected function exitWithError($message = '', $httpStatus = 500) { * You can also set an argument to NULL to remove it. * * @param array $args An associative array of query arguments. - * @param string $url The old URL. + * @param string $url The old URL. Optional, defaults to the request url without query arguments. * @return string New URL. */ - protected static function addQueryArg($args, $url) { + protected static function addQueryArg($args, $url = null ) { + if ( !isset($url) ) { + $url = self::guessServerUrl(); + } if ( strpos($url, '?') !== false ) { $parts = explode('?', $url, 2); $base = $parts[0] . '?';