aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Uzhakov <uzhastik@gmail.com>2022-04-18 17:01:17 +0300
committerSergey Uzhakov <uzhastik@gmail.com>2022-04-18 17:01:17 +0300
commitaf234ce84561558a7a8ee340578dd5af2138db9a (patch)
treed98ae3b1c680852e813f21e9704b20c34034a140
parent9b8ef87fa542a0d4555852fd65b75d0d1821b0a9 (diff)
downloadydb-af234ce84561558a7a8ee340578dd5af2138db9a.tar.gz
YQ-1029: extend uri builder functionality
ref:2e20c81877da3be128c99ca8584785c547f8341a
-rw-r--r--ydb/library/yql/utils/url_builder.cpp20
-rw-r--r--ydb/library/yql/utils/url_builder.h1
-rw-r--r--ydb/library/yql/utils/url_builder_ut.cpp35
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&param2=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+&param2=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&param1=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");
+ }
}