#ifndef pihttpclient_h #define pihttpclient_h #include "pihttptypes.h" #include "pip_http_client_export.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); }; class PIP_HTTP_CLIENT_EXPORT PIHTTPClient: private PIHTTPClientBase { friend class PIHTTPClientBase; friend class CurlThreadPool; public: static PIHTTPClient * create(const PIString & url, PIHTTP::Method method = PIHTTP::Method::Get, const PIHTTP::MessageConst & req = {}); PIHTTPClient * onFinish(std::function f); PIHTTPClient * onFinish(std::function f); PIHTTPClient * onError(std::function f); PIHTTPClient * onError(std::function f); PIHTTPClient * onAbort(std::function f); PIHTTPClient * onAbort(std::function f); void start(); void abort(); 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; 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