aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkniv <kniv@yandex-team.ru>2022-03-29 14:21:41 +0300
committerkniv <kniv@yandex-team.ru>2022-03-29 14:21:41 +0300
commit1f1ebe2439764b4ec8453b23adc4ce16b123f945 (patch)
tree65fc2165a12499e640b5744075fb8d26675f4311
parent3606cd848d38e399770499f4dc0c27ecd14869cc (diff)
downloadydb-1f1ebe2439764b4ec8453b23adc4ce16b123f945.tar.gz
YQL-14575: [Url UDF] Change GetTail() and GetPath() implementations
YQL-14575: [Url UDF] Change GetTail() and GetPath() implementations ref:4bf711e44d72946b0efeeefa86a31fd3bf4d3cc6
-rw-r--r--ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h34
1 files changed, 11 insertions, 23 deletions
diff --git a/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h b/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h
index a7d9fedd437..e9f51fa76d9 100644
--- a/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h
+++ b/ydb/library/yql/udfs/common/url_base/lib/url_base_udf.h
@@ -95,33 +95,21 @@ namespace {
SIMPLE_UDF(TGetTail, TOptional<char*>(TOptional<char*>)) {
EMPTY_RESULT_ON_EMPTY_ARG(0);
- const std::string_view url(args[0].AsStringRef());
- std::string_view cut(CutSchemePrefix(url));
- const auto s = cut.find('/');
- if (s == std::string_view::npos) {
- return valueBuilder->NewString("/");
- }
-
- cut.remove_prefix(s);
- return valueBuilder->SubString(args[0], std::distance(url.begin(), cut.begin()), cut.length());
+ const TStringBuf url(args[0].AsStringRef());
+ TStringBuf host, tail;
+ SplitUrlToHostAndPath(url, host, tail);
+ return tail.StartsWith('/')
+ ? valueBuilder->NewString(tail)
+ : valueBuilder->NewString(TString('/').append(tail));
}
SIMPLE_UDF(TGetPath, TOptional<char*>(TOptional<char*>)) {
EMPTY_RESULT_ON_EMPTY_ARG(0);
- const std::string_view url(args[0].AsStringRef());
- std::string_view cut(CutSchemePrefix(url));
- const auto s = cut.find('/');
- if (s == std::string_view::npos) {
- return valueBuilder->NewString("/");
- }
-
- cut.remove_prefix(s);
- const auto end = cut.find_first_of("?#");
- if (std::string_view::npos != end) {
- cut.remove_suffix(cut.size() - end);
- }
-
- return valueBuilder->SubString(args[0], std::distance(url.begin(), cut.begin()), cut.length());
+ const TStringBuf url(args[0].AsStringRef());
+ TStringBuf path = GetPathAndQuery(url, true).Before('?');
+ return path.StartsWith('/')
+ ? valueBuilder->NewString(path)
+ : valueBuilder->NewString(TString('/').append(path));
}
SIMPLE_UDF(TGetFragment, TOptional<char*>(TOptional<char*>)) {