diff options
Diffstat (limited to 'src/zenhttp/include')
| -rw-r--r-- | src/zenhttp/include/zenhttp/httpclient.h | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/zenhttp/include/zenhttp/httpclient.h b/src/zenhttp/include/zenhttp/httpclient.h index 9de5c7cce..f3559f214 100644 --- a/src/zenhttp/include/zenhttp/httpclient.h +++ b/src/zenhttp/include/zenhttp/httpclient.h @@ -6,9 +6,11 @@ #include <zencore/iobuffer.h> #include <zencore/logbase.h> +#include <zencore/thread.h> #include <zencore/uid.h> #include <zenhttp/httpcommon.h> +#include <functional> #include <optional> #include <unordered_map> @@ -27,12 +29,32 @@ class CompositeBuffer; */ +struct HttpClientAccessToken +{ + using Clock = std::chrono::system_clock; + using TimePoint = Clock::time_point; + + static constexpr int64_t ExpireMarginInSeconds = 30; + + std::string Value; + TimePoint ExpireTime; + + bool IsValid() const + { + return Value.empty() == false && + ExpireMarginInSeconds < std::chrono::duration_cast<std::chrono::seconds>(ExpireTime - Clock::now()).count(); + } +}; + struct HttpClientSettings { - std::string LogCategory = "httpclient"; - std::chrono::milliseconds ConnectTimeout{3000}; - std::chrono::milliseconds Timeout{}; - bool AssumeHttp2 = false; + std::string LogCategory = "httpclient"; + std::chrono::milliseconds ConnectTimeout{3000}; + std::chrono::milliseconds Timeout{}; + std::optional<std::function<HttpClientAccessToken()>> AccessTokenProvider; + bool AssumeHttp2 = false; + bool AllowResume = false; + uint8_t RetryCount = 0; }; class HttpClient @@ -134,6 +156,7 @@ public: const CompositeBuffer& Payload, ZenContentType ContentType, const KeyValueMap& AdditionalHeader = {}); + [[nodiscard]] Response Download(std::string_view Url, const std::filesystem::path& TempFolderPath, const KeyValueMap& AdditionalHeader = {}); @@ -147,14 +170,18 @@ public: LoggerRef Logger() { return m_Log; } std::string_view GetBaseUri() const { return m_BaseUri; } + bool Authenticate(); private: + const std::optional<HttpClientAccessToken> GetAccessToken(); struct Impl; LoggerRef m_Log; std::string m_BaseUri; std::string m_SessionId; const HttpClientSettings m_ConnectionSettings; + RwLock m_AccessTokenLock; + HttpClientAccessToken m_CachedAccessToken; Ref<Impl> m_Impl; }; |