public static function create(
        $url,
        $method = RequestMethods::GET,
        array $parameters = [],
        array $cookies = [],
        array $server = [],
        array $files = [],
        array $env = [],
        $rawBody = null
    ) {
        // Define some basic server vars, but override them with the input on collision
        $server = array_replace([
                'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                'HTTP_HOST'            => 'localhost',
                'REMOTE_ADDR'          => '127.0.01',
                'SCRIPT_FILENAME'      => '',
                'SCRIPT_NAME'          => '',
                'SERVER_NAME'          => 'localhost',
                'SERVER_PORT'          => 80,
                'SERVER_PROTOCOL'      => 'HTTP/1.1',
                'HTTP_USER_AGENT'      => 'Cygnite/3.x',
                'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
                'HTTP_ACCEPT_CHARSET'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
                'REQUEST_TIME'         => time(),
            ], $server);

        $query = [];
        $post = [];

        // Set the content type for unsupported HTTP methods
        switch (strtoupper($method)) {
            case RequestMethods::GET:
                $query = $parameters;
                break;
            case RequestMethods::PATCH:
            case RequestMethods::PUT:
            case RequestMethods::DELETE:
                if (!isset($server['CONTENT_TYPE'])) {
                    $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
                }
            // no break
            case RequestMethods::POST:
                $post = $parameters;
                break;
        }

        $server['REQUEST_METHOD'] = strtoupper($method);
        $urlParts = parse_url($url);

        $server = static::setServerData($urlParts, [
            'host' => 'HTTP_HOST',
            'path' => 'REQUEST_URI',
            'user' => 'PHP_AUTH_USER',
            'pass' => 'PHP_AUTH_PW',
        ], $server);

        if (isset($urlParts['scheme'])) {
            if ($urlParts['scheme'] == 'https') {
                $server['HTTPS'] = 'on';
                $server['SERVER_PORT'] = 443;
            } else {
                unset($server['HTTPS']);
                $server['SERVER_PORT'] = 80;
            }
        }

        if (isset($urlParts['query'])) {
            parse_str(html_entity_decode($urlParts['query']), $queryFromUrl);
            $query = array_replace($queryFromUrl, $query);
        }

        if (!isset($urlParts['path'])) {
            $urlParts['path'] = '/';
        }

        $qs = http_build_query($query, '', '&');
        $server['QUERY_STRING'] = $qs;
        $server['REQUEST_URI'] = $urlParts['path'].(count($query) > 0 ? '?'.$qs : '');

        if (isset($urlParts['port'])) {
            $server = static::setServerData($urlParts, [
                'port'                 => 'SERVER_PORT',
                ":{$urlParts['port']}" => 'HTTP_HOST',
            ], $server);
        }

        return new static($query, $post, $cookies, $server, $files, $env, $rawBody);
    }