diff --git a/examples/github_client.cc b/examples/github_client.cc index e7f4f6b..5903c13 100644 --- a/examples/github_client.cc +++ b/examples/github_client.cc @@ -87,16 +87,17 @@ void ListUserFollowers(webcc::HttpClientSession& session, } } -// List the followers of the current authorized user. -// Header syntax: Authorization: -// Example: -// ListAuthUserFollowers(session, "Basic ") -// ListAuthUserFollowers(session, "Token ") +// List the followers of the current authorized user using Basic authorization. +// E.g., list my own followers: +// ListAuthUserFollowers(session, "sprinfall@gmail.com", ""); void ListAuthUserFollowers(webcc::HttpClientSession& session, - const std::string& auth) { + const std::string& login, + const std::string& password) { try { - auto r = session.Get(kUrlRoot + "/user/followers", {}, - {"Authorization", auth}); + auto r = session.Request(webcc::HttpRequestBuilder{}.Get(). + Url(kUrlRoot + "/user/followers"). + AuthBasic(login, password) + ()); PRINT_JSON_STRING(r->content()); @@ -108,9 +109,11 @@ void ListAuthUserFollowers(webcc::HttpClientSession& session, void CreateAuthorization(webcc::HttpClientSession& session, const std::string& auth) { try { - - std::string data = "{'note': 'Webcc test', 'scopes': ['public_repo',\ - 'repo', 'repo:status', 'user']}"; + std::string data = + "{\n" + " 'note': 'Webcc test',\n" + " 'scopes': ['public_repo', 'repo', 'repo:status', 'user']\n" + "}"; auto r = session.Post(kUrlRoot + "/authorizations", std::move(data), true, {"Authorization", auth}); @@ -128,6 +131,7 @@ int main() { WEBCC_LOG_INIT("", webcc::LOG_CONSOLE); webcc::HttpClientSession session; + session.set_ssl_verify(kSslVerify); ListEvents(session); diff --git a/webcc/http_client_session.cc b/webcc/http_client_session.cc index 06588a5..16831ac 100644 --- a/webcc/http_client_session.cc +++ b/webcc/http_client_session.cc @@ -1,5 +1,6 @@ #include "webcc/http_client_session.h" +#include "webcc/base64.h" #include "webcc/logger.h" #include "webcc/url.h" @@ -9,6 +10,21 @@ HttpClientSession::HttpClientSession() { InitHeaders(); } +void HttpClientSession::Auth(const std::string& type, + const std::string& credentials) { + headers_.Set(http::headers::kAuthorization, type + " " + credentials); +} + +void HttpClientSession::AuthBasic(const std::string& login, + const std::string& password) { + auto credentials = Base64Encode(login + ":" + password); + return Auth("Basic", credentials); +} + +void HttpClientSession::AuthToken(const std::string& token) { + return Auth("Token", token); +} + HttpResponsePtr HttpClientSession::Request(HttpRequestPtr request) { assert(request); diff --git a/webcc/http_client_session.h b/webcc/http_client_session.h index bb684ef..8c33640 100644 --- a/webcc/http_client_session.h +++ b/webcc/http_client_session.h @@ -20,14 +20,6 @@ public: ~HttpClientSession() = default; - void set_content_type(const std::string& content_type) { - content_type_ = content_type; - } - - void set_charset(const std::string& charset) { - charset_ = charset; - } - void set_ssl_verify(bool ssl_verify) { ssl_verify_ = ssl_verify; } @@ -46,6 +38,23 @@ public: headers_.Set(key, value); } + void set_content_type(const std::string& content_type) { + content_type_ = content_type; + } + + void set_charset(const std::string& charset) { + charset_ = charset; + } + + // Set authorization. + void Auth(const std::string& type, const std::string& credentials); + + // Set Basic authorization. + void AuthBasic(const std::string& login, const std::string& password); + + // Set Token authorization. + void AuthToken(const std::string& token); + // Send a request. // Please use HttpRequestBuilder to build the request. HttpResponsePtr Request(HttpRequestPtr request); diff --git a/webcc/http_request.h b/webcc/http_request.h index 849afa3..725bbc0 100644 --- a/webcc/http_request.h +++ b/webcc/http_request.h @@ -23,10 +23,18 @@ public: ~HttpRequest() override = default; + const std::string& method() const { + return method_; + } + void set_method(const std::string& method) { method_ = method; } + const Url& url() const { + return url_; + } + void set_url(const std::string& url) { url_.Init(url); } @@ -35,14 +43,6 @@ public: url_.AddQuery(key, value); } - const std::string& method() const { - return method_; - } - - const Url& url() const { - return url_; - } - const std::string& host() const { return url_.host(); } diff --git a/webcc/http_request_builder.cc b/webcc/http_request_builder.cc index a94e18c..042f6b3 100644 --- a/webcc/http_request_builder.cc +++ b/webcc/http_request_builder.cc @@ -69,6 +69,10 @@ HttpRequestBuilder& HttpRequestBuilder::AuthBasic(const std::string& login, return Auth("Basic", credentials); } +HttpRequestBuilder& HttpRequestBuilder::AuthToken(const std::string& token) { + return Auth("Token", token); +} + void HttpRequestBuilder::SetContent(HttpRequestPtr request, std::string&& data) { if (gzip_ && data.size() > kGzipThreshold) { diff --git a/webcc/http_request_builder.h b/webcc/http_request_builder.h index 9dc5736..fcf9bd6 100644 --- a/webcc/http_request_builder.h +++ b/webcc/http_request_builder.h @@ -105,6 +105,8 @@ public: HttpRequestBuilder& AuthBasic(const std::string& login, const std::string& password); + HttpRequestBuilder& AuthToken(const std::string& token); + private: void SetContent(HttpRequestPtr request, std::string&& data);