#ifndef pihttpclient_h #define pihttpclient_h #include "pihttptypes.h" #include "pip_http_client_export.h" #include "pistringlist.h" class PIHTTPClientBase { public: int __infoFunc(ssize_t dltotal, ssize_t dlnow, ssize_t ultotal, ssize_t ulnow); int __debugFunc(int type, char * data, size_t size); }; //! \~english Main HTTP client class for performing requests with event callbacks. //! \~russian Основной класс HTTP-клиента для выполнения запросов с callback-ми событий. class PIP_HTTP_CLIENT_EXPORT PIHTTPClient: private PIHTTPClientBase { friend class PIHTTPClientBase; friend class CurlThreadPool; public: //! \~english Creates a new HTTP request instance with the specified URL, method and message. //! \~russian Создает новый экземпляр HTTP-запроса с указанным URL, методом и сообщением. static PIHTTPClient * create(const PIString & url, PIHTTP::Method method = PIHTTP::Method::Get, const PIHTTP::MessageConst & req = {}); //! \~english Sets a callback for successful request completion (no parameters). //! \~russian Устанавливает callback для успешного завершения запроса (без параметров). PIHTTPClient * onFinish(std::function f); //! \~english Sets a callback for successful request completion (with response). //! \~russian Устанавливает callback для успешного завершения запроса (с ответом). PIHTTPClient * onFinish(std::function f); //! \~english Sets a callback for request errors (no parameters). //! \~russian Устанавливает callback для ошибок запроса (без параметров). PIHTTPClient * onError(std::function f); //! \~english Sets a callback for request errors (with error response). //! \~russian Устанавливает callback для ошибок запроса (с ответом об ошибке). PIHTTPClient * onError(std::function f); //! \~english Sets a callback for request abortion (no parameters). //! \~russian Устанавливает callback для прерывания запроса (без параметров). PIHTTPClient * onAbort(std::function f); //! \~english Sets a callback for request abortion (with abort response). //! \~russian Устанавливает callback для прерывания запроса (с ответом о прерывании). PIHTTPClient * onAbort(std::function f); //! \~english Starts the HTTP request execution. //! \~russian Начинает выполнение HTTP-запроса. void start(); //! \~english Aborts the current HTTP request. //! \~russian Прерывает текущий HTTP-запрос. void abort(); //! \~english Returns the last error message. //! \~russian Возвращает последнее сообщение об ошибке. PIString lastError() const { return last_error; } private: NO_COPY_CLASS(PIHTTPClient) PIHTTPClient(); virtual ~PIHTTPClient(); PRIVATE_DECLARATION(PIP_HTTP_CLIENT_EXPORT) bool init(); void perform(); void procHeaderLine(PIString & line); static size_t writeMemoryFunc(void * contents, size_t size, size_t nmemb, void * ptr); static size_t readMemoryFunc(void * contents, size_t size, size_t nmemb, void * ptr); static size_t headerFunc(char * contents, size_t size, size_t nmemb, void * ptr); int infoFunc(ssize_t dltotal, ssize_t dlnow, ssize_t ultotal, ssize_t ulnow); int debugFunc(int type, char * data, size_t size); PIString url; PIString last_error; PIStringList headers; PIByteArray buffer_out; PIHTTP::MessageMutable request, reply; std::atomic_bool is_cancel = {false}; ssize_t read_pos = 0; std::function on_finish, on_error, on_abort; }; #endif