diff --git a/include/miniocpp/http.h b/include/miniocpp/http.h index a3754a3..4d9de06 100644 --- a/include/miniocpp/http.h +++ b/include/miniocpp/http.h @@ -19,7 +19,6 @@ #define MINIO_CPP_HTTP_H_INCLUDED #include -#include #include #include #include @@ -142,8 +141,7 @@ struct Response { Response() = default; ~Response() = default; - size_t ResponseCallback(curlpp::Multi* const requests, - curlpp::Easy* const request, const char* const buffer, + size_t ResponseCallback(curlpp::Easy* const request, const char* const buffer, size_t size, size_t length); explicit operator bool() const { diff --git a/src/http.cc b/src/http.cc index 8af3dfa..8328035 100644 --- a/src/http.cc +++ b/src/http.cc @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -48,6 +47,10 @@ #include #endif +#ifndef CURL_WRITEFUNC_ERROR +#define CURL_WRITEFUNC_ERROR static_cast(0xFFFFFFFF) +#endif + namespace minio::http { // MethodToString converts http Method enum to string. @@ -269,16 +272,14 @@ error::Error Response::ReadHeaders() { return error::SUCCESS; } -size_t Response::ResponseCallback(curlpp::Multi* const requests, - curlpp::Easy* const request, +size_t Response::ResponseCallback(curlpp::Easy* const request, const char* const buffer, size_t size, size_t length) { size_t realsize = size * length; // If error occurred previously, just cancel the request. if (!error.empty()) { - requests->remove(request); - return realsize; + return CURL_WRITEFUNC_ERROR; } if (!status_code_read_ || !headers_read_) { @@ -288,8 +289,7 @@ size_t Response::ResponseCallback(curlpp::Multi* const requests, if (!status_code_read_) { if (error::Error err = ReadStatusCode()) { error = err.String(); - requests->remove(request); - return realsize; + return CURL_WRITEFUNC_ERROR; } if (!status_code_read_) return realsize; @@ -298,8 +298,7 @@ size_t Response::ResponseCallback(curlpp::Multi* const requests, if (!headers_read_) { if (error::Error err = ReadHeaders()) { error = err.String(); - requests->remove(request); - return realsize; + return CURL_WRITEFUNC_ERROR; } if (!headers_read_ || response_.empty()) return realsize; @@ -308,7 +307,7 @@ size_t Response::ResponseCallback(curlpp::Multi* const requests, if (datafunc != nullptr && status_code >= 200 && status_code <= 299) { DataFunctionArgs args(request, this, std::string(this->response_), userdata); - if (!datafunc(args)) requests->remove(request); + if (!datafunc(args)) return CURL_WRITEFUNC_ERROR; } else { body = response_; } @@ -319,7 +318,7 @@ size_t Response::ResponseCallback(curlpp::Multi* const requests, // If data function is set and the request is successful, send data. if (datafunc != nullptr && status_code >= 200 && status_code <= 299) { DataFunctionArgs args(request, this, std::string(buffer, length), userdata); - if (!datafunc(args)) requests->remove(request); + if (!datafunc(args)) return CURL_WRITEFUNC_ERROR; } else { body.append(buffer, length); } @@ -339,7 +338,6 @@ Request::Request(Method method, Url url) { Response Request::execute() { curlpp::Cleanup cleaner; curlpp::Easy request; - curlpp::Multi requests; // Request settings. request.setOpt(new curlpp::options::CustomRequest{MethodToString(method)}); @@ -399,8 +397,7 @@ Response Request::execute() { using namespace std::placeholders; request.setOpt(new curlpp::options::WriteFunction( - std::bind(&Response::ResponseCallback, &response, &requests, &request, _1, - _2, _3))); + std::bind(&Response::ResponseCallback, &response, &request, _1, _2, _3))); auto progress = [&progressfunc = progressfunc, &progress_userdata = progress_userdata]( @@ -421,31 +418,8 @@ Response Request::execute() { request.setOpt(new curlpp::options::ProgressFunction(progress)); } - int left = 0; - requests.add(&request); - // Execute. - while (!requests.perform(&left)) { - } - while (left) { - fd_set fdread{}; - fd_set fdwrite{}; - fd_set fdexcep{}; - int maxfd = 0; - - FD_ZERO(&fdread); - FD_ZERO(&fdwrite); - FD_ZERO(&fdexcep); - - requests.fdset(&fdread, &fdwrite, &fdexcep, &maxfd); - - if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, nullptr) < 0) { - std::cerr << "select() failed; this should not happen" << std::endl; - std::terminate(); - } - while (!requests.perform(&left)) { - } - } + request.perform(); if (progressfunc != nullptr) { ProgressFunctionArgs args;