From d6a12f791fc65a1661771ae873765d39a6aeefdd Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 6 Sep 2013 13:17:46 -0700 Subject: [PATCH] Add UniformResourceLocator and ParsedURL --- .../Builds/VisualStudio2012/beast.vcxproj | 9 +- .../VisualStudio2012/beast.vcxproj.filters | 12 +- .../beast/modules/beast_asio/beast_asio.cpp | 3 +- .../beast/modules/beast_asio/beast_asio.h | 1 + .../modules/beast_asio/protocol/HttpClient.h | 23 -- .../protocol/UniformResourceLocator.cpp | 299 ++++++++++++++++++ .../protocol/UniformResourceLocator.h | 123 +++++++ 7 files changed, 438 insertions(+), 32 deletions(-) delete mode 100644 Subtrees/beast/modules/beast_asio/protocol/HttpClient.h create mode 100644 Subtrees/beast/modules/beast_asio/protocol/UniformResourceLocator.cpp create mode 100644 Subtrees/beast/modules/beast_asio/protocol/UniformResourceLocator.h diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj index fb8d7a3428..456c4ac560 100644 --- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj +++ b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj @@ -89,16 +89,15 @@ - - + @@ -373,6 +372,12 @@ true true + + true + true + true + true + true true diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters index 2577937e2d..786c00da6a 100644 --- a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters +++ b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj.filters @@ -968,9 +968,6 @@ beast_asio\tests - - beast_asio - beast_asio\protocol @@ -986,15 +983,15 @@ beast_asio\protocol - - beast_asio\protocol - beast_asio\protocol beast_asio\protocol + + beast_asio\protocol + @@ -1483,6 +1480,9 @@ beast_asio\protocol + + beast_asio\protocol + diff --git a/Subtrees/beast/modules/beast_asio/beast_asio.cpp b/Subtrees/beast/modules/beast_asio/beast_asio.cpp index 78f3542e1d..4bb4c2b0d3 100644 --- a/Subtrees/beast/modules/beast_asio/beast_asio.cpp +++ b/Subtrees/beast/modules/beast_asio/beast_asio.cpp @@ -36,7 +36,8 @@ namespace beast #include "protocol/HandshakeDetectLogicPROXY.cpp" -#include "parsehttp/http_parser.h" +# include "parsehttp/http_parser.h" +#include "protocol/UniformResourceLocator.cpp" #include "tests/PeerTest.cpp" #include "tests/TestPeerBasics.cpp" diff --git a/Subtrees/beast/modules/beast_asio/beast_asio.h b/Subtrees/beast/modules/beast_asio/beast_asio.h index 3ab4bf176f..28c0160783 100644 --- a/Subtrees/beast/modules/beast_asio/beast_asio.h +++ b/Subtrees/beast/modules/beast_asio/beast_asio.h @@ -87,6 +87,7 @@ namespace beast #include "protocol/HandshakeDetectLogicSSL3.h" #include "protocol/HandshakeDetector.h" #include "protocol/PrefilledReadStream.h" +#include "protocol/UniformResourceLocator.h" #include "tests/TestPeerBasics.h" #include "tests/TestPeer.h" diff --git a/Subtrees/beast/modules/beast_asio/protocol/HttpClient.h b/Subtrees/beast/modules/beast_asio/protocol/HttpClient.h deleted file mode 100644 index 97febde47b..0000000000 --- a/Subtrees/beast/modules/beast_asio/protocol/HttpClient.h +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_ASIO_PROTOCOL_HTTPCLIENT_H_INCLUDED -#define BEAST_ASIO_PROTOCOL_HTTPCLIENT_H_INCLUDED - -#endif diff --git a/Subtrees/beast/modules/beast_asio/protocol/UniformResourceLocator.cpp b/Subtrees/beast/modules/beast_asio/protocol/UniformResourceLocator.cpp new file mode 100644 index 0000000000..7324c0c297 --- /dev/null +++ b/Subtrees/beast/modules/beast_asio/protocol/UniformResourceLocator.cpp @@ -0,0 +1,299 @@ +//------------------------------------------------------------------------------ +/* + This file is part of Beast: https://github.com/vinniefalco/Beast + Copyright 2013, Vinnie Falco + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +UniformResourceLocator::UniformResourceLocator () + : m_port (0) +{ +} + +UniformResourceLocator::UniformResourceLocator ( + String scheme_, + String host_, + uint16 port_, + String port_string_, + String path_, + String query_, + String fragment_, + String userinfo_) + : m_scheme (scheme_) + , m_host (host_) + , m_port (port_) + , m_port_string (port_string_) + , m_path (path_) + , m_query (query_) + , m_fragment (fragment_) + , m_userinfo (userinfo_) +{ +} + +UniformResourceLocator::UniformResourceLocator (UniformResourceLocator const& other) + : m_scheme (other.m_scheme) + , m_host (other.m_host) + , m_port (other.m_port) + , m_port_string (other.m_port_string) + , m_path (other.m_path) + , m_query (other.m_query) + , m_fragment (other.m_fragment) + , m_userinfo (other.m_userinfo) +{ +} + +UniformResourceLocator& UniformResourceLocator::operator= (UniformResourceLocator const& other) +{ + m_scheme = other.m_scheme; + m_host = other.m_host; + m_port = other.m_port; + m_port_string = other.m_port_string; + m_path = other.m_path; + m_query = other.m_query; + m_fragment = other.m_fragment; + m_userinfo = other.m_userinfo; + return *this; +} + +//------------------------------------------------------------------------------ + +String UniformResourceLocator::scheme () const +{ + return m_scheme; +} + +String UniformResourceLocator::host () const +{ + return m_host; +} + +String UniformResourceLocator::port_string () const +{ + return m_port_string; +} + +uint16 UniformResourceLocator::port () const +{ + return m_port; +} + +String UniformResourceLocator::path () const +{ + return m_path; +} + +String UniformResourceLocator::query () const +{ + return m_query; +} + +String UniformResourceLocator::fragment () const +{ + return m_fragment; +} + +String UniformResourceLocator::userinfo () const +{ + return m_userinfo; +} + +//------------------------------------------------------------------------------ +/* + From + http://en.wikipedia.org/wiki/URI_scheme + + : [ ? ] [ # ] + + e.g. + + foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose +*/ +String UniformResourceLocator::full () const +{ + String s; + + s = scheme () + "://"; + + if (userinfo () != String::empty) + s = userinfo () + "@"; + + s = s + host (); + + if (port () != 0) + s = s + ":" + String::fromNumber (port ()); + + s = s + path (); + + if (query () != String::empty) + s = "?" + query (); + + if (fragment () != String::empty) + s = "#" + fragment (); + + return s; +} +//------------------------------------------------------------------------------ + +ParsedURL::ParsedURL () + : m_error (0) +{ +} + +ParsedURL::ParsedURL (String const& url) +{ + std::string const ss (url.toStdString ()); + std::size_t const buflen (ss.size ()); + char const* const buf (ss.c_str ()); + + http_parser_url u; + + m_error = http_parser_parse_url (buf, buflen, false, &u); + + String scheme_; + String host_; + uint16 port_ (0); + String port_string_; + String path_; + String query_; + String fragment_; + String userinfo_; + + if (m_error == 0) + { + if ((u.field_set & (1< + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifndef BEAST_ASIO_PROTOCOL_UNIFORMRESOURCELOCATOR_H_INCLUDED +#define BEAST_ASIO_PROTOCOL_UNIFORMRESOURCELOCATOR_H_INCLUDED + +/** A URL. + The accompanying robust parser is hardened against all forms of attack. +*/ +class UniformResourceLocator +{ +public: + /** Construct an empty URL. */ + explicit UniformResourceLocator (); + + /** Construct a URL from it's components. */ + UniformResourceLocator ( + String schema_, + String host_, + uint16 port_, + String port_string_, + String path_, + String query_ = "", + String fragment_ = "", + String userinfo_ = ""); + + /** Copy construct a URL. */ + UniformResourceLocator (UniformResourceLocator const& other); + + /** Copy assign a URL. */ + UniformResourceLocator& operator= (UniformResourceLocator const& other); + + /** Returns the scheme of the URL. + If no scheme was specified, the string will be empty. + */ + String scheme () const; + + /** Returns the host of the URL. + If no host was specified, the string will be empty. + */ + String host () const; + + /** Returns the port number as an integer. + If no port was specified, the value will be zero. + */ + uint16 port () const; + + /** Returns the port number as a string. + If no port was specified, the string will be empty. + */ + String port_string () const; + + /** Returns the path of the URL. + If no path was specified, the string will be empty. + */ + String path () const; + + /** Returns the query parameters portion of the URL. + If no query parameters were present, the string will be empty. + */ + String query () const; + + /** Returns the URL fragment, if any. */ + String fragment () const; + + /** Returns the user information, if any. */ + String userinfo () const; + + /** Retrieve the full URL as a single string. */ + String full () const; + +private: + String m_scheme; + String m_host; + uint16 m_port; + String m_port_string; + String m_path; + String m_query; + String m_fragment; + String m_userinfo; +}; + +//------------------------------------------------------------------------------ + +/** Parses a String containing a URL. +*/ +class ParsedURL +{ +public: + ParsedURL (); + explicit ParsedURL (String const& url); + ParsedURL (int error, UniformResourceLocator const& url); + ParsedURL (ParsedURL const& other); + ParsedURL& operator= (ParsedURL const& other); + + /** Zero for success, else a non zero value indicating failure. */ + int error () const; + + /** The parsed URL if there was no error. */ + UniformResourceLocator url () const; + +private: + int m_error; + UniformResourceLocator m_url; +}; + +#endif