aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorilnurkh <ilnurkh@yandex-team.com>2024-12-13 16:35:53 +0300
committerilnurkh <ilnurkh@yandex-team.com>2024-12-13 19:00:00 +0300
commitd91dac51cf9ec6c397d6d0213f0d9ab7dd29c889 (patch)
treeebab71eddf75c1bea0b0feaa917d81bfd8a9e9f0 /library/cpp
parent15c84383e775f60e453e19e7e7038bdf0da1b7ad (diff)
downloadydb-d91dac51cf9ec6c397d6d0213f0d9ab7dd29c889.tar.gz
introduce TCgiParameters::GetLast
commit_hash:db2785d0d17510b53aeaec1e30271e6b08e07db1
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/cgiparam/cgiparam.cpp10
-rw-r--r--library/cpp/cgiparam/cgiparam.h7
-rw-r--r--library/cpp/cgiparam/cgiparam_ut.cpp2
3 files changed, 19 insertions, 0 deletions
diff --git a/library/cpp/cgiparam/cgiparam.cpp b/library/cpp/cgiparam/cgiparam.cpp
index 397e23407f..5f3be8705f 100644
--- a/library/cpp/cgiparam/cgiparam.cpp
+++ b/library/cpp/cgiparam/cgiparam.cpp
@@ -17,6 +17,16 @@ const TString& TCgiParameters::Get(const TStringBuf name, size_t numOfValue) con
return end() == it ? Default<TString>() : it->second;
}
+const TString& TCgiParameters::GetLast(const TStringBuf name) const noexcept {
+ if (auto it = this->upper_bound(name); it != this->begin()) {
+ --it;
+ if (it->first == name) {
+ return it->second;
+ }
+ }
+ return Default<TString>();
+}
+
bool TCgiParameters::Erase(const TStringBuf name, size_t pos) {
const auto pair = equal_range(name);
diff --git a/library/cpp/cgiparam/cgiparam.h b/library/cpp/cgiparam/cgiparam.h
index 465940be67..c30a8ac794 100644
--- a/library/cpp/cgiparam/cgiparam.h
+++ b/library/cpp/cgiparam/cgiparam.h
@@ -78,6 +78,13 @@ public:
Y_PURE_FUNCTION
const TString& Get(const TStringBuf name, size_t numOfValue = 0) const noexcept Y_LIFETIME_BOUND;
+ /// Returns the last value by name
+ /**
+ * @note The returned value is CGI-unescaped.
+ */
+ Y_PURE_FUNCTION
+ const TString& GetLast(const TStringBuf name) const noexcept Y_LIFETIME_BOUND;
+
void InsertEscaped(const TStringBuf name, const TStringBuf value);
#if !defined(__GLIBCXX__)
diff --git a/library/cpp/cgiparam/cgiparam_ut.cpp b/library/cpp/cgiparam/cgiparam_ut.cpp
index de6d23882d..c82f0344d2 100644
--- a/library/cpp/cgiparam/cgiparam_ut.cpp
+++ b/library/cpp/cgiparam/cgiparam_ut.cpp
@@ -210,8 +210,10 @@ Y_UNIT_TEST_SUITE(TCgiParametersTest) {
UNIT_ASSERT_VALUES_EQUAL(c.NumOfValues("b"), 1u);
UNIT_ASSERT_VALUES_EQUAL(c.Get("b"), "b1");
+ UNIT_ASSERT_VALUES_EQUAL(c.GetLast("b"), "b1");
UNIT_ASSERT_VALUES_EQUAL(c.Get("a", 0), "a1");
UNIT_ASSERT_VALUES_EQUAL(c.Get("a", 1), "a2");
+ UNIT_ASSERT_VALUES_EQUAL(c.GetLast("a"), "a2");
UNIT_ASSERT_VALUES_EQUAL(c.Print(), "a=a1&a=a2&b=b1");
}