Skip to content

Commit e394226

Browse files
authored
Issue #169 Fix src/library/cgiparam tests (#251)
1 parent 5876551 commit e394226

File tree

7 files changed

+52
-35
lines changed

7 files changed

+52
-35
lines changed

include/ydb-cpp-sdk/library/cgiparam/cgiparam.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
#include <ydb-cpp-sdk/library/iterator/iterate_values.h>
44

5+
#include <ydb-cpp-sdk/util/str_stl.h>
56
#include <ydb-cpp-sdk/util/generic/iterator_range.h>
6-
#include <string_view>
7-
#include <string>
7+
#include <ydb-cpp-sdk/util/memory/tempbuf.h>
88

9-
#include <map>
109
#include <initializer_list>
10+
#include <map>
11+
#include <string>
12+
#include <string_view>
1113

12-
class TCgiParameters: public std::multimap<std::string, std::string> {
14+
class TCgiParameters: public std::multimap<std::string, std::string, TLess<std::string>> {
1315
public:
1416
TCgiParameters() = default;
1517

@@ -26,7 +28,7 @@ class TCgiParameters: public std::multimap<std::string, std::string> {
2628
size_t EraseAll(const std::string_view name);
2729

2830
size_t NumOfValues(const std::string_view name) const noexcept {
29-
return count(static_cast<std::string>(name));
31+
return count(name);
3032
}
3133

3234
std::string operator()() const {
@@ -57,7 +59,7 @@ class TCgiParameters: public std::multimap<std::string, std::string> {
5759

5860
Y_PURE_FUNCTION
5961
auto Range(const std::string_view name) const noexcept {
60-
return IterateValues(MakeIteratorRange(equal_range(static_cast<std::string>(name))));
62+
return IterateValues(MakeIteratorRange(equal_range(name)));
6163
}
6264

6365
Y_PURE_FUNCTION
@@ -68,11 +70,12 @@ class TCgiParameters: public std::multimap<std::string, std::string> {
6870

6971
Y_PURE_FUNCTION
7072
bool Has(const std::string_view name) const noexcept {
71-
const auto pair = equal_range(static_cast<std::string>(name));
73+
const auto pair = equal_range(name);
7274
return pair.first != pair.second;
7375
}
74-
/// Returns value by name
7576
/**
77+
* Returns value by name.
78+
*
7679
* @note The returned value is CGI-unescaped.
7780
*/
7881
Y_PURE_FUNCTION
@@ -139,7 +142,7 @@ class TCgiParameters: public std::multimap<std::string, std::string> {
139142

140143
template <typename TIter>
141144
void TCgiParameters::ReplaceUnescaped(const std::string_view key, TIter valuesBegin, const TIter valuesEnd) {
142-
const auto oldRange = equal_range(static_cast<std::string>(key));
145+
const auto oldRange = equal_range(key);
143146
auto current = oldRange.first;
144147

145148
// reuse as many existing nodes as possible (probably none)
@@ -176,13 +179,13 @@ class TQuickCgiParam: public std::multimap<std::string_view, std::string_view> {
176179

177180
Y_PURE_FUNCTION
178181
bool Has(const std::string_view name) const noexcept {
179-
const auto pair = equal_range(static_cast<std::string>(name));
182+
const auto pair = equal_range(name);
180183
return pair.first != pair.second;
181184
}
182185

183186
Y_PURE_FUNCTION
184187
const std::string_view& Get(const std::string_view name, size_t numOfValue = 0) const noexcept;
185188

186189
private:
187-
std::string UnescapeBuf;
190+
TTempBuf UnescapeBuf;
188191
};

include/ydb-cpp-sdk/util/str_stl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ template <class T>
233233
struct TLess: public std::less<T> {
234234
};
235235

236+
template <>
237+
struct TLess<std::string>: public TLess<std::string_view> {
238+
using is_transparent = void;
239+
};
240+
236241
template <>
237242
struct TLess<std::u16string>: public TLess<std::u16string_view> {
238243
using is_transparent = void;

src/library/cgiparam/cgiparam.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const std::string& TCgiParameters::Get(const std::string_view name, size_t numOf
2020
}
2121

2222
bool TCgiParameters::Erase(const std::string_view name, size_t pos) {
23-
const auto pair = equal_range(static_cast<std::string>(name));
23+
const auto pair = equal_range(name);
2424

2525
for (auto it = pair.first; it != pair.second; ++it, --pos) {
2626
if (0 == pos) {
@@ -33,7 +33,7 @@ bool TCgiParameters::Erase(const std::string_view name, size_t pos) {
3333
}
3434

3535
bool TCgiParameters::Erase(const std::string_view name, const std::string_view val) {
36-
const auto pair = equal_range(static_cast<std::string>(name));
36+
const auto pair = equal_range(name);
3737

3838
bool found = false;
3939
for (auto it = pair.first; it != pair.second;) {
@@ -49,7 +49,7 @@ bool TCgiParameters::Erase(const std::string_view name, const std::string_view v
4949
}
5050

5151
bool TCgiParameters::ErasePattern(const std::string_view name, const std::string_view pat) {
52-
const auto pair = equal_range(static_cast<std::string>(name));
52+
const auto pair = equal_range(name);
5353

5454
bool found = false;
5555
for (auto it = pair.first; it != pair.second;) {
@@ -68,7 +68,7 @@ bool TCgiParameters::ErasePattern(const std::string_view name, const std::string
6868
size_t TCgiParameters::EraseAll(const std::string_view name) {
6969
size_t num = 0;
7070

71-
const auto pair = equal_range(static_cast<std::string>(name));
71+
const auto pair = equal_range(name);
7272

7373
for (auto it = pair.first; it != pair.second; erase(it++), ++num)
7474
;
@@ -77,7 +77,7 @@ size_t TCgiParameters::EraseAll(const std::string_view name) {
7777
}
7878

7979
void TCgiParameters::JoinUnescaped(const std::string_view key, char sep, std::string_view val) {
80-
const auto pair = equal_range(static_cast<std::string>(key));
80+
const auto pair = equal_range(key);
8181
auto it = pair.first;
8282

8383
if (it == pair.second) { // not found
@@ -224,7 +224,7 @@ std::string TCgiParameters::QuotedPrint(const char* safe) const {
224224
}
225225

226226
TCgiParameters::const_iterator TCgiParameters::Find(const std::string_view name, size_t pos) const noexcept {
227-
const auto pair = equal_range(static_cast<std::string>(name));
227+
const auto pair = equal_range(name);
228228

229229
for (auto it = pair.first; it != pair.second; ++it, --pos) {
230230
if (0 == pos) {
@@ -236,7 +236,7 @@ TCgiParameters::const_iterator TCgiParameters::Find(const std::string_view name,
236236
}
237237

238238
bool TCgiParameters::Has(const std::string_view name, const std::string_view value) const noexcept {
239-
const auto pair = equal_range(static_cast<std::string>(name));
239+
const auto pair = equal_range(name);
240240

241241
for (auto it = pair.first; it != pair.second; ++it) {
242242
if (value == it->second) {
@@ -248,27 +248,24 @@ bool TCgiParameters::Has(const std::string_view name, const std::string_view val
248248
}
249249

250250
TQuickCgiParam::TQuickCgiParam(const std::string_view cgiParamStr) {
251-
UnescapeBuf.reserve(CgiUnescapeBufLen(cgiParamStr.size()));
252-
char* buf = UnescapeBuf.data();
251+
const size_t bufLength = CgiUnescapeBufLen(cgiParamStr.size());
252+
UnescapeBuf = TTempBuf(bufLength);
253+
char* buf = UnescapeBuf.Data();
253254

254-
auto f = [this, &buf](const std::string_view key, const std::string_view val) {
255+
auto f = [this, &buf, bufLength](const std::string_view key, const std::string_view val) {
255256
std::string_view name = CgiUnescapeBuf(buf, key);
256257
buf += name.size() + 1;
257258
std::string_view value = CgiUnescapeBuf(buf, val);
258259
buf += value.size() + 1;
259-
Y_ASSERT(buf <= UnescapeBuf.data() + UnescapeBuf.capacity() + 1 /*trailing zero*/);
260+
Y_ASSERT(buf <= UnescapeBuf.Data() + bufLength);
260261
emplace(name, value);
261262
};
262263

263264
DoScan<false>(cgiParamStr, f);
264-
265-
if (buf != UnescapeBuf.data()) {
266-
UnescapeBuf.resize(buf - UnescapeBuf.data() - 1 /*trailing zero*/);
267-
}
268265
}
269266

270267
const std::string_view& TQuickCgiParam::Get(const std::string_view name, size_t pos) const noexcept {
271-
const auto pair = equal_range(static_cast<std::string>(name));
268+
const auto pair = equal_range(name);
272269

273270
for (auto it = pair.first; it != pair.second; ++it, --pos) {
274271
if (0 == pos) {
@@ -280,7 +277,7 @@ const std::string_view& TQuickCgiParam::Get(const std::string_view name, size_t
280277
}
281278

282279
bool TQuickCgiParam::Has(const std::string_view name, const std::string_view value) const noexcept {
283-
const auto pair = equal_range(static_cast<std::string>(name));
280+
const auto pair = equal_range(name);
284281

285282
for (auto it = pair.first; it != pair.second; ++it) {
286283
if (value == it->second) {

src/library/cgiparam/ut/ya.make

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/library/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
add_subdirectory(cache)
22
add_subdirectory(case_insensitive_string)
3+
add_subdirectory(cgiparam)
34
add_subdirectory(coroutine)
45
add_subdirectory(json)
56
add_subdirectory(login)

tests/library/cgiparam/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
add_ydb_test(NAME library-cgiparam-ut
2+
SOURCES
3+
ut.cpp
4+
LINK_LIBRARIES
5+
library-cpp-cgiparam
6+
cpp-testing-unittest_main
7+
)

src/library/cgiparam/cgiparam_ut.cpp renamed to tests/library/cgiparam/ut.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ Y_UNIT_TEST_SUITE(TCgiParametersTest) {
1818
}
1919

2020
Y_UNIT_TEST(TestQuick) {
21+
TQuickCgiParam A("a=b");
22+
UNIT_ASSERT_EQUAL(A.Get("a") == "b", true);
23+
UNIT_ASSERT(A.Has("a", "b"));
24+
25+
TQuickCgiParam B("aaa=bbb&ccc=ddd&ag0=");
26+
UNIT_ASSERT_EQUAL(B.Get("aaa") == "bbb", true);
27+
UNIT_ASSERT(B.Has("ccc", "ddd"));
28+
UNIT_ASSERT(B.Has("ag0", ""));
29+
UNIT_ASSERT(!B.Has("a", "bbb"));
30+
UNIT_ASSERT(!B.Has("aaa", "bb"));
31+
2132
TQuickCgiParam C("aaa=b%62b&ccc=ddd&ag0=");
2233
UNIT_ASSERT_EQUAL(C.Get("aaa") == "bbb", true);
2334
UNIT_ASSERT(C.Has("ccc", "ddd"));

0 commit comments

Comments
 (0)