Skip to content

Commit

Permalink
Added a way to disable URL encoding for payload and parameters
Browse files Browse the repository at this point in the history
Closes #324
  • Loading branch information
COM8 committed Mar 1, 2021
1 parent 8c0600c commit 04f06b8
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
6 changes: 3 additions & 3 deletions cpr/curl_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ const std::string CurlContainer<Parameter>::GetContent(const CurlHolder& holder)
content += "&";
}

std::string escapedKey = holder.urlEncode(parameter.key);
std::string escapedKey = encode ? holder.urlEncode(parameter.key) : parameter.key;
if (parameter.value.empty()) {
content += escapedKey;
} else {
std::string escapedValue = holder.urlEncode(parameter.value);
std::string escapedValue = encode ? holder.urlEncode(parameter.value) : parameter.value;
content += escapedKey + "=";
content += escapedValue;
}
Expand All @@ -46,7 +46,7 @@ const std::string CurlContainer<Pair>::GetContent(const CurlHolder& holder) cons
if (!content.empty()) {
content += "&";
}
std::string escaped = holder.urlEncode(element.value);
std::string escaped = encode ? holder.urlEncode(element.value) : element.value;
content += element.key + "=" + escaped;
}

Expand Down
5 changes: 5 additions & 0 deletions include/cpr/curl_container.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ struct Pair {
template <class T>
class CurlContainer {
public:
/**
* Enables or disables URL encoding for keys and values when calling GetContent(...).
**/
bool encode = true;

CurlContainer() = default;
CurlContainer(const std::initializer_list<T>&);

Expand Down
24 changes: 24 additions & 0 deletions test/structures_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@ TEST(PayloadTests, UseStringVariableTest) {
EXPECT_EQ(payload.GetContent(CurlHolder()), expected);
}

TEST(PayloadTests, DisableEncodingTest) {
std::string key1 = "key1";
std::string key2 = "key2§$%&/";
std::string value1 = "hello.,.,";
std::string value2 = "hello";
Payload payload{{key1, value1}, {key2, value2}};
payload.encode = false;

std::string expected = key1 + '=' + value1 + '&' + key2 + '=' + value2;
EXPECT_EQ(payload.GetContent(CurlHolder()), expected);
}

TEST(ParametersTests, UseStringVariableTest) {
std::string value1 = "hello";
std::string key2 = "key2";
Expand All @@ -25,6 +37,18 @@ TEST(ParametersTests, UseStringVariableTest) {
EXPECT_EQ(parameters.GetContent(CurlHolder()), expected);
}

TEST(ParametersTests, DisableEncodingTest) {
std::string key1 = "key1";
std::string key2 = "key2§$%&/";
std::string value1 = "hello.,.,";
std::string value2 = "hello";
Parameters parameters{{key1, value1}, {key2, value2}};
parameters.encode = false;

std::string expected = key1 + '=' + value1 + '&' + key2 + '=' + value2;
EXPECT_EQ(parameters.GetContent(CurlHolder()), expected);
}

int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
Expand Down

0 comments on commit 04f06b8

Please sign in to comment.