diff options
Diffstat (limited to 'graphics/asymptote/LspCpp/third_party/uri/src/uri_builder.cpp')
-rw-r--r-- | graphics/asymptote/LspCpp/third_party/uri/src/uri_builder.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/uri_builder.cpp b/graphics/asymptote/LspCpp/third_party/uri/src/uri_builder.cpp new file mode 100644 index 0000000000..e47e8acb44 --- /dev/null +++ b/graphics/asymptote/LspCpp/third_party/uri/src/uri_builder.cpp @@ -0,0 +1,151 @@ +// Copyright (c) Glyn Matthews 2012-2016. +// 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 <locale> +#include "network/uri/uri_builder.hpp" +#include "detail/uri_normalize.hpp" +#include "detail/uri_parse_authority.hpp" +#include "detail/algorithm.hpp" + +namespace network { +uri_builder::uri_builder(const network::uri &base_uri) { + if (base_uri.has_scheme()) { + scheme_ = base_uri.scheme().to_string(); + } + + if (base_uri.has_user_info()) { + user_info_ = base_uri.user_info().to_string(); + } + + if (base_uri.has_host()) { + host_ = base_uri.host().to_string(); + } + + if (base_uri.has_port()) { + port_ = base_uri.port().to_string(); + } + + if (base_uri.has_path()) { + path_ = base_uri.path().to_string(); + } + + if (base_uri.has_query()) { + query_ = base_uri.query().to_string(); + } + + if (base_uri.has_fragment()) { + fragment_ = base_uri.fragment().to_string(); + } +} + +uri_builder::~uri_builder() noexcept {} + +network::uri uri_builder::uri() const { return network::uri(*this); } + +void uri_builder::set_scheme(string_type &&scheme) { + // validate scheme is valid and normalize + scheme_ = scheme; + detail::transform(*scheme_, std::begin(*scheme_), + [](char ch) { return std::tolower(ch, std::locale()); }); +} + +void uri_builder::set_user_info(string_type &&user_info) { + user_info_ = string_type(); + network::uri::encode_user_info(std::begin(user_info), std::end(user_info), + std::back_inserter(*user_info_)); +} + +uri_builder &uri_builder::clear_user_info() { + user_info_ = network::nullopt; + return *this; +} + +void uri_builder::set_host(string_type &&host) { + host_ = string_type(); + network::uri::encode_host(std::begin(host), std::end(host), + std::back_inserter(*host_)); + detail::transform(*host_, std::begin(*host_), + [](char ch) { return std::tolower(ch, std::locale()); }); +} + +void uri_builder::set_port(string_type &&port) { + port_ = string_type(); + network::uri::encode_port(std::begin(port), std::end(port), + std::back_inserter(*port_)); +} + +uri_builder &uri_builder::clear_port() { + port_ = network::nullopt; + return *this; +} + +void uri_builder::set_authority(string_type &&authority) { + optional<detail::uri_part> user_info, host, port; + uri::string_view view(authority); + uri::const_iterator it = std::begin(view), last = std::end(view); + detail::parse_authority(it, last, user_info, host, port); + + if (user_info) { + set_user_info(user_info->to_string()); + } + + if (host) { + set_host(host->to_string()); + } + + if (port) { + set_port(port->to_string()); + } +} + +void uri_builder::set_path(string_type &&path) { + path_ = string_type(); + network::uri::encode_path(std::begin(path), std::end(path), + std::back_inserter(*path_)); +} + +uri_builder &uri_builder::clear_path() { + path_ = network::nullopt; + return *this; +} + +void uri_builder::append_query_component(string_type &&name) { + if (!query_) { + query_ = string_type(); + } else { + query_->append("&"); + } + network::uri::encode_query_component(std::begin(name), std::end(name), + std::back_inserter(*query_)); +} + +void uri_builder::append_query_key_value_pair(string_type &&key, + string_type &&value) { + if (!query_) { + query_ = string_type(); + } else { + query_->push_back('&'); + } + network::uri::encode_query_key_value_pair(std::begin(key), std::end(key), + std::begin(value), std::end(value), + std::back_inserter(*query_)); +} + +uri_builder &uri_builder::clear_query() { + query_ = network::nullopt; + return *this; +} + +void uri_builder::set_fragment(string_type &&fragment) { + fragment_ = string_type(); + network::uri::encode_fragment(std::begin(fragment), std::end(fragment), + std::back_inserter(*fragment_)); +} + +uri_builder &uri_builder::clear_fragment() { + fragment_ = network::nullopt; + return *this; +} +} // namespace network |