Esempio n. 1
0
URI URI::resolve(const URI& relative) const
{
    URI target;

    if (relative._scheme) {
        target._scheme = relative._scheme;
        target._authority = relative._authority;
        target._path = removeDotSegments(relative._path);
        target._query = relative._query;
    }
    else {
        if (relative._authority) {
            target._authority = relative._authority;
            target._path = removeDotSegments(relative._path);
            target._query = relative._query;
        }
        else {
            if (relative._path.empty()) {
                target._path = _path;

                if (relative._query) {
                    target._query = relative._query;
                }
                else {
                    target._query = _query;
                }
            }
            else {
                // Safe to check first character
                // because already checked not empty
                if (relative._path[0] == '/') {
                    target._path = removeDotSegments(relative._path);
                }
                else {
                    target._path =
                        removeDotSegments(merge(*this, relative));
                }

                target._query = relative._query;
            }

            target._authority = _authority;
        }

        target._scheme = _scheme;
    }

    target._fragment = relative._fragment;

    return target;
}
Esempio n. 2
0
void URI::resolve(const URI& relativeURI)
{
	if (!relativeURI._scheme.empty())
	{
		_scheme   = relativeURI._scheme;
		_userInfo = relativeURI._userInfo;
		_host     = relativeURI._host;
		_port     = relativeURI._port;
		_path     = relativeURI._path;
		_query    = relativeURI._query;
		removeDotSegments();
	}
	else
	{
		if (!relativeURI._host.empty())
		{
			_userInfo = relativeURI._userInfo;
			_host     = relativeURI._host;
			_port     = relativeURI._port;
			_path     = relativeURI._path;
			_query    = relativeURI._query;
			removeDotSegments();
		}
		else
		{
			if (relativeURI._path.empty())
			{
				if (!relativeURI._query.empty())
					_query = relativeURI._query;
			}
			else
			{
				if (relativeURI._path[0] == '/')
				{
					_path = relativeURI._path;
					removeDotSegments();
				}
				else
				{
					mergePath(relativeURI._path);
				}
				_query = relativeURI._query;
			}
		}
	}
	_fragment = relativeURI._fragment;	
}
Esempio n. 3
0
void URI::normalize()
{
	removeDotSegments(!isRelative());
}