Skip to content

Commit

Permalink
trim white spaces before and after the equal sign (#8638)
Browse files Browse the repository at this point in the history
  • Loading branch information
duke8253 authored Feb 8, 2022
1 parent 78f2ddc commit 8c5fb9c
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 47 deletions.
43 changes: 18 additions & 25 deletions plugins/s3_auth/aws_auth_v4.cc
Original file line number Diff line number Diff line change
Expand Up @@ -176,39 +176,32 @@ canonicalEncode(const String &in, bool isObjectName)
* @param inLen input character count
* @return pointer to the trimmed string.
*/
std::string
String
trimWhiteSpacesAndSqueezeInnerSpaces(const char *in, size_t inLen)
{
if (nullptr == in || inLen == 0) {
return std::string(in, inLen);
}

const char *first = in;
while (size_t(first - in) < inLen && isspace(*first)) {
first++;
}

const char *last = in + inLen - 1;
while (last > in && isspace(*last)) {
last--;
return "";
}

std::stringstream result;
int consecutiveSpaces = 0;
while (first <= last) {
if (*first == ' ') {
consecutiveSpaces++;
} else {
if (consecutiveSpaces > 0) {
result << ' ';
}
consecutiveSpaces = 0;
result << *first;
String in_str = trimWhiteSpaces(String(in, inLen));
String out_str;
out_str.reserve(in_str.size());
size_t n = 0;
char prev_c = '\0';

for (auto &c : in_str) {
if (!isspace(c)) {
out_str += c;
++n;
} else if (isspace(c) && !isspace(prev_c)) {
out_str += ' ';
++n;
}
first++;
prev_c = c;
}
out_str.resize(n);

return result.str();
return out_str;
}

/**
Expand Down
39 changes: 22 additions & 17 deletions plugins/s3_auth/s3_auth.cc
Original file line number Diff line number Diff line change
Expand Up @@ -554,24 +554,29 @@ S3Config::parse_config(const std::string &config_fname)
}

// Identify the keys (and values if appropriate)
if (0 == strncasecmp(pos2, "secret_key=", 11)) {
set_secret(pos2 + 11);
} else if (0 == strncasecmp(pos2, "access_key=", 11)) {
set_keyid(pos2 + 11);
} else if (0 == strncasecmp(pos2, "session_token=", 14)) {
set_token(pos2 + 14);
} else if (0 == strncasecmp(pos2, "version=", 8)) {
set_version(pos2 + 8);
} else if (0 == strncasecmp(pos2, "virtual_host", 12)) {
std::string key_val(pos2, pos1 - pos2 + 1);
size_t eq_pos = key_val.find_first_of("=");
std::string key_str = trimWhiteSpaces(key_val.substr(0, eq_pos == String::npos ? key_val.size() : eq_pos));
std::string val_str = eq_pos == String::npos ? "" : trimWhiteSpaces(key_val.substr(eq_pos + 1, key_val.size()));

if (key_str == "secret_key") {
set_secret(val_str.c_str());
} else if (key_str == "access_key") {
set_keyid(val_str.c_str());
} else if (key_str == "session_token") {
set_token(val_str.c_str());
} else if (key_str == "version") {
set_version(val_str.c_str());
} else if (key_str == "virtual_host") {
set_virt_host();
} else if (0 == strncasecmp(pos2, "v4-include-headers=", 19)) {
set_include_headers(pos2 + 19);
} else if (0 == strncasecmp(pos2, "v4-exclude-headers=", 19)) {
set_exclude_headers(pos2 + 19);
} else if (0 == strncasecmp(pos2, "v4-region-map=", 14)) {
set_region_map(pos2 + 14);
} else if (0 == strncasecmp(pos2, "expiration=", 11)) {
set_expiration(pos2 + 11);
} else if (key_str == "v4-include-headers") {
set_include_headers(val_str.c_str());
} else if (key_str == "v4-exclude-headers") {
set_exclude_headers(val_str.c_str());
} else if (key_str == "v4-region-map") {
set_region_map(val_str.c_str());
} else if (key_str == "expiration") {
set_expiration(val_str.c_str());
} else {
// ToDo: warnings?
}
Expand Down
9 changes: 4 additions & 5 deletions plugins/s3_auth/unit_tests/test_aws_auth_v4.cc
Original file line number Diff line number Diff line change
Expand Up @@ -260,16 +260,15 @@ TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): squeeze middle spaces multipl
CHECK(inLen - 6 == trimmed.length());
}

TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): does not squeeze middle whitespaces different from spaces, check string",
"[utility]")
TEST_CASE("trimWhiteSpacesAndSqueezeInnerSpaces(): squeeze middle whitespaces, check string", "[utility]")
{
const char in[] = "Very \t\tImportant \t\t\tMessage";
const char in[] = "Very \t\nImportant \v\f\rMessage";
size_t inLen = strlen(in);

const std::string trimmed = trimWhiteSpacesAndSqueezeInnerSpaces(in, inLen);

CHECK_FALSE(trimmed.compare("Very \t\tImportant \t\t\tMessage"));
CHECK(inLen == trimmed.length());
CHECK_FALSE(trimmed.compare("Very Important Message"));
CHECK(inLen - 5 == trimmed.length());
}

TEST_CASE("trimWhiteSpaces(): trim both, check string", "[utility]")
Expand Down

0 comments on commit 8c5fb9c

Please sign in to comment.