aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/string_utils
diff options
context:
space:
mode:
authorbvdvlg <bvdvlg@yandex-team.com>2024-06-20 10:36:59 +0300
committerbvdvlg <bvdvlg@yandex-team.com>2024-06-20 10:49:09 +0300
commitd21e541fb10f20b63b156d0a457153c4287112c8 (patch)
tree0c204849e305e923866440453e910d3514ea95e7 /library/cpp/string_utils
parent515aa2dfa47824063f196b1af06264a0f393d8d5 (diff)
downloadydb-d21e541fb10f20b63b156d0a457153c4287112c8.tar.gz
Add Base64EncodeNoPadding Method
23b4ac85c9195fa9b0e7b0624cc3a61d010745be
Diffstat (limited to 'library/cpp/string_utils')
-rw-r--r--library/cpp/string_utils/base64/base64.cpp4
-rw-r--r--library/cpp/string_utils/base64/base64.h16
-rw-r--r--library/cpp/string_utils/base64/base64_ut.cpp25
3 files changed, 40 insertions, 5 deletions
diff --git a/library/cpp/string_utils/base64/base64.cpp b/library/cpp/string_utils/base64/base64.cpp
index 610136fd1a..fec827dd93 100644
--- a/library/cpp/string_utils/base64/base64.cpp
+++ b/library/cpp/string_utils/base64/base64.cpp
@@ -153,6 +153,10 @@ char* Base64EncodeUrl(char* outstr, const unsigned char* instr, size_t len) {
return Base64EncodeImpl<true>(outstr, instr, len);
}
+char* Base64EncodeNoPadding(char* outstr, const unsigned char* instr, size_t len) {
+ return Base64EncodeImpl<false, false>(outstr, instr, len);
+}
+
char* Base64EncodeUrlNoPadding(char* outstr, const unsigned char* instr, size_t len) {
return Base64EncodeImpl<true, false>(outstr, instr, len);
}
diff --git a/library/cpp/string_utils/base64/base64.h b/library/cpp/string_utils/base64/base64.h
index 22e6b4b542..43fda2a977 100644
--- a/library/cpp/string_utils/base64/base64.h
+++ b/library/cpp/string_utils/base64/base64.h
@@ -99,6 +99,7 @@ constexpr size_t Base64EncodeBufSize(const size_t len) noexcept {
char* Base64Encode(char* outstr, const unsigned char* instr, size_t len);
char* Base64EncodeUrl(char* outstr, const unsigned char* instr, size_t len);
+char* Base64EncodeNoPadding(char* outstr, const unsigned char* instr, size_t len);
/// Make base64 string which stay unchaged after applying 'urlencode' function
/// as it doesn't contain character, which cannot be used in urls
@@ -114,6 +115,10 @@ inline TStringBuf Base64Encode(const TStringBuf src, void* output) {
return TStringBuf(static_cast<const char*>(output), Base64Encode(static_cast<char*>(output), reinterpret_cast<const unsigned char*>(src.data()), src.size()));
}
+inline TStringBuf Base64EncodeNoPadding(const TStringBuf src, void* output) {
+ return TStringBuf(static_cast<const char*>(output), Base64EncodeNoPadding(static_cast<char*>(output), reinterpret_cast<const unsigned char*>(src.data()), src.size()));
+}
+
inline TStringBuf Base64EncodeUrl(const TStringBuf src, void* output) {
return TStringBuf(static_cast<const char*>(output), Base64EncodeUrl(static_cast<char*>(output), reinterpret_cast<const unsigned char*>(src.data()), src.size()));
}
@@ -127,6 +132,11 @@ inline void Base64Encode(const TStringBuf src, TString& dst) {
dst.resize(Base64Encode(src, dst.begin()).size());
}
+inline void Base64EncodeNoPadding(const TStringBuf src, TString& dst) {
+ dst.ReserveAndResize(Base64EncodeBufSize(src.size()));
+ dst.resize(Base64EncodeNoPadding(src, dst.begin()).size());
+}
+
inline void Base64EncodeUrl(const TStringBuf src, TString& dst) {
dst.ReserveAndResize(Base64EncodeBufSize(src.size()));
dst.resize(Base64EncodeUrl(src, dst.begin()).size());
@@ -143,6 +153,12 @@ inline TString Base64Encode(const TStringBuf s) {
return ret;
}
+inline TString Base64EncodeNoPadding(const TStringBuf s) {
+ TString ret;
+ Base64EncodeNoPadding(s, ret);
+ return ret;
+}
+
inline TString Base64EncodeUrl(const TStringBuf s) {
TString ret;
Base64EncodeUrl(s, ret);
diff --git a/library/cpp/string_utils/base64/base64_ut.cpp b/library/cpp/string_utils/base64/base64_ut.cpp
index 83775f072c..f10afa9747 100644
--- a/library/cpp/string_utils/base64/base64_ut.cpp
+++ b/library/cpp/string_utils/base64/base64_ut.cpp
@@ -163,7 +163,7 @@ void Out<NB64Etalon::TImpls::EImpl>(IOutputStream& o, typename TTypeTraits<NB64E
}
}
-static void TestEncodeDecodeIntoString(const TString& plain, const TString& encoded, const TString& encodedUrl, const TString& encodedUrlNoPadding) {
+static void TestEncodeDecodeIntoString(const TString& plain, const TString& encoded, const TString& encodedUrl, const TString& encodedNoPadding, const TString& encodedUrlNoPadding) {
TString a, b;
Base64Encode(plain, a);
@@ -178,11 +178,17 @@ static void TestEncodeDecodeIntoString(const TString& plain, const TString& enco
Base64Decode(a, b);
UNIT_ASSERT_VALUES_EQUAL(b, plain);
- Base64EncodeUrlNoPadding(plain, a);
- UNIT_ASSERT_VALUES_EQUAL(a, encodedUrlNoPadding);
+ Base64EncodeNoPadding(plain, a);
+ UNIT_ASSERT_VALUES_EQUAL(a, encodedNoPadding);
TString c = Base64DecodeUneven(a);
UNIT_ASSERT_VALUES_EQUAL(c, plain);
+
+ Base64EncodeUrlNoPadding(plain, a);
+ UNIT_ASSERT_VALUES_EQUAL(a, encodedUrlNoPadding);
+
+ TString d = Base64DecodeUneven(a);
+ UNIT_ASSERT_VALUES_EQUAL(d, plain);
}
static void TestEncodeStrictDecodeIntoString(const TString& plain, const TString& encoded, const TString& encodedUrl) {
@@ -231,6 +237,14 @@ Y_UNIT_TEST_SUITE(TBase64) {
"oqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIyc"
"rLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy"
"8_T19vf4-fr7_P3-_w,,";
+ const TString base64WithoutPadding =
+ "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJy"
+ "gpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9Q"
+ "UVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eH"
+ "l6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6Ch"
+ "oqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIyc"
+ "rLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy"
+ "8/T19vf4+fr7/P3+/w";
const TString base64UrlWithoutPadding =
"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJy"
"gpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9Q"
@@ -240,7 +254,7 @@ Y_UNIT_TEST_SUITE(TBase64) {
"rLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy"
"8_T19vf4-fr7_P3-_w";
- TestEncodeDecodeIntoString(str, base64, base64Url, base64UrlWithoutPadding);
+ TestEncodeDecodeIntoString(str, base64, base64Url, base64WithoutPadding, base64UrlWithoutPadding);
TestEncodeStrictDecodeIntoString(str, base64, base64Url);
}
@@ -249,9 +263,10 @@ Y_UNIT_TEST_SUITE(TBase64) {
const TString base64 = "aHR0cDovL3lhbmRleC5ydToxMjM0L3JlcXVlc3Q/cGFyYW09dmFsdWUmbGxsPWZmZiNmcmFnbWVudA==";
const TString base64Url = "aHR0cDovL3lhbmRleC5ydToxMjM0L3JlcXVlc3Q_cGFyYW09dmFsdWUmbGxsPWZmZiNmcmFnbWVudA,,";
+ const TString base64WithoutPadding = "aHR0cDovL3lhbmRleC5ydToxMjM0L3JlcXVlc3Q/cGFyYW09dmFsdWUmbGxsPWZmZiNmcmFnbWVudA";
const TString base64UrlWithoutPadding = "aHR0cDovL3lhbmRleC5ydToxMjM0L3JlcXVlc3Q_cGFyYW09dmFsdWUmbGxsPWZmZiNmcmFnbWVudA";
- TestEncodeDecodeIntoString(str, base64, base64Url, base64UrlWithoutPadding);
+ TestEncodeDecodeIntoString(str, base64, base64Url, base64WithoutPadding, base64UrlWithoutPadding);
TestEncodeStrictDecodeIntoString(str, base64, base64Url);
}
}