Commit 0c6c0cfb authored by tqcq's avatar tqcq
Browse files

feat uri update

parent 37a1317b
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ public:
    __SLED_URI_GETTER_AND_SETTER(ParamMap, query)
    __SLED_URI_GETTER_AND_SETTER(std::string, anchor)

    std::string href() const;
    std::string authority() const;
    std::string user_info() const;
    std::string query_string() const;

private:
    std::string scheme_;
    std::string content_;
+48 −3
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
#include "sled/strings/utils.h"
#include <cctype>
#include <map>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
@@ -510,14 +511,14 @@ URI
URI::ParseURI(const std::string &uri_str)
{
    URI uri;
    detail::uri uri_impl(uri_str.c_str());
    detail::uri uri_impl(uri_str.c_str(), detail::uri::scheme_category::Hierarchical);
    uri.set_scheme(uri_impl.get_scheme());
    uri.set_content(uri_impl.get_content());
    // uri.set_content(uri_impl.get_content());
    uri.set_username(uri_impl.get_username());
    uri.set_password(uri_impl.get_password());
    uri.set_host(uri_impl.get_host());
    uri.set_port(uri_impl.get_port());
    uri.set_path(uri_impl.get_path());
    uri.set_path(std::string("/") + uri_impl.get_path());
    uri.set_query(uri_impl.get_query_dictionary());
    uri.set_anchor(uri_impl.get_fragment());

@@ -525,4 +526,48 @@ URI::ParseURI(const std::string &uri_str)
}

URI::URI(const std::string &uri_str) { *this = ParseURI(uri_str); }

std::string
URI::href() const
{
    std::stringstream ss;
    if (!scheme().empty()) { ss << scheme() << ":"; }
    if (!user_info.empty()) { ss << user_info() << "@"; }
    if (!authority().empty()) { ss << authority(); }
    ss << path();
    ss << "?" << query_string();
    ss << "#" << anchor();
    return ss.str();
}

std::string
URI::authority() const
{
    if (port() == 0) {
        return host();
    } else {
        return host() + ":" + std::to_string(port());
    }
}

std::string
URI::user_info() const
{
    if (password().empty()) { return username(); }
    if (username().empty()) { return ":" + password(); }
    return username() + ":" + password();
}

std::string
URI::query_string() const
{
    std::stringstream ss;
    for (auto item : query()) {
        std::string key   = item.first;
        std::string value = item.second;
        if (key.empty()) { return value; }
        ss << key + "=" + value;
    }
    return ss.str();
}
}// namespace sled
+6 −4
Original line number Diff line number Diff line
@@ -3,10 +3,12 @@

TEST(URI, Absolute)
{
    sled::URI uri("http://example.com");
    sled::URI uri("http://example.com:1234/dir1/dir2/file?a=1#anchor");
    EXPECT_EQ(uri.scheme(), "http");
    EXPECT_EQ(uri.host(), "example.com");
    EXPECT_EQ(uri.path(), "/");
    EXPECT_TRUE(uri.query().empty());
    EXPECT_EQ(uri.anchor(), "");
    EXPECT_EQ(uri.port(), 1234);
    EXPECT_EQ(uri.path(), "dir1/dir2/file");
    EXPECT_EQ(uri.query().size(), 1);
    EXPECT_EQ(uri.query()["a"], "1");
    EXPECT_EQ(uri.anchor(), "anchor");
}