Skip to content

Commit 16c5e26

Browse files
authored
Merge pull request #1187 from hyOzd/feature/auth-mode-any
add curl's ANY and ANSAFE authorization options
2 parents 4300b34 + c6cb85c commit 16c5e26

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

cpr/session.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,14 @@ void Session::SetAuth(const Authentication& auth) {
409409
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_NEGOTIATE);
410410
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
411411
break;
412+
case AuthMode::ANY:
413+
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
414+
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
415+
break;
416+
case AuthMode::ANYSAFE:
417+
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_ANYSAFE);
418+
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
419+
break;
412420
}
413421
}
414422

include/cpr/auth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace cpr {
1010

11-
enum class AuthMode { BASIC, DIGEST, NTLM, NEGOTIATE };
11+
enum class AuthMode { BASIC, DIGEST, NTLM, NEGOTIATE, ANY, ANYSAFE };
1212

1313
class Authentication {
1414
public:

test/session_tests.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,49 @@ TEST(DigestTests, SetDigestTest) {
738738
EXPECT_EQ(ErrorCode::OK, response.error.code);
739739
}
740740

741+
TEST(AnyAuthTests, SetAnyTest) {
742+
Url url{server->GetBaseUrl() + "/digest_auth.html"};
743+
Session session;
744+
session.SetUrl(url);
745+
session.SetAuth({"user", "password", AuthMode::ANY});
746+
Response response = session.Get();
747+
std::string expected_text{"Header reflect GET"};
748+
EXPECT_EQ(expected_text, response.text);
749+
EXPECT_EQ(url, response.url);
750+
EXPECT_EQ(std::string{"text/html"}, response.header["content-type"]);
751+
EXPECT_EQ(200, response.status_code);
752+
EXPECT_EQ(ErrorCode::OK, response.error.code);
753+
}
754+
755+
TEST(AnyAuthTests, SetAnySafeTest) {
756+
Authentication auth = {"user", "password", AuthMode::ANYSAFE};
757+
{
758+
Url url{server->GetBaseUrl() + "/digest_auth.html"};
759+
Session session;
760+
session.SetUrl(url);
761+
session.SetAuth(auth);
762+
Response response = session.Get();
763+
std::string expected_text{"Header reflect GET"};
764+
EXPECT_EQ(expected_text, response.text);
765+
EXPECT_EQ(url, response.url);
766+
EXPECT_EQ(std::string{"text/html"}, response.header["content-type"]);
767+
EXPECT_EQ(200, response.status_code);
768+
EXPECT_EQ(ErrorCode::OK, response.error.code);
769+
}
770+
{
771+
Url url{server->GetBaseUrl() + "/basic_auth.html"};
772+
Session session;
773+
session.SetUrl(url);
774+
session.SetAuth(auth);
775+
Response response = session.Get();
776+
EXPECT_EQ(std::string{"Unauthorized"}, response.text);
777+
EXPECT_EQ(url, response.url);
778+
EXPECT_EQ(std::string{"text/plain"}, response.header["content-type"]);
779+
EXPECT_EQ(401, response.status_code);
780+
EXPECT_EQ(ErrorCode::OK, response.error.code);
781+
}
782+
}
783+
741784
TEST(UserAgentTests, SetUserAgentTest) {
742785
Url url{server->GetBaseUrl() + "/header_reflect.html"};
743786
UserAgent userAgent{"Test User Agent"};

0 commit comments

Comments
 (0)