diff --git a/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj b/Subtrees/beast/Builds/VisualStudio2012/beast.vcxproj
index fb8d7a342..456c4ac56 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 2577937e2..786c00da6 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 78f3542e1..4bb4c2b0d 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 3ab4bf176..28c016078 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 97febde47..000000000
--- 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 000000000..7324c0c29
--- /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