This repository has been archived on 2025-03-20. You can view files and clone it, but cannot push or open issues or pull requests.
The-Powder-Toy/src/client/http/requestmanager/RequestManager.h
Tamás Bálint Misius 0cc179ae4e
Factor RequestManager threading into Libcurl impl
Because that's the only impl that needs it and is likely to ever need it. I hope I don't have to factor it back out for Android.
2023-05-30 15:32:42 +02:00

91 lines
1.8 KiB
C++

#pragma once
#include "common/ExplicitSingleton.h"
#include "common/String.h"
#include "client/http/PostData.h"
#include <atomic>
#include <thread>
#include <vector>
#include <memory>
#include <mutex>
#include <condition_variable>
namespace http
{
class Request;
struct RequestHandle
{
protected:
struct CtorTag
{
};
public:
ByteString uri;
ByteString verb;
bool isPost = false;
PostData postData;
std::vector<ByteString> headers;
enum State
{
ready,
running,
done,
dead,
};
State state = ready;
std::mutex stateMx;
std::condition_variable stateCv;
std::atomic<int> bytesTotal = -1;
std::atomic<int> bytesDone = 0;
int statusCode = 0;
ByteString responseData;
std::vector<ByteString> responseHeaders;
ByteString error;
RequestHandle(CtorTag)
{
}
RequestHandle(const RequestHandle &) = delete;
RequestHandle &operator =(const RequestHandle &) = delete;
void MarkDone();
static std::shared_ptr<RequestHandle> Create();
};
class RequestManager;
struct RequestManagerDeleter
{
void operator ()(RequestManager *ptr) const;
};
using RequestManagerPtr = std::unique_ptr<RequestManager, RequestManagerDeleter>;
class RequestManager : public ExplicitSingleton<RequestManager>
{
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);
};
}