Skip to content

Commit

Permalink
Merge pull request #1187 from hyOzd/feature/auth-mode-any
Browse files Browse the repository at this point in the history
add curl's ANY and ANSAFE authorization options
  • Loading branch information
COM8 authored Feb 24, 2025
2 parents 4300b34 + c6cb85c commit 16c5e26
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
8 changes: 8 additions & 0 deletions cpr/session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,14 @@ void Session::SetAuth(const Authentication& auth) {
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_NEGOTIATE);
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
break;
case AuthMode::ANY:
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
break;
case AuthMode::ANYSAFE:
curl_easy_setopt(curl_->handle, CURLOPT_HTTPAUTH, CURLAUTH_ANYSAFE);
curl_easy_setopt(curl_->handle, CURLOPT_USERPWD, auth.GetAuthString());
break;
}
}

Expand Down
2 changes: 1 addition & 1 deletion include/cpr/auth.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace cpr {

enum class AuthMode { BASIC, DIGEST, NTLM, NEGOTIATE };
enum class AuthMode { BASIC, DIGEST, NTLM, NEGOTIATE, ANY, ANYSAFE };

class Authentication {
public:
Expand Down
43 changes: 43 additions & 0 deletions test/session_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,49 @@ TEST(DigestTests, SetDigestTest) {
EXPECT_EQ(ErrorCode::OK, response.error.code);
}

TEST(AnyAuthTests, SetAnyTest) {
Url url{server->GetBaseUrl() + "/digest_auth.html"};
Session session;
session.SetUrl(url);
session.SetAuth({"user", "password", AuthMode::ANY});
Response response = session.Get();
std::string expected_text{"Header reflect GET"};
EXPECT_EQ(expected_text, response.text);
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"text/html"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}

TEST(AnyAuthTests, SetAnySafeTest) {
Authentication auth = {"user", "password", AuthMode::ANYSAFE};
{
Url url{server->GetBaseUrl() + "/digest_auth.html"};
Session session;
session.SetUrl(url);
session.SetAuth(auth);
Response response = session.Get();
std::string expected_text{"Header reflect GET"};
EXPECT_EQ(expected_text, response.text);
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"text/html"}, response.header["content-type"]);
EXPECT_EQ(200, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
{
Url url{server->GetBaseUrl() + "/basic_auth.html"};
Session session;
session.SetUrl(url);
session.SetAuth(auth);
Response response = session.Get();
EXPECT_EQ(std::string{"Unauthorized"}, response.text);
EXPECT_EQ(url, response.url);
EXPECT_EQ(std::string{"text/plain"}, response.header["content-type"]);
EXPECT_EQ(401, response.status_code);
EXPECT_EQ(ErrorCode::OK, response.error.code);
}
}

TEST(UserAgentTests, SetUserAgentTest) {
Url url{server->GetBaseUrl() + "/header_reflect.html"};
UserAgent userAgent{"Test User Agent"};
Expand Down

0 comments on commit 16c5e26

Please sign in to comment.