Skip to content

Commit

Permalink
[URI] Non-hierarchical URIs can now be built using the builder.
Browse files Browse the repository at this point in the history
  • Loading branch information
glynos committed Mar 13, 2012
1 parent ae100bb commit 029b917
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 3 deletions.
8 changes: 7 additions & 1 deletion boost/network/uri/directives/scheme.hpp
Expand Up @@ -10,6 +10,7 @@

# include <boost/range/begin.hpp>
# include <boost/range/end.hpp>
# include <boost/network/uri/schemes.hpp>


namespace boost {
Expand All @@ -26,7 +27,12 @@ struct scheme_directive {
>
void operator () (Uri &uri) const {
uri.append(scheme);
uri.append("://");
if (non_hierarchical_schemes::exists(scheme)) {
uri.append(":");
}
else {
uri.append("://");
}
}

std::string scheme;
Expand Down
40 changes: 40 additions & 0 deletions boost/network/uri/schemes.hpp
@@ -0,0 +1,40 @@
// Copyright 2012 Glyn Matthews.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)


#ifndef __BOOST_NETWORK_URI_SCHEMES_INC__
# define __BOOST_NETWORK_URI_SCHEMES_INC__


#include <boost/unordered_set.hpp>
#include <string>


namespace boost {
namespace network {
namespace uri {
struct hierarchical_schemes {

static void register_(const std::string &scheme);
static bool exists(const std::string &scheme);

static boost::unordered_set<std::string> schemes_;

};

struct non_hierarchical_schemes {

static void register_(const std::string &scheme);
static bool exists(const std::string &scheme);

static boost::unordered_set<std::string> schemes_;

};
} // namespace uri
} // namespace network
} // namespace boost


#endif // __BOOST_NETWORK_URI_SCHEMES_INC__
2 changes: 1 addition & 1 deletion boost/network/uri/uri.hpp
Expand Up @@ -279,7 +279,7 @@ bool is_valid(const uri &uri_) {

inline
bool operator == (const uri &lhs, const uri &rhs) {
return std::equal(lhs.begin(), lhs.end(), rhs.begin());
return boost::equal(lhs, rhs);
}
} // namespace uri
} // namespace network
Expand Down
2 changes: 1 addition & 1 deletion libs/network/src/CMakeLists.txt
Expand Up @@ -8,7 +8,7 @@

include_directories(${CPP-NETLIB_SOURCE_DIR})

set(CPP-NETLIB_URI_SRCS uri/parse.cpp)
set(CPP-NETLIB_URI_SRCS uri/parse.cpp uri/schemes.cpp)
add_library(cppnetlib-uri ${CPP-NETLIB_URI_SRCS})

set(CPP-NETLIB_HTTP_SERVER_SRCS server_request_parsers_impl.cpp)
Expand Down
71 changes: 71 additions & 0 deletions libs/network/src/uri/schemes.cpp
@@ -0,0 +1,71 @@
// Copyright 2012 Glyn Matthews.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)


#include <boost/network/uri/schemes.hpp>


namespace boost {
namespace network {
namespace uri {
boost::unordered_set<std::string> hierarchical_schemes::schemes_;

void hierarchical_schemes::register_(const std::string &scheme) {
schemes_.insert(scheme);
}

bool hierarchical_schemes::exists(const std::string &scheme) {
schemes_.end() != schemes_.find(scheme);
}

boost::unordered_set<std::string> non_hierarchical_schemes::schemes_;

void non_hierarchical_schemes::register_(const std::string &scheme) {
schemes_.insert(scheme);
}

bool non_hierarchical_schemes::exists(const std::string &scheme) {
schemes_.end() != schemes_.find(scheme);
}

namespace {
bool register_hierarchical_schemes() {
hierarchical_schemes::register_("http");
hierarchical_schemes::register_("https");
hierarchical_schemes::register_("shttp");
hierarchical_schemes::register_("ftp");
hierarchical_schemes::register_("file");
hierarchical_schemes::register_("dns");
hierarchical_schemes::register_("nfs");
hierarchical_schemes::register_("imap");
hierarchical_schemes::register_("nntp");
hierarchical_schemes::register_("pop");
hierarchical_schemes::register_("rsync");
hierarchical_schemes::register_("snmp");
hierarchical_schemes::register_("telnet");
hierarchical_schemes::register_("svn");
hierarchical_schemes::register_("svn+ssh");
hierarchical_schemes::register_("git");
hierarchical_schemes::register_("git+ssh");
return true;
}

bool register_non_hierarchical_schemes() {
non_hierarchical_schemes::register_("mailto");
non_hierarchical_schemes::register_("news");
non_hierarchical_schemes::register_("im");
non_hierarchical_schemes::register_("sip");
non_hierarchical_schemes::register_("sms");
non_hierarchical_schemes::register_("xmpp");
return true;
}


static bool hierarchical = register_hierarchical_schemes();
static bool non_hierarchical = register_non_hierarchical_schemes();
} // namespace
} // namespace uri
} // namespace network
} // namespace boost
9 changes: 9 additions & 0 deletions libs/network/test/uri/url_builder_test.cpp
Expand Up @@ -163,3 +163,12 @@ BOOST_AUTO_TEST_CASE(encoded_null_char_test)
BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com");
BOOST_CHECK_EQUAL(uri::path(instance), "/");
}

BOOST_AUTO_TEST_CASE(mailto_builder_test)
{
uri::uri instance;
instance << uri::scheme("mailto") << uri::path("cpp-netlib@example.com");
BOOST_REQUIRE(uri::valid(instance));
BOOST_CHECK_EQUAL(uri::scheme(instance), "mailto");
BOOST_CHECK_EQUAL(uri::path(instance), "cpp-netlib@example.com");
}

0 comments on commit 029b917

Please sign in to comment.