#pragma once #include "common/ExplicitSingleton.h" #include "common/String.h" #include "client/http/PostData.h" #include #include #include #include #include #include namespace http { class Request; struct RequestHandle { protected: struct CtorTag { }; public: ByteString uri; ByteString verb; bool isPost = false; PostData postData; std::vector headers; enum State { ready, running, done, dead, }; State state = ready; std::mutex stateMx; std::condition_variable stateCv; std::atomic bytesTotal = -1; std::atomic bytesDone = 0; int statusCode = 0; ByteString responseData; std::vector responseHeaders; ByteString error; RequestHandle(CtorTag) { } RequestHandle(const RequestHandle &) = delete; RequestHandle &operator =(const RequestHandle &) = delete; void MarkDone(); static std::shared_ptr Create(); }; class RequestManager; struct RequestManagerDeleter { void operator ()(RequestManager *ptr) const; }; using RequestManagerPtr = std::unique_ptr; class RequestManager : public ExplicitSingleton { protected: ByteString proxy; ByteString cafile; ByteString capath; ByteString userAgent; bool disableNetwork; RequestManager(ByteString newProxy, ByteString newCafile, ByteString newCapath, bool newDisableNetwork); void RegisterRequestImpl(Request &request); void UnregisterRequestImpl(Request &request); public: void RegisterRequest(Request &request); void UnregisterRequest(Request &request); bool DisableNetwork() const { return disableNetwork; } static RequestManagerPtr Create(ByteString newProxy, ByteString newCafile, ByteString newCapath, bool newDisableNetwork); }; }