Here you go:
function get_url(){
    // Start memory cache
    static $parse_url;
    // Return cache
    if($parse_url) {
        return $parse_url;
    }
    // Check is SSL
    $is_ssl = (
        ( is_admin() && defined('FORCE_SSL_ADMIN') && FORCE_SSL_ADMIN ===true )
        || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')
        || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
        || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
        || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443)
        || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https')
    );
    // Get protocol HTTP or HTTPS
    $http = 'http'.( $is_ssl ? 's' : '');
    // Get domain
    $domain = preg_replace('%:/{3,}%i','://',rtrim($http,'/').'://'.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''));
    $domain = rtrim($domain,'/');
    // Combine all and get full URL
    $url = preg_replace('%:/{3,}%i','://',$domain.'/'.(isset($_SERVER['REQUEST_URI']) && !empty( $_SERVER['REQUEST_URI'] ) ? ltrim($_SERVER['REQUEST_URI'], '/'): ''));
    //Save to cache
    $parse_url = array(
        'method'    =>  $http,
        'home_fold' =>  str_replace($domain,'',home_url()),
        'url'       =>  $url,
        'domain'    =>  $domain,
    );
    // Return
    return $parse_url;
}
I build this function to work in one my plugin that cover all WordPress and PHP versions.
Tested on few thousand installations.
Feel free to use it!