mirror of https://github.com/mamba-org/mamba.git
157 lines
4.3 KiB
C++
157 lines
4.3 KiB
C++
// Copyright (c) 2019, QuantStack and Mamba Contributors
|
|
//
|
|
// Distributed under the terms of the BSD 3-Clause License.
|
|
//
|
|
// The full license is in the file LICENSE, distributed with this software.
|
|
|
|
#ifndef MAMBA_URL_HPP
|
|
#define MAMBA_URL_HPP
|
|
|
|
#include <string>
|
|
#include <stdexcept>
|
|
#include <vector>
|
|
|
|
extern "C"
|
|
{
|
|
#include <curl/curl.h>
|
|
}
|
|
|
|
// typedef enum {
|
|
// CURLUE_OK,
|
|
// CURLUE_BAD_HANDLE, /* 1 */
|
|
// CURLUE_BAD_PARTPOINTER, /* 2 */
|
|
// CURLUE_MALFORMED_INPUT, /* 3 */
|
|
// CURLUE_BAD_PORT_NUMBER, /* 4 */
|
|
// CURLUE_UNSUPPORTED_SCHEME, /* 5 */
|
|
// CURLUE_URLDECODE, /* 6 */
|
|
// CURLUE_OUT_OF_MEMORY, /* 7 */
|
|
// CURLUE_USER_NOT_ALLOWED, /* 8 */
|
|
// CURLUE_UNKNOWN_PART, /* 9 */
|
|
// CURLUE_NO_SCHEME, /* 10 */
|
|
// CURLUE_NO_USER, /* 11 */
|
|
// CURLUE_NO_PASSWORD, /* 12 */
|
|
// CURLUE_NO_OPTIONS, /* 13 */
|
|
// CURLUE_NO_HOST, /* 14 */
|
|
// CURLUE_NO_PORT, /* 15 */
|
|
// CURLUE_NO_QUERY, /* 16 */
|
|
// CURLUE_NO_FRAGMENT /* 17 */
|
|
// } CURLUcode;
|
|
|
|
namespace mamba
|
|
{
|
|
bool has_scheme(const std::string& url);
|
|
|
|
void split_anaconda_token(const std::string& url,
|
|
std::string& cleaned_url,
|
|
std::string& token);
|
|
|
|
void split_scheme_auth_token(const std::string& url,
|
|
std::string& remaining_url,
|
|
std::string& scheme,
|
|
std::string& auth,
|
|
std::string& token);
|
|
|
|
void split_platform(const std::vector<std::string>& known_platforms,
|
|
const std::string& url,
|
|
std::string& cleaned_url,
|
|
std::string& platform);
|
|
|
|
bool is_path(const std::string& input);
|
|
std::string path_to_url(const std::string& path);
|
|
|
|
template <class S, class... Args>
|
|
std::string join_url(const S& s, const Args&... args);
|
|
|
|
class URLHandler
|
|
{
|
|
public:
|
|
|
|
URLHandler(const std::string& url = "");
|
|
~URLHandler();
|
|
|
|
URLHandler(const URLHandler&);
|
|
URLHandler& operator=(const URLHandler&);
|
|
|
|
URLHandler(URLHandler&&);
|
|
URLHandler& operator=(URLHandler&&);
|
|
|
|
std::string url(bool strip_scheme = false);
|
|
|
|
std::string scheme();
|
|
std::string host();
|
|
std::string path();
|
|
std::string port();
|
|
|
|
std::string query();
|
|
std::string fragment();
|
|
std::string options();
|
|
|
|
std::string auth();
|
|
std::string user();
|
|
std::string password();
|
|
std::string zoneid();
|
|
|
|
URLHandler& set_scheme(const std::string& scheme);
|
|
URLHandler& set_host(const std::string& host);
|
|
URLHandler& set_path(const std::string& path);
|
|
URLHandler& set_port(const std::string& port);
|
|
|
|
URLHandler& set_query(const std::string& query);
|
|
URLHandler& set_fragment(const std::string& fragment);
|
|
URLHandler& set_options(const std::string& options);
|
|
|
|
URLHandler& set_user(const std::string& user);
|
|
URLHandler& set_password(const std::string& password);
|
|
URLHandler& set_zoneid(const std::string& zoneid);
|
|
|
|
private:
|
|
|
|
std::string get_part(CURLUPart part);
|
|
void set_part(CURLUPart part, const std::string& s);
|
|
|
|
std::string m_url;
|
|
CURLU* m_handle;
|
|
bool m_has_scheme;
|
|
};
|
|
|
|
namespace detail
|
|
{
|
|
inline std::string join_url_impl(std::string& s)
|
|
{
|
|
return s;
|
|
}
|
|
|
|
template <class S, class... Args>
|
|
inline std::string join_url_impl(std::string& s1, const S& s2, const Args&... args)
|
|
{
|
|
if (!s2.empty())
|
|
{
|
|
s1 += '/' + s2;
|
|
}
|
|
return join_url_impl(s1, args...);
|
|
}
|
|
|
|
template <class... Args>
|
|
inline std::string join_url_impl(std::string& s1, const char* s2, const Args&... args)
|
|
{
|
|
s1 += '/';
|
|
s1 += s2;
|
|
return join_url_impl(s1, args...);
|
|
}
|
|
}
|
|
|
|
inline std::string join_url()
|
|
{
|
|
return "";
|
|
}
|
|
|
|
template <class S, class... Args>
|
|
inline std::string join_url(const S& s, const Args&... args)
|
|
{
|
|
std::string res = s;
|
|
return detail::join_url_impl(res, args...);
|
|
}
|
|
}
|
|
|
|
#endif
|