HEX
Server: nginx/1.28.1
System: Linux iZgw8b5bpgd4jyptfmmmxgZ 6.6.102-5.2.alnx4.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Nov 27 23:11:10 CST 2025 x86_64
User: www (1000)
PHP: 8.2.28
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.scdc-marine.com/wp-content/plugins/Static-Html-Output/plugin/URL2/URL2.php
<?php

class Net_URL2 {
    const OPTION_STRICT = 'strict';
    const OPTION_USE_BRACKETS = 'use_brackets';
    const OPTION_DROP_SEQUENCE = 'drop_sequence';
    const OPTION_ENCODE_KEYS = 'encode_keys';
    const OPTION_SEPARATOR_INPUT = 'input_separator';
    const OPTION_SEPARATOR_OUTPUT = 'output_separator';
    private $_options = array( self::OPTION_STRICT => true, self::OPTION_USE_BRACKETS => true, self::OPTION_DROP_SEQUENCE => true, self::OPTION_ENCODE_KEYS => true, self::OPTION_SEPARATOR_INPUT => '&', self::OPTION_SEPARATOR_OUTPUT => '&', );
    private $_scheme = false;
    private $_userinfo = false;
    private $_host = false;
    private $_port = false;
    private $_path = '';
    private $_query = false;
    private $_fragment = false;

    public function __construct( $url, array $options = array() ) {
        foreach ( $options as $optionName => $value ) {
            if ( array_key_exists( $optionName, $this->_options ) ) {
                $this->_options[ $optionName ] = $value;
            }
        }
        $this->parseUrl( $url );
    }

    public function __set( $var, $arg ) {
        $method = 'set' . $var;
        if ( method_exists( $this, $method ) ) {
            $this->$method( $arg );
        }
    }

    public function __get( $var ) {
        $method = 'get' . $var;
        if ( method_exists( $this, $method ) ) {
            return $this->$method();
        }
        return false;
    }

    public function getScheme() {
        return $this->_scheme;
    }

    public function setScheme( $scheme ) {
        $this->_scheme = $scheme;
        return $this;
    }

    public function getUser() {
        return $this->_userinfo !== false ? preg_replace( '(:.*$)', '', $this->_userinfo ) : false;
    }

    public function getPassword() {
        return $this->_userinfo !== false ? substr( strstr( $this->_userinfo, ':' ), 1 ) : false;
    }

    public function getUserinfo() {
        return $this->_userinfo;
    }

    public function setUserinfo( $userinfo, $password = false ) {
        if ( $password !== false ) {
            $userinfo .= ':' . $password;
        }
        if ( $userinfo !== false ) {
            $userinfo = $this->_encodeData( $userinfo );
        }
        $this->_userinfo = $userinfo;
        return $this;
    }

    public function getHost() {
        return $this->_host;
    }

    public function setHost( $host ) {
        $this->_host = $host;
        return $this;
    }

    public function getPort() {
        return $this->_port;
    }

    public function setPort( $port ) {
        $this->_port = $port;
        return $this;
    }

    public function getAuthority() {
        if ( false === $this->_host ) {
            return false;
        }
        $authority = '';
        if ( strlen( $this->_userinfo ) ) {
            $authority .= $this->_userinfo . '@';
        }
        $authority .= $this->_host;
        if ( $this->_port !== false ) {
            $authority .= ':' . $this->_port;
        }
        return $authority;
    }

    public function setAuthority( $authority ) {
        $this->_userinfo = false;
        $this->_host = false;
        $this->_port = false;
        if ( '' === $authority ) {
            $this->_host = $authority;
            return $this;
        }
        if ( !preg_match( '(^(([^@]*)@)?(.+?)(:(\d*))?$)', $authority, $matches ) ) {
            return $this;
        }
        if ( $matches[ 1 ] ) {
            $this->_userinfo = $this->_encodeData( $matches[ 2 ] );
        }
        $this->_host = $matches[ 3 ];
        if ( isset( $matches[ 5 ] ) && strlen( $matches[ 5 ] ) ) {
            $this->_port = $matches[ 5 ];
        }
        return $this;
    }

    public function getPath() {
        return $this->_path;
    }

    public function setPath( $path ) {
        $this->_path = $path;
        return $this;
    }

    public function getQuery() {
        return $this->_query;
    }

    public function setQuery( $query ) {
        $this->_query = $query;
        return $this;
    }

    public function getFragment() {
        return $this->_fragment;
    }

    public function setFragment( $fragment ) {
        $this->_fragment = $fragment;
        return $this;
    }

    public function getQueryVariables() {
        $separator = $this->getOption( self::OPTION_SEPARATOR_INPUT );
        $encodeKeys = $this->getOption( self::OPTION_ENCODE_KEYS );
        $useBrackets = $this->getOption( self::OPTION_USE_BRACKETS );
        $return = array();
        for ( $part = strtok( $this->_query, $separator );
        strlen( $part );
        $part = strtok( $separator ) ) {
            list( $key, $value ) = explode( '=', $part, 2 ) + array( 1 => '' );
            if ( $encodeKeys ) {
                $key = rawurldecode( $key );
            }
            $value = rawurldecode( $value );
            if ( $useBrackets ) {
                $return = $this->_queryArrayByKey( $key, $value, $return );
            } else {
                if ( isset( $return[ $key ] ) ) {
                    $return[ $key ] = ( array ) $return[ $key ];
                    $return[ $key ][] = $value;
                } else {
                    $return[ $key ] = $value;
                }
            }
        }
        return $return;
    }

    private function _queryArrayByKey( $key, $value, array $array = array() ) {
        if ( !strlen( $key ) ) {
            return $array;
        }
        $offset = $this->_queryKeyBracketOffset( $key );
        if ( $offset === false ) {
            $name = $key;
        } else {
            $name = substr( $key, 0, $offset );
        }
        if ( !strlen( $name ) ) {
            return $array;
        }
        if ( !$offset ) {
            $array[ $name ] = $value;
        } else {
            $brackets = substr( $key, $offset );
            if ( !isset( $array[ $name ] ) ) {
                $array[ $name ] = null;
            }
            $array[ $name ] = $this->_queryArrayByBrackets( $brackets, $value, $array[ $name ] );
        }
        return $array;
    }

    private function _queryArrayByBrackets( $buffer, $value, array $array = null ) {
        $entry = &$array;
        for ( $iteration = 0; strlen( $buffer );
        $iteration++ ) {
            $open = $this->_queryKeyBracketOffset( $buffer );
            if ( $open !== 0 ) {
                if ( $iteration ) {
                    break;
                }
                throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Opening bracket [ must exist at offset 0' );
            }
            $close = strpos( $buffer, ']', 1 );
            if ( !$close ) {
                throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Closing bracket ] must exist, not found' );
            }
            $index = substr( $buffer, 1, $close - 1 );
            if ( strlen( $index ) ) {
                $entry = &$entry[ $index ];
            } else {
                if ( !is_array( $entry ) ) {
                    $entry = array();
                }
                $entry[] = &$new;
                $entry = &$new;
                unset( $new );
            }
            $buffer = substr( $buffer, $close + 1 );
        }
        $entry = $value;
        return $array;
    }

    private function _queryKeyBracketOffset( $key ) {
        if ( false !== $open = strpos( $key, '[' ) and false === strpos( $key, ']', $open + 1 ) ) {
            $open = false;
        }
        return $open;
    }

    public function setQueryVariables( array $array ) {
        if ( !$array ) {
            $this->_query = false;
        } else {
            $this->_query = $this->buildQuery( $array, $this->getOption( self::OPTION_SEPARATOR_OUTPUT ) );
        }
        return $this;
    }

    public function setQueryVariable( $name, $value ) {
        $array = $this->getQueryVariables();
        $array[ $name ] = $value;
        $this->setQueryVariables( $array );
        return $this;
    }

    public function unsetQueryVariable( $name ) {
        $array = $this->getQueryVariables();
        unset( $array[ $name ] );
        $this->setQueryVariables( $array );
    }

    public function getURL() {
        $url = '';
        if ( $this->_scheme !== false ) {
            $url .= $this->_scheme . ':';
        }
        $authority = $this->getAuthority();
        if ( $authority === false && strtolower( $this->_scheme ) === 'file' ) {
            $authority = '';
        }
        $url .= $this->_buildAuthorityAndPath( $authority, $this->_path );
        if ( $this->_query !== false ) {
            $url .= '?' . $this->_query;
        }
        if ( $this->_fragment !== false ) {
            $url .= '#' . $this->_fragment;
        }
        return $url;
    }

    private function _buildAuthorityAndPath( $authority, $path ) {
        if ( $authority === false ) {
            return $path;
        }
        $terminator = ( $path !== '' && $path[ 0 ] !== '/' ) ? '/' : '';
        return '//' . $authority . $terminator . $path;
    }

    public function __toString() {
        return $this->getURL();
    }

    public function getNormalizedURL() {
        $url = clone $this;
        $url->normalize();
        return $url->getURL();
    }

    public function normalize() {
        if ( $this->_scheme ) {
            $this->_scheme = strtolower( $this->_scheme );
        }
        if ( $this->_host ) {
            $this->_host = strtolower( $this->_host );
        }
        if ( '' === $this->_port || $this->_port && $this->_scheme && $this->_port == getservbyname( $this->_scheme, 'tcp' ) ) {
            $this->_port = false;
        }
        $fields = array( &$this->_userinfo, &$this->_host, &$this->_path, &$this->_query, &$this->_fragment );
        foreach ( $fields as &$field ) {
            if ( $field !== false ) {
                $field = $this->_normalize( "$field" );
            }
        }
        unset( $field );
        $this->_path = self::removeDotSegments( $this->_path );
        if ( false !== $this->_host && '' === $this->_path ) {
            $this->_path = '/';
        }
        if ( strlen( $this->getAuthority() ) && strlen( $this->_path ) && $this->_path[ 0 ] !== '/' ) {
            $this->_path = '/' . $this->_path;
        }
    }

    private function _normalize( $mixed ) {
        return preg_replace_callback( '((?:%[0-9a-fA-Z]{2})+)', array( $this, '_normalizeCallback' ), $mixed );
    }

    private function _normalizeCallback( $matches ) {
        return self::urlencode( urldecode( $matches[ 0 ] ) );
    }

    public function isAbsolute() {
        return ( bool ) $this->_scheme;
    }

    public function resolve( $reference ) {
        if ( !$reference instanceof Net_URL2 ) {
            $reference = new self( $reference );
        }
        if ( !$reference->_isFragmentOnly() && !$this->isAbsolute() ) {
            throw new Exception( 'Base-URL must be absolute if reference is not fragment-only' );
        }
        if ( !$this->getOption( self::OPTION_STRICT ) && $reference->_scheme == $this->_scheme ) {
            $reference->_scheme = false;
        }
        $target = new self( '' );
        if ( $reference->_scheme !== false ) {
            $target->_scheme = $reference->_scheme;
            $target->setAuthority( $reference->getAuthority() );
            $target->_path = self::removeDotSegments( $reference->_path );
            $target->_query = $reference->_query;
        } else {
            $authority = $reference->getAuthority();
            if ( $authority !== false ) {
                $target->setAuthority( $authority );
                $target->_path = self::removeDotSegments( $reference->_path );
                $target->_query = $reference->_query;
            } else {
                if ( $reference->_path == '' ) {
                    $target->_path = $this->_path;
                    if ( $reference->_query !== false ) {
                        $target->_query = $reference->_query;
                    } else {
                        $target->_query = $this->_query;
                    }
                } else {
                    if ( substr( $reference->_path, 0, 1 ) == '/' ) {
                        $target->_path = self::removeDotSegments( $reference->_path );
                    } else {
                        if ( $this->_host !== false && $this->_path == '' ) {
                            $target->_path = '/' . $reference->_path;
                        } else {
                            $i = strrpos( $this->_path, '/' );
                            if ( $i !== false ) {
                                $target->_path = substr( $this->_path, 0, $i + 1 );
                            }
                            $target->_path .= $reference->_path;
                        }
                        $target->_path = self::removeDotSegments( $target->_path );
                    }
                    $target->_query = $reference->_query;
                }
                $target->setAuthority( $this->getAuthority() );
            }
            $target->_scheme = $this->_scheme;
        }
        $target->_fragment = $reference->_fragment;
        return $target;
    }

    private function _isFragmentOnly() {
        return ( $this->_fragment !== false && $this->_query === false && $this->_path === '' && $this->_port === false && $this->_host === false && $this->_userinfo === false && $this->_scheme === false );
    }
    public static function removeDotSegments( $path ) {
        $path = ( string ) $path;
        $output = '';
        $loopLimit = 256;
        $j = 0;
        while ( '' !== $path && $j++ < $loopLimit ) {
            if ( substr( $path, 0, 2 ) === './' ) {
                $path = substr( $path, 2 );
            } elseif ( substr( $path, 0, 3 ) === '../' ) {
                $path = substr( $path, 3 );
            } elseif ( substr( $path, 0, 3 ) === '/./' || $path === '/.' ) {
                $path = '/' . substr( $path, 3 );
            } elseif ( substr( $path, 0, 4 ) === '/../' || $path === '/..' ) {
                $path = '/' . substr( $path, 4 );
                $i = strrpos( $output, '/' );
                $output = $i === false ? '' : substr( $output, 0, $i );
            } elseif ( $path === '.' || $path === '..' ) {
                $path = '';
            } else {
                $i = strpos( $path, '/', $path[ 0 ] === '/' );
                if ( $i === false ) {
                    $output .= $path;
                    $path = '';
                    break;
                }
                $output .= substr( $path, 0, $i );
                $path = substr( $path, $i );
            }
        }
        if ( $path !== '' ) {
            $message = sprintf( 'Unable to remove dot segments; hit loop limit %d (left: %s)', $j, var_export( $path, true ) );
            trigger_error( $message, E_USER_WARNING );
        }
        return $output;
    }
    public static function urlencode( $string ) {
        $encoded = rawurlencode( $string );
        $encoded = str_replace( '%7E', '~', $encoded );
        return $encoded;
    }
    public static function getCanonical() {
        if ( !isset( $_SERVER[ 'REQUEST_METHOD' ] ) ) {
            throw new Exception( 'Script was not called through a webserver' );
        }
        $url = new self( $_SERVER[ 'PHP_SELF' ] );
        $url->_scheme = isset( $_SERVER[ 'HTTPS' ] ) ? 'https' : 'http';
        $url->_host = $_SERVER[ 'SERVER_NAME' ];
        $port = $_SERVER[ 'SERVER_PORT' ];
        if ( $url->_scheme == 'http' && $port != 80 || $url->_scheme == 'https' && $port != 443 ) {
            $url->_port = $port;
        }
        return $url;
    }
    public static function getRequestedURL() {
        return self::getRequested()->getUrl();
    }
    public static function getRequested() {
        if ( !isset( $_SERVER[ 'REQUEST_METHOD' ] ) ) {
            throw new Exception( 'Script was not called through a webserver' );
        }
        $url = new self( $_SERVER[ 'REQUEST_URI' ] );
        $url->_scheme = isset( $_SERVER[ 'HTTPS' ] ) ? 'https' : 'http';
        $url->setAuthority( $_SERVER[ 'HTTP_HOST' ] );
        return $url;
    }

    public function getOption( $optionName ) {
        return isset( $this->_options[ $optionName ] ) ? $this->_options[ $optionName ] : false;
    }
    protected function buildQuery( array $data, $separator, $key = null ) {
        $query = array();
        $drop_names = ( $this->_options[ self::OPTION_DROP_SEQUENCE ] === true && array_keys( $data ) === array_keys( array_values( $data ) ) );
        foreach ( $data as $name => $value ) {
            if ( $this->getOption( self::OPTION_ENCODE_KEYS ) === true ) {
                $name = rawurlencode( $name );
            }
            if ( $key !== null ) {
                if ( $this->getOption( self::OPTION_USE_BRACKETS ) === true ) {
                    $drop_names && $name = '';
                    $name = $key . '[' . $name . ']';
                } else {
                    $name = $key;
                }
            }
            if ( is_array( $value ) ) {
                $query[] = $this->buildQuery( $value, $separator, $name );
            } else {
                $query[] = $name . '=' . rawurlencode( $value );
            }
        }
        return implode( $separator, $query );
    }
    protected function parseUrl( $url ) {
        preg_match( '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)', $url, $matches );
        $this->_scheme = !empty( $matches[ 1 ] ) ? $matches[ 2 ] : false;
        $this->setAuthority( !empty( $matches[ 3 ] ) ? $matches[ 4 ] : false );
        $this->_path = $this->_encodeData( $matches[ 5 ] );
        $this->_query = !empty( $matches[ 6 ] ) ? $this->_encodeData( $matches[ 7 ] ) : false ;
        $this->_fragment = !empty( $matches[ 8 ] ) ? $matches[ 9 ] : false;
    }

    private function _encodeData( $url ) {
        return preg_replace_callback( '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)', array( $this, '_encodeCallback' ), $url );
    }

    private function _encodeCallback( array $matches ) {
        return rawurlencode( $matches[ 0 ] );
    }
}