diff options
author | Sergey Uzhakov <uzhastik@gmail.com> | 2022-04-18 17:01:17 +0300 |
---|---|---|
committer | Sergey Uzhakov <uzhastik@gmail.com> | 2022-04-18 17:01:17 +0300 |
commit | af234ce84561558a7a8ee340578dd5af2138db9a (patch) | |
tree | d98ae3b1c680852e813f21e9704b20c34034a140 | |
parent | 9b8ef87fa542a0d4555852fd65b75d0d1821b0a9 (diff) | |
download | ydb-af234ce84561558a7a8ee340578dd5af2138db9a.tar.gz |
YQ-1029: extend uri builder functionality
ref:2e20c81877da3be128c99ca8584785c547f8341a
-rw-r--r-- | ydb/library/yql/utils/url_builder.cpp | 20 | ||||
-rw-r--r-- | ydb/library/yql/utils/url_builder.h | 1 | ||||
-rw-r--r-- | ydb/library/yql/utils/url_builder_ut.cpp | 35 |
3 files changed, 55 insertions, 1 deletions
diff --git a/ydb/library/yql/utils/url_builder.cpp b/ydb/library/yql/utils/url_builder.cpp index 3aa1172ffa..bb0dc49e1c 100644 --- a/ydb/library/yql/utils/url_builder.cpp +++ b/ydb/library/yql/utils/url_builder.cpp @@ -1,5 +1,6 @@ #include "url_builder.h" #include <library/cpp/string_utils/quote/quote.h> +#include <util/generic/yexception.h> namespace NYql { @@ -13,7 +14,26 @@ TUrlBuilder& TUrlBuilder::AddUrlParam(const TString& name, const TString& value) return *this; } +TUrlBuilder& TUrlBuilder::AddPathComponent(const TString& value) { + if (!value) { + throw yexception() << "Empty path component is not allowed"; + } + TStringBuilder res; + res << MainUri; + if (!MainUri.EndsWith('/')) { + res << '/'; + } + res << UrlEscapeRet(value, true); + + MainUri = std::move(res); + return *this; +} + TString TUrlBuilder::Build() const { + if (Params.empty()) { + return MainUri; + } + TStringBuilder res; res << MainUri << "?"; TStringBuf separator = ""sv; diff --git a/ydb/library/yql/utils/url_builder.h b/ydb/library/yql/utils/url_builder.h index 5ef53e9e3d..c05f89cd52 100644 --- a/ydb/library/yql/utils/url_builder.h +++ b/ydb/library/yql/utils/url_builder.h @@ -15,6 +15,7 @@ public: // Assuming name is already escaped, do not use strings from user input TUrlBuilder& AddUrlParam(const TString& name, const TString& value); + TUrlBuilder& AddPathComponent(const TString& value); TString Build() const; private: diff --git a/ydb/library/yql/utils/url_builder_ut.cpp b/ydb/library/yql/utils/url_builder_ut.cpp index d28ac955b3..791cf08731 100644 --- a/ydb/library/yql/utils/url_builder_ut.cpp +++ b/ydb/library/yql/utils/url_builder_ut.cpp @@ -5,6 +5,11 @@ using namespace NYql; Y_UNIT_TEST_SUITE(TUrlBuilder) { + Y_UNIT_TEST(UriOnly) { + TUrlBuilder builder("https://localhost/abc"); + UNIT_ASSERT_VALUES_EQUAL(builder.Build(), "https://localhost/abc"); + } + Y_UNIT_TEST(Basic) { TUrlBuilder builder("https://localhost/abc"); builder.AddUrlParam("param1", "val1"); @@ -13,7 +18,7 @@ Y_UNIT_TEST_SUITE(TUrlBuilder) { UNIT_ASSERT_VALUES_EQUAL(builder.Build(), "https://localhost/abc?param1=val1¶m2=val2"); } - Y_UNIT_TEST(Test1) { + Y_UNIT_TEST(BasicWithEncoding) { auto url = TUrlBuilder("https://localhost/abc") .AddUrlParam("param1", "=!@#$%^&*(){}[]\" ") .AddUrlParam("param2", "val2") @@ -21,4 +26,32 @@ Y_UNIT_TEST_SUITE(TUrlBuilder) { UNIT_ASSERT_VALUES_EQUAL(url, "https://localhost/abc?param1=%3D!@%23$%25^%26*%28%29%7B%7D%5B%5D%22+¶m2=val2"); } + + Y_UNIT_TEST(EmptyPathComponent) { + TUrlBuilder builder("https://localhost/abc"); + UNIT_ASSERT_EXCEPTION_CONTAINS(builder.AddPathComponent(""), std::exception, "Empty path component is not allowed"); + auto url = builder.Build(); + // not changed + UNIT_ASSERT_VALUES_EQUAL(url, "https://localhost/abc"); + } + + Y_UNIT_TEST(SeveralPathComponents) { + auto url = TUrlBuilder("https://localhost/abc") + .AddPathComponent("oops") + .AddPathComponent("long oops") + .AddUrlParam("param1", "val1") + .AddUrlParam("param1", "long param") + .Build(); + UNIT_ASSERT_VALUES_EQUAL(url, "https://localhost/abc/oops/long%20oops?param1=val1¶m1=long+param"); + } + + Y_UNIT_TEST(SeveralPathComponentsWithSlashInBaseUri) { + // base uri ends with '/' + auto url = TUrlBuilder("https://localhost/abc/") + .AddPathComponent("oops%1234") + .AddPathComponent("long&oops=xxx") + .AddUrlParam("param1", "a&b=cdef") + .Build(); + UNIT_ASSERT_VALUES_EQUAL(url, "https://localhost/abc/oops%251234/long&oops=xxx?param1=a%26b%3Dcdef"); + } } |