#ifndef PROTON_URL_HPP #define PROTON_URL_HPP /* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ #include "./internal/pn_unique_ptr.hpp" #include "./error.hpp" #include #include #include /// @file /// **Deprecated** - Use a third-party URL library. namespace proton { /// **Deprecated** - Use a third-party URL library. /// /// An error encountered during URL parsing. struct PN_CPP_DEPRECATED("Use a third-party URL library") PN_CPP_CLASS_EXTERN url_error : public error { /// @cond INTERNAL /// Construct a URL error with a message. PN_CPP_EXTERN explicit url_error(const std::string&); PN_CPP_EXTERN ~url_error() throw(); /// @endcond }; /// **Deprecated** - Use a third-party URL library. /// /// A URL parser. /// /// Proton URLs take the form /// `://:@:/`. /// /// - Scheme can be `amqp` or `amqps`. Host is a DNS name or IP /// address (v4 or v6). /// /// - Port can be a number or a symbolic service name such as `amqp`. /// /// - Path is normally used as a link source or target address. On a /// broker it typically corresponds to a queue or topic name. class PN_CPP_DEPRECATED("Use a third-party URL library") url { public: static const std::string AMQP; ///< "amqp" prefix static const std::string AMQPS; ///< "amqps" prefix // XXX No constructor for an empty URL? // XXX What is the default 'defaults' behavior? /// Parse `url_str` as an AMQP URL. /// /// @note Converts automatically from string. /// @throw url_error if URL is invalid. PN_CPP_EXTERN url(const std::string& url_str); /// @cond INTERNAL /// XXX I want to understand why this is important to keep. /// /// **Unsettled API** - Parse `url_str` as an AMQP URL. If /// `defaults` is true, fill in defaults for missing values. /// Otherwise, return an empty string for missing values. /// /// @note Converts automatically from string. /// @throw url_error if URL is invalid. PN_CPP_EXTERN url(const std::string& url_str, bool defaults); /// @endcond /// Copy a URL. PN_CPP_EXTERN url(const url&); PN_CPP_EXTERN ~url(); /// Copy a URL. PN_CPP_EXTERN url& operator=(const url&); /// True if the URL is empty. PN_CPP_EXTERN bool empty() const; /// Returns the URL as a string PN_CPP_EXTERN operator std::string() const; /// @name URL fields /// /// @{ /// `amqp` or `amqps`. PN_CPP_EXTERN std::string scheme() const; /// The user name for authentication. PN_CPP_EXTERN std::string user() const; // XXX Passwords in URLs are dumb. /// The password. PN_CPP_EXTERN std::string password() const; /// The host name or IP address. PN_CPP_EXTERN std::string host() const; /// `port` can be a number or a symbolic name such as "amqp". PN_CPP_EXTERN std::string port() const; /// `port_int` is the numeric value of the port. PN_CPP_EXTERN uint16_t port_int() const; /// host_port returns just the `host:port` part of the URL PN_CPP_EXTERN std::string host_port() const; // XXX is this not confusing (or incorrect)? The path starts with // the first / after //. /// `path` is everything after the final "/". PN_CPP_EXTERN std::string path() const; /// @} /// Return URL as a string. friend PN_CPP_EXTERN std::string to_string(const url&); private: struct impl; internal::pn_unique_ptr impl_; /// @cond INTERNAL friend PN_CPP_EXTERN std::ostream& operator<<(std::ostream&, const url&); // XXX Why is it important to have this? /// Parse `url` from istream. This automatically fills in /// defaults for missing values. /// /// @note An invalid url is indicated by setting /// std::stream::fail(), NOT by throwing url_error. friend PN_CPP_EXTERN std::istream& operator>>(std::istream&, url&); /// @endcond }; } // proton #endif // PROTON_URL_HPP