1#ifndef ENGINE_SHARED_HTTP_H
2#define ENGINE_SHARED_HTTP_H
12#include <condition_variable>
16#include <unordered_map>
143 size_t OnHeader(
char *pHeader,
size_t HeaderSize);
146 size_t OnData(
char *pData,
size_t DataSize);
148 static int ProgressCallback(
void *pUser,
double DlTotal,
double DlCurr,
double UlTotal,
double UlCurr);
150 static size_t WriteCallback(
char *pData,
size_t Size,
size_t Number,
void *pUser);
183 void Post(
const unsigned char *pData,
size_t DataLength)
187 m_pBody = (
unsigned char *)malloc(std::max((
size_t)1, DataLength));
197 void Header(
const char *pNameColonValue);
201 str_format(aHeader,
sizeof(aHeader),
"%s: %s", pName, pValue);
207 str_format(aHeader,
sizeof(aHeader),
"%s: %d", pName, Value);
224 double Size()
const {
return m_Size.load(std::memory_order_relaxed); }
243 void Result(
unsigned char **ppResult,
size_t *pResultLength)
const;
252inline std::unique_ptr<CHttpRequest>
HttpHead(
const char *pUrl)
254 auto pResult = std::make_unique<CHttpRequest>(pUrl);
259inline std::unique_ptr<CHttpRequest>
HttpGet(
const char *pUrl)
261 return std::make_unique<CHttpRequest>(pUrl);
264inline std::unique_ptr<CHttpRequest>
HttpGetFile(
const char *pUrl,
IStorage *pStorage,
const char *pOutputFile,
int StorageType)
266 std::unique_ptr<CHttpRequest> pResult =
HttpGet(pUrl);
267 pResult->WriteToFile(pStorage, pOutputFile, StorageType);
268 pResult->Timeout(
CTimeout{4000, 0, 500, 5});
272inline std::unique_ptr<CHttpRequest>
HttpGetBoth(
const char *pUrl,
IStorage *pStorage,
const char *pOutputFile,
int StorageType)
274 std::unique_ptr<CHttpRequest> pResult =
HttpGet(pUrl);
275 pResult->WriteToFileAndMemory(pStorage, pOutputFile, StorageType);
276 pResult->Timeout(
CTimeout{4000, 0, 500, 5});
280inline std::unique_ptr<CHttpRequest>
HttpPost(
const char *pUrl,
const unsigned char *pData,
size_t DataLength)
282 auto pResult = std::make_unique<CHttpRequest>(pUrl);
283 pResult->Post(pData, DataLength);
284 pResult->Timeout(
CTimeout{4000, 15000, 500, 5});
288inline std::unique_ptr<CHttpRequest>
HttpPostJson(
const char *pUrl,
const char *pJson)
290 auto pResult = std::make_unique<CHttpRequest>(pUrl);
291 pResult->PostJson(pJson);
292 pResult->Timeout(
CTimeout{4000, 15000, 500, 5});
296void EscapeUrl(
char *pBuf,
int Size,
const char *pStr);
324 std::optional<std::chrono::time_point<std::chrono::steady_clock>>
m_ShutdownTime;
335 bool Init(std::chrono::milliseconds ShutdownDelay);
338 void Run(std::shared_ptr<IHttpRequest> pRequest)
override;
void FailOnErrorStatus(bool FailOnErrorStatus)
Definition http.h:167
void WriteToFileAndMemory(IStorage *pStorage, const char *pDest, int StorageType)
Definition http.cpp:519
bool m_SkipByFileTime
Definition http.h:88
static size_t HeaderCallback(char *pData, size_t Size, size_t Number, void *pUser)
Definition http.cpp:347
const SHA256_DIGEST & ResultSha256() const
Definition http.cpp:555
int64_t m_MaxResponseSize
Definition http.h:91
static int ProgressCallback(void *pUser, double DlTotal, double DlCurr, double UlTotal, double UlCurr)
Definition http.cpp:358
REQUEST
Definition http.h:58
@ POST_JSON
Definition http.h:62
@ GET
Definition http.h:59
@ POST
Definition http.h:61
@ HEAD
Definition http.h:60
bool ConfigureHandle(void *pHandle)
Definition http.cpp:145
HTTPLOG m_LogProgress
Definition http.h:118
void * m_pHeaders
Definition http.h:83
bool m_HeadersEnded
Definition http.h:130
const char * Dest()
Definition http.h:211
char m_aUrl[256]
Definition http.h:81
std::mutex m_WaitMutex
Definition http.h:126
void Result(unsigned char **ppResult, size_t *pResultLength) const
Definition http.cpp:539
virtual ~CHttpRequest()
Definition http.cpp:68
char m_aDestAbsolute[IO_MAX_PATH_LENGTH]
Definition http.h:112
std::atomic< int > m_Progress
Definition http.h:117
void IpResolve(IPRESOLVE IpResolve)
Definition http.h:166
void Abort()
Definition http.h:232
std::optional< int64_t > m_ResultLastModified
Definition http.h:132
REQUEST m_Type
Definition http.h:93
void Header(const char *pNameColonValue)
Definition http.cpp:525
static constexpr const char * GetRequestType(REQUEST Type)
Definition http.h:65
void Wait()
Definition http.cpp:530
json_value * ResultJson() const
Definition http.cpp:547
void MaxResponseSize(int64_t MaxResponseSize)
Definition http.h:164
size_t m_BodyLength
Definition http.h:85
double Size() const
Definition http.h:224
IPRESOLVE m_IpResolve
Definition http.h:119
void WriteToMemory()
Definition http.h:169
std::optional< int64_t > ResultAgeSeconds() const
Definition http.cpp:568
unsigned char * m_pBuffer
Definition http.h:106
bool m_WriteToMemory
Definition http.h:99
void OnCompletionInternal(void *pHandle, unsigned int Result)
Definition http.cpp:368
int m_StorageType
Definition http.h:110
std::optional< SHA256_DIGEST > m_ActualSha256
Definition http.h:95
void WriteToFile(IStorage *pStorage, const char *pDest, int StorageType)
Definition http.cpp:502
void Timeout(CTimeout Timeout)
Definition http.h:161
std::atomic< double > m_Size
Definition http.h:115
int StatusCode() const
Definition http.cpp:562
EHttpState State() const
Definition http.h:226
bool ShouldSkipRequest()
Definition http.cpp:102
virtual void OnCompletion(EHttpState State)
Definition http.h:155
void Head()
Definition http.h:182
void ExpectSha256(const SHA256_DIGEST &Sha256)
Definition http.h:181
std::atomic< double > m_Current
Definition http.h:116
std::optional< int64_t > ResultLastModified() const
Definition http.cpp:578
int Progress() const
Definition http.h:225
size_t OnData(char *pData, size_t DataSize)
Definition http.cpp:307
static size_t WriteCallback(char *pData, size_t Size, size_t Number, void *pUser)
Definition http.cpp:353
std::optional< int64_t > m_ResultDate
Definition http.h:131
size_t m_BufferSize
Definition http.h:105
void HeaderInt(const char *pName, int Value)
Definition http.h:204
virtual void OnProgress()
Definition http.h:154
void Post(const unsigned char *pData, size_t DataLength)
Definition http.h:183
CTimeout m_Timeout
Definition http.h:90
bool m_WriteToFile
Definition http.h:100
uint64_t m_ResponseLength
Definition http.h:102
char m_aDestAbsoluteTmp[IO_MAX_PATH_LENGTH]
Definition http.h:111
void ValidateBeforeOverwrite(bool ValidateBeforeOverwrite)
Definition http.h:180
friend class CHttp
Definition http.h:55
int m_StatusCode
Definition http.h:129
IOHANDLE m_File
Definition http.h:109
unsigned char * m_pBody
Definition http.h:84
void OnValidation(bool Success)
Definition http.cpp:477
std::atomic< EHttpState > m_State
Definition http.h:124
std::atomic< bool > m_Abort
Definition http.h:125
std::condition_variable m_WaitCondition
Definition http.h:127
char m_aDest[IO_MAX_PATH_LENGTH]
Definition http.h:113
int64_t m_IfModifiedSince
Definition http.h:92
SHA256_CTX m_ActualSha256Ctx
Definition http.h:96
bool BeforeInit()
Definition http.cpp:116
CHttpRequest(const char *pUrl)
Definition http.cpp:62
void HeaderString(const char *pName, const char *pValue)
Definition http.h:198
double Current() const
Definition http.h:223
bool m_ValidateBeforeOverwrite
Definition http.h:87
char m_aErr[256]
Definition http.h:123
std::optional< SHA256_DIGEST > m_ExpectedSha256
Definition http.h:97
bool Done() const
Definition http.h:227
void PostJson(const char *pJson)
Definition http.h:190
void SkipByFileTime(bool SkipByFileTime)
Definition http.h:163
void LogProgress(HTTPLOG LogProgress)
Definition http.h:165
bool m_FailOnErrorStatus
Definition http.h:121
size_t OnHeader(char *pHeader, size_t HeaderSize)
Definition http.cpp:261
~CHttp() override
Definition http.cpp:823
std::atomic< bool > m_Shutdown
Definition http.h:325
void Run(std::shared_ptr< IHttpRequest > pRequest) override
Definition http.cpp:798
std::chrono::milliseconds m_ShutdownDelay
Definition http.h:323
std::atomic< EState > m_State
Definition http.h:320
std::unordered_map< void *, std::shared_ptr< CHttpRequest > > m_RunningRequests
Definition http.h:322
EState
Definition http.h:310
@ ERROR
Definition http.h:313
@ UNINITIALIZED
Definition http.h:311
@ RUNNING
Definition http.h:312
void Shutdown() override
Definition http.cpp:813
std::optional< std::chrono::time_point< std::chrono::steady_clock > > m_ShutdownTime
Definition http.h:324
std::condition_variable m_Cv
Definition http.h:319
std::mutex m_Lock
Definition http.h:318
std::deque< std::shared_ptr< CHttpRequest > > m_PendingRequests
Definition http.h:321
static void ThreadMain(void *pUser)
Definition http.cpp:605
void * m_pMultiH
Definition http.h:328
void RunLoop()
Definition http.cpp:611
bool Init(std::chrono::milliseconds ShutdownDelay)
Definition http.cpp:584
void * m_pThread
Definition http.h:316
long m_TimeoutMs
Definition http.h:48
long m_ConnectTimeoutMs
Definition http.h:47
long m_LowSpeedLimit
Definition http.h:49
long m_LowSpeedTime
Definition http.h:50
struct _json_value json_value
Definition serverbrowser.h:18
#define dbg_assert_failed(fmt,...)
Definition dbg.h:47
void mem_copy(void *dest, const void *source, size_t size)
Definition mem.cpp:6
int str_length(const char *str)
Definition str.cpp:40
void * IOHANDLE
Definition logger.h:12
std::unique_ptr< CHttpRequest > HttpGet(const char *pUrl)
Definition http.h:259
std::unique_ptr< CHttpRequest > HttpHead(const char *pUrl)
Definition http.h:252
std::unique_ptr< CHttpRequest > HttpPost(const char *pUrl, const unsigned char *pData, size_t DataLength)
Definition http.h:280
IPRESOLVE
Definition http.h:38
@ WHATEVER
Definition http.h:39
std::unique_ptr< CHttpRequest > HttpGetFile(const char *pUrl, IStorage *pStorage, const char *pOutputFile, int StorageType)
Definition http.h:264
void EscapeUrl(char *pBuf, int Size, const char *pStr)
Definition http.cpp:48
std::unique_ptr< CHttpRequest > HttpGetBoth(const char *pUrl, IStorage *pStorage, const char *pOutputFile, int StorageType)
Definition http.h:272
std::unique_ptr< CHttpRequest > HttpPostJson(const char *pUrl, const char *pJson)
Definition http.h:288
EHttpState
Definition http.h:22
@ DONE
Definition http.h:26
@ RUNNING
Definition http.h:25
@ ABORTED
Definition http.h:27
@ QUEUED
Definition http.h:24
@ ERROR
Definition http.h:23
bool HttpHasIpresolveBug()
Definition http.cpp:55
HTTPLOG
Definition http.h:31
@ FAILURE
Definition http.h:33
@ ALL
Definition http.h:34
@ NONE
Definition http.h:32
#define str_format
Definition system.cpp:2794
constexpr auto IO_MAX_PATH_LENGTH
Definition types.h:49