summaryrefslogtreecommitdiffstats
path: root/lib/libUPnP/Neptune/Source/Core/NptUri.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libUPnP/Neptune/Source/Core/NptUri.h')
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptUri.h322
1 files changed, 322 insertions, 0 deletions
diff --git a/lib/libUPnP/Neptune/Source/Core/NptUri.h b/lib/libUPnP/Neptune/Source/Core/NptUri.h
new file mode 100644
index 0000000..f3661c0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptUri.h
@@ -0,0 +1,322 @@
+/*****************************************************************
+|
+| Neptune - URI
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_URI_H_
+#define _NPT_URI_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStrings.h"
+#include "NptList.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const NPT_UInt16 NPT_URL_INVALID_PORT = 0;
+const NPT_UInt16 NPT_URL_DEFAULT_HTTP_PORT = 80;
+const NPT_UInt16 NPT_URL_DEFAULT_HTTPS_PORT = 443;
+
+/*----------------------------------------------------------------------
+| NPT_Uri
++---------------------------------------------------------------------*/
+class NPT_Uri {
+public:
+ // types
+ typedef enum {
+ SCHEME_ID_UNKNOWN,
+ SCHEME_ID_HTTP,
+ SCHEME_ID_HTTPS
+ } SchemeId;
+
+ // constants. use as a parameter to Encode()
+ static const char* const PathCharsToEncode;
+ static const char* const QueryCharsToEncode;
+ static const char* const FragmentCharsToEncode;
+ static const char* const UnsafeCharsToEncode;
+
+ // class methods
+ static NPT_String PercentEncode(const char* str, const char* chars, bool encode_percents=true);
+ static NPT_String PercentDecode(const char* str);
+ static SchemeId ParseScheme(const NPT_String& scheme);
+
+ // methods
+ NPT_Uri() : m_SchemeId(SCHEME_ID_UNKNOWN) {}
+ virtual ~NPT_Uri() {}
+ const NPT_String& GetScheme() const {
+ return m_Scheme;
+ }
+ void SetScheme(const char* scheme);
+ NPT_Result SetSchemeFromUri(const char* uri);
+ SchemeId GetSchemeId() const {
+ return m_SchemeId;
+ }
+
+protected:
+ // members
+ NPT_String m_Scheme;
+ SchemeId m_SchemeId;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery
++---------------------------------------------------------------------*/
+class NPT_UrlQuery
+{
+public:
+ // class methods
+ static NPT_String UrlEncode(const char* str, bool encode_percents=true);
+ static NPT_String UrlDecode(const char* str);
+
+ // types
+ struct Field {
+ Field(const char* name, const char* value, bool encoded);
+ NPT_String m_Name;
+ NPT_String m_Value;
+ };
+
+ // constructor
+ NPT_UrlQuery() {}
+ NPT_UrlQuery(const char* query);
+
+ // accessors
+ NPT_List<Field>& GetFields() { return m_Fields; }
+
+ // methods
+ NPT_Result Parse(const char* query);
+ NPT_Result SetField(const char* name, const char* value, bool encoded=false);
+ NPT_Result AddField(const char* name, const char* value, bool encoded=false);
+ const char* GetField(const char* name);
+ NPT_String ToString();
+
+private:
+ // members
+ NPT_List<Field> m_Fields;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Url
++---------------------------------------------------------------------*/
+class NPT_Url : public NPT_Uri {
+public:
+ /**
+ * Default constructor. This does not construct a valid URL, but an
+ * uninitialized one that can later be initialized to a valid URL by
+ * parsing or setting some of its fields.
+ */
+ NPT_Url();
+
+ /**
+ * Construct a URL by parsing an input string in its fully encoded form.
+ * If an error occurs during parsing (such as an invalid syntax), the
+ * URL will be in an invalid state (a call to IsValid() will return false).
+ *
+ * @param url The URL string in its encoded form
+ * @param default_port The default port number, or 0 if not specified
+ */
+ NPT_Url(const char* url, NPT_UInt16 default_port = 0);
+
+ /**
+ * Construct a URL from its components. When constructing a URL from
+ * components, the components are assumed to be passed in their non-encoded
+ * form, and will thus be encoded automatically.
+ *
+ * @param scheme The URL scheme
+ * @param host The host name (enclose with [ and ] for IPv6 addresses)
+ * @param port The port number
+ * @param path The path
+ * @param query The query, if any, or NULL
+ * @param fragment The fragment, if any, or NULL
+ */
+ NPT_Url(const char* scheme,
+ const char* host,
+ NPT_UInt16 port,
+ const char* path,
+ const char* query = NULL,
+ const char* fragment = NULL);
+
+ /**
+ * Parse a URL from its fully encoded form.
+ *
+ * @param url The URL string in its encoded form
+ * @param default port The defautl port number, or 0 if not specified
+ */
+ NPT_Result Parse(const char* url, NPT_UInt16 default_port = 0);
+
+ /**
+ * Parse just the path plus optional query and fragment from a fully encoded form.
+ *
+ * @param path_plus The URL path plus optional query and fragment
+ */
+ NPT_Result ParsePathPlus(const char* path_plus);
+
+ /**
+ * Returns the host part of the URL, in its encoded form
+ */
+ const NPT_String& GetHost() const { return m_Host; }
+
+ /**
+ * Returns the port number of the URL.
+ */
+ NPT_UInt16 GetPort() const { return m_Port; }
+
+ /**
+ * Returns the path part of the URL, in its encoded form
+ */
+ const NPT_String& GetPath() const { return m_Path; }
+
+ /**
+ * Returns the path part of the URL, in its encoded or decoded form
+ */
+ NPT_String GetPath(bool decoded) const { return decoded?NPT_Uri::PercentDecode(m_Path):m_Path;}
+
+ /**
+ * Returns the query part of the URL, in its encoded form
+ */
+ const NPT_String& GetQuery() const { return m_Query; }
+
+ /**
+ * Returns the fragment part of the URL, in its encoded form
+ */
+ const NPT_String& GetFragment() const { return m_Fragment; }
+
+ /**
+ * Returns whether the URL is valid or not. Invalid URLs are uninitialized or
+ * not fully initialized URLs.
+ *
+ * @return true if the URL is valid, false if it is not.
+ */
+ virtual bool IsValid() const;
+
+ /**
+ * Resets a URL to an uninitialized state.
+ */
+ void Reset();
+
+ /**
+ * Returns whether the URL has a query part or not.
+ *
+ * @return true if the URL has a query part, false if it does not.
+ */
+ bool HasQuery() const { return m_HasQuery; }
+
+ /**
+ * Returns whether the URL has a fragment part or not.
+ *
+ * @return true if the URL has a fragment part, false if it does not.
+ */
+ bool HasFragment() const { return m_HasFragment; }
+
+ /**
+ * Sets the host part of the URL.
+ *
+ * @param host The host part of the URL (enclose with [ and ] for IPv6 addresses)
+ */
+ NPT_Result SetHost(const char* host);
+
+ /**
+ * Sets the port number of the URL.
+ *
+ * @param port The port number of the URL
+ */
+ NPT_Result SetPort(NPT_UInt16 port);
+
+ /**
+ * Sets the path part of the URL.
+ *
+ * @param path The path part of the URL
+ * @param encoded Boolean flag indicating whether the path parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetPath(const char* path, bool encoded=false);
+
+ /**
+ * Sets the query part of the URL.
+ *
+ * @param query The query part of the URL
+ * @param encoded Boolean flag indicating whether the query parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetQuery(const char* query, bool encoded=false);
+
+ /**
+ * Sets the fragment part of the URL.
+ *
+ * @param query The fragment part of the URL
+ * @param encoded Boolean flag indicating whether the fragment parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetFragment(const char* fragment, bool encoded=false);
+
+ /**
+ * Return the string representation of the URL in a way that can be used in
+ * an HTTP request (i.e just the portion of the URL starting with the path)
+ *
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToRequestString(bool with_fragment = false) const;
+
+ /**
+ * Return the string representation of the URL.
+ *
+ * @param default_port default port number for the scheme. If the port number of
+ * the URL is not equal to the default port, then port number is explicitely
+ * included in the string representation of the URL.
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToStringWithDefaultPort(NPT_UInt16 default_port, bool with_fragment = true) const;
+
+ /**
+ * Return the string representation of the URL.
+ *
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToString(bool with_fragment = true) const;
+
+protected:
+ // members
+ NPT_String m_Host;
+ bool m_HostIsIpv6Address;
+ NPT_UInt16 m_Port;
+ NPT_String m_Path;
+ bool m_HasQuery;
+ NPT_String m_Query;
+ bool m_HasFragment;
+ NPT_String m_Fragment;
+};
+
+#endif // _NPT_URI_H_