From e9c88a736953f4e69a95dd1c23eefeee837067df Mon Sep 17 00:00:00 2001 From: shell Date: Sun, 2 Aug 2026 23:23:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=81=B6=E6=84=8F=E8=B0=83=E7=94=A8=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=86=85=E5=AD=98=E8=80=97=E5=B0=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/seafile/api/seafile_api.hpp | 121 ++++++++++------------------ 1 file changed, 43 insertions(+), 78 deletions(-) diff --git a/include/seafile/api/seafile_api.hpp b/include/seafile/api/seafile_api.hpp index a5d6ce5..4f8bf21 100644 --- a/include/seafile/api/seafile_api.hpp +++ b/include/seafile/api/seafile_api.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "account_info.hpp" #include "auth_token.hpp" @@ -25,10 +26,8 @@ #include "token_type.hpp" #include "seafile/util/version.hpp" -namespace seafile::api -{ - class SeaFileApi final : public ISeaFileApi - { +namespace seafile::api { + class SeaFileApi final : public ISeaFileApi { //base url of the seafile api server std::string base_url; std::string token; @@ -40,50 +39,41 @@ namespace seafile::api * @param path url path * @return the whole url string */ - [[nodiscard]] std::string makeUrl(const std::string& path) const - { + [[nodiscard]] std::string makeUrl(const std::string &path) const { auto url = ada::parse(this->base_url); - if (!url) - { + if (!url) { return {}; } url->set_pathname(path); return std::string(url->get_href()); } - template + template static tl::expected - parseResponse(const cpr::Response& response) - { - if (response.error) - { + parseResponse(const cpr::Response &response) { + if (response.error) { return tl::make_unexpected( SeafileException( response.error.message)); } - if (response.status_code != 200 && response.status_code != 206) - { + if (response.status_code != 200 && response.status_code != 206) { return tl::make_unexpected( SeafileException( std::format("Http Error: {}", response.status_code))); } - try - { + try { return nlohmann::json::parse(response.text) - .get(); - } - catch (const std::exception& e) - { + .get(); + } catch (const std::exception &e) { return tl::make_unexpected( SeafileException(e.what())); } } - static std::string makeAuthToken(const std::string& token, const TokenType& token_type) - { + static std::string makeAuthToken(const std::string &token, const TokenType &token_type) { return token_type == TokenType::BEARER ? std::format("Bearer {}", token) : std::format("Token {}", token); @@ -96,9 +86,8 @@ namespace seafile::api * @param body post body data * @return T if success else SeafileException */ - template - tl::expected post(const std::string& path, const nlohmann::json& body) - { + template + tl::expected post(const std::string &path, const nlohmann::json &body) { const auto url = makeUrl(path); const auto response = cpr::Post( cpr::Url{url}, @@ -114,8 +103,7 @@ namespace seafile::api * @brief primary constructor * @param base_url base url of seafile server */ - explicit SeaFileApi(std::string base_url) : base_url(std::move(base_url)) - { + explicit SeaFileApi(std::string base_url) : base_url(std::move(base_url)) { } /** @@ -125,25 +113,19 @@ namespace seafile::api * @return token when success else SeafileException */ tl::expected - auth(const std::string& username, const std::string& password) override - { + auth(const std::string &username, const std::string &password) override { const nlohmann::json body = { {"username", username}, {"password", password} }; - const auto& auth_token = this->post("/api2/auth-token/", body); - if (auth_token) - { + const auto &auth_token = this->post("/api2/auth-token/", body); + if (auth_token) { this->token = auth_token->token; - if (const auto& server_info = this->serverInfo()) - { - if (const auto version = util::Version(server_info->version); version.major() < 11) - { + if (const auto &server_info = this->serverInfo()) { + if (const auto version = util::Version(server_info->version); version.major() < 11) { this->token_type = TokenType::TOKEN; } - } - else - { + } else { return tl::make_unexpected(server_info.error()); } } @@ -151,8 +133,7 @@ namespace seafile::api } tl::expected - serverInfo() const override - { + serverInfo() const override { const auto response = cpr::Get( cpr::Url{makeUrl("/api2/server-info/")}, cpr::Header{ @@ -167,8 +148,7 @@ namespace seafile::api * @return default repo info */ tl::expected - defaultRepo() const override - { + defaultRepo() const override { const auto auth = makeAuthToken(token, token_type); const auto url = makeUrl("/api2/default-repo/"); const auto response = cpr::Get(cpr::Url{url}, @@ -180,8 +160,7 @@ namespace seafile::api } tl::expected - repoInfo(const std::string& repo_id) const override - { + repoInfo(const std::string &repo_id) const override { const auto url = makeUrl(std::format("/api2/repos/{}/", repo_id)); const auto auth = makeAuthToken(token, token_type); @@ -194,8 +173,7 @@ namespace seafile::api } tl::expected, SeafileException> - repos(const std::string& type, const std::string& name_contains) const override - { + repos(const std::string &type, const std::string &name_contains) const override { const auto url = makeUrl("/api2/repos/"); const auto auth = makeAuthToken(token, token_type); const auto response = cpr::Get(cpr::Url{url}, @@ -209,7 +187,7 @@ namespace seafile::api }, connection_pool); - return parseResponse>(response); + return parseResponse >(response); } /** @@ -219,8 +197,7 @@ namespace seafile::api * @return repo entries */ tl::expected, SeafileException> - repoDir(const std::string& repo_id, const std::string& path) const override - { + repoDir(const std::string &repo_id, const std::string &path) const override { const auto url = cpr::Url{makeUrl(std::format("/api2/repos/{}/dir/", repo_id))}; const auto auth = makeAuthToken(token, token_type); @@ -234,12 +211,11 @@ namespace seafile::api }, connection_pool, cpr::ReserveSize(512 * 1024)); - return parseResponse>(response); + return parseResponse >(response); } tl::expected - accountInfo() const override - { + accountInfo() const override { const auto url = cpr::Url{makeUrl("/api2/account/info/")}; const auto auth = makeAuthToken(token, token_type); @@ -252,8 +228,7 @@ namespace seafile::api } tl::expected - fileDetail(const std::string& repo_id, const std::string& path) const override - { + fileDetail(const std::string &repo_id, const std::string &path) const override { const auto url = cpr::Url{makeUrl(std::format("/api2/repos/{}/file/detail/", repo_id))}; const auto auth = makeAuthToken(token, token_type); @@ -268,8 +243,7 @@ namespace seafile::api } tl::expected - downloadFileUrl(const std::string& repo_id, const std::string& path) const override - { + downloadFileUrl(const std::string &repo_id, const std::string &path) const override { const auto auth = makeAuthToken(token, token_type); const auto url = cpr::Url{makeUrl(std::format("/api2/repos/{}/file/", repo_id))}; const auto response = cpr::Get(url, @@ -284,13 +258,11 @@ namespace seafile::api tl::expected - downloadFile(const std::string& repo_id, - const std::string& path, + downloadFile(const std::string &repo_id, + const std::string &path, const std::optional start, - const std::optional end) const override - { - if (auto download_url = downloadFileUrl(repo_id, path); download_url.has_value()) - { + const std::optional end) const override { + if (auto download_url = downloadFileUrl(repo_id, path); download_url.has_value()) { const auto auth = makeAuthToken(token, token_type); const auto url = cpr::Url{download_url.value()}; auto header = cpr::Header{ @@ -303,31 +275,24 @@ namespace seafile::api header.emplace("range", range); size_t content_size = 1024 * 4; - if (start.has_value() && end.has_value()) - { - content_size = end.value() - start.value(); + if (start.has_value() && end.has_value()) { + content_size = std::min(end.value() - start.value(), 4 * 1024 * 1024ULL); } - if (const auto& response = cpr::Get(url, header, connection_pool, cpr::ReserveSize(content_size)); - response.error || (response.status_code != 200 && response.status_code != 206)) - { + if (const auto &response = cpr::Get(url, header, connection_pool, cpr::ReserveSize(content_size)); + response.error || (response.status_code != 200 && response.status_code != 206)) { return tl::make_unexpected(SeafileException{ std::format("Download bytes range {} failed, HTTP Error:{}", range, response.status_code) }); - } - else - { + } else { return response.text; } - } - else - { + } else { return download_url; } } tl::expected - dirDetail(const std::string& repo_id, const std::string& path) const override - { + dirDetail(const std::string &repo_id, const std::string &path) const override { const auto auth = makeAuthToken(token, token_type); const auto url = cpr::Url{makeUrl(std::format("/api/v2.1/repos/{}/dir/detail/", repo_id))}; const auto response = cpr::Get(url, cpr::Header{