blob: 2c99addb02bf131441bf9b48a4eb14075d548b0b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _DECAF_INTERNAL_NET_URLUTILS_H_
#define _DECAF_INTERNAL_NET_URLUTILS_H_
#include <decaf/util/Config.h>
#include <decaf/lang/String.h>
#include <decaf/net/URL.h>
namespace decaf {
namespace internal {
namespace net {
class DECAF_API URLUtils {
private:
URLUtils();
public:
/**
* File based URL instance with an empty host value are always considered
* to have a host value of "localhost".
*
* @param url
* the URL whose host value is to be returned.
*
* @return the host value or 'localhost' for file based protocols.
*/
static decaf::lang::String getHost(const decaf::net::URL& url);
/**
* Returns the path will relative path segments like ".." and "." resolved.
* The returned path will not necessarily start with a "/" character. This
* handles ".." and "." segments at both the beginning and end of the path.
*
* @param discardRelativePrefix
* true to remove leading ".." segments from the path. This is appropriate
* for paths that are known to be absolute.
*
* @return the canonicalized Path value.
*/
static decaf::lang::String canonicalizePath(const decaf::lang::String& original, bool discardRelativePrefix);
/**
* Returns a path that can be safely concatenated with the given authority. If the
* authority is empty, this can be any path. Otherwise the paths run together like
* http://activemq.apache.html.
*
* @param authority
* The authority value from a given URL.
* @param path
* The path value from a given URL.
*
* @return a safe version of the Path value.
*/
static decaf::lang::String authoritySafePath(const decaf::lang::String& authority,
const decaf::lang::String& path);
/**
* Returns true if the given char is valid for a URL scheme taking into account its
* position in the scheme string.
*
* @param index
* The index in the scheme where the char value is from.
* @param c
* The value from the given index.
*
* @return true if the char value is valid for the given index.
*/
static bool isValidSchemeChar(int index, char c);
/**
* Returns the scheme prefix like "http" from the URL spec, or empty if the
* spec doesn't start with a scheme. Scheme prefixes match this pattern:
* (alpha ( alpha | digit | '+' | '-' | '.' )* ':')
*/
static decaf::lang::String getSchemePrefix(const decaf::lang::String& spec);
/**
* Returns the index of the first char of the given set in the passed in String
* bounded between start and end. This returns the end value if none of the characters
* exist in the requested range.
*
* This is an optimization used in URL processing as the return value is end if
* the chars are not found in the string so that processing can continue from the
* returned end value no matter what the result is.
*
* @param string
* The string to search.
* @param chars
* The set of characters to search for in the target String.
* @param start
* The start index to search from.
* @param end
* The end index to stop the search at.
*
* @return the first index that matches one of the chars or the end value if no matches..
*/
static int findFirstOf(const decaf::lang::String& string,
const decaf::lang::String& chars, int start, int end);
};
}}}
#endif /* _DECAF_INTERNAL_NET_URLUTILS_H_ */