Thoth
A functional, expressive, asynchronous C++26 webdev library
Loading...
Searching...
No Matches
Client.hpp
Go to the documentation of this file.
1#pragma once
2#include <Hermes/Socket/ClientSocket.hpp>
6
7#include <future>
8#include <chrono>
9#include <atomic>
10#include <mutex>
11
12namespace Thoth::Http {
13 template<MethodConcept Method, ResponseBodyConcept ResponseBody>
14 struct Response;
15
18 struct Socket {
19 // TODO: FUTURE: Implement HTTP2 and Quic
20 // using ClientSocketType = std::variant<Hermes::RawTcpClient, Hermes::RawDtlsClient>;
21 Hermes::RawTlsClient socket;
23
24 std::chrono::steady_clock::time_point lastUsed;
25 };
26
27
34
37
38 std::mutex poolMutex;
39
42 std::unordered_map<Hermes::IpEndpoint, std::vector<std::shared_ptr<Socket>>> connectionPool;
43 private:
44 std::atomic_bool _isRunning{ true };
47
48 std::jthread _janitorThread;
49 };
50
51
56
57 template<class T>
59
60 template<class F, class Body>
62 requires (F f, const ResponseHead& head){ { std::invoke(f, head) } -> std::same_as<std::expected<Body, RequestError>>; };
63
64 struct Client {
66 template<MethodConcept Method, BodyConcept Body>
67 requires std::default_initializable<Body>
68 static expected<Response<Method, Body>, RequestError> Send(Request<Method, Body> request);
69
71 template<MethodConcept Method, BodyConcept Body, class F>
73 static expected<Response<Method, Body>, RequestError> SendAndRecvInto(Request<Method, Body> request, F&& bodyFactory);
74
76 template<MethodConcept Method, RequestBodyConcept RequestBody, ResponseBodyConcept ResponseBody>
77 requires std::default_initializable<ResponseBody>
78 static expected<Response<Method, ResponseBody>, RequestError> SendAndRecvAs(Request<Method, RequestBody> request);
79
81 template<MethodConcept Method, RequestBodyConcept RequestBody, ResponseBodyConcept ResponseBody, class F>
83 static expected<Response<Method, ResponseBody>, RequestError> SendAndRecvAsInto(Request<Method, RequestBody> request, F&& bodyFactory);
84
86 static constexpr auto H_Send();
87
88 template<class F>
89 static auto H_SendAndRecvInto(F&& bodyFactory);
90
92 template<ResponseBodyConcept ResponseBody>
93 static constexpr auto H_SendAndRecvAs();
94
95 template<ResponseBodyConcept ResponseBody, class F>
97 static auto H_SendAndRecvAsInto(F&& bodyFactory);
98
99 using SocketPtr = std::shared_ptr<Socket>;
100
101 private:
102 // I will do it when... Idk
103 // template<MethodConcept Method, ResponseBodyConcept ResponseBody>
104 // static expected<std::pair<SocketPtr, Response<Method, ResponseBody>>, RequestError> _1RawSend(Request<Method> request);
105
106 template<MethodConcept Method, ResponseBodyConcept ResponseBody, class F>
108 static expected<std::pair<SocketPtr, Response<Method, ResponseBody>>, RequestError> P_ParseHttp11(SocketPtr infoPtr, F&& bodyFactory);
109
110 // template<MethodConcept Method, ResponseBodyConcept ResponseBody>
111 // static expected<std::pair<SocketPtr, Response<Method, ResponseBody>>, RequestError> request();
112 //
113 // template<MethodConcept Method>
114 // static expected<Response<Method>, RequestError> _3DlsSend(Request<Method> request);
115 // friend ClientJanitor;
116 };
117}
118
119#include <Thoth/Http/Client.tpp>
Class that transforms requests with a given method into their responses, monad friendly.
Definition Client.hpp:58
Definition Request.hpp:36
Definition Response.hpp:15
Definition Client.hpp:12
VersionEnum
Definition Request.hpp:11
Definition Client.hpp:64
static auto H_SendAndRecvAsInto(F &&bodyFactory)
static expected< Response< Method, ResponseBody >, RequestError > SendAndRecvAs(Request< Method, RequestBody > request)
Sends synced (thread blocking) requests.
std::shared_ptr< Socket > SocketPtr
Definition Client.hpp:99
static constexpr auto H_Send()
@hof{Send}
static expected< Response< Method, Body >, RequestError > SendAndRecvInto(Request< Method, Body > request, F &&bodyFactory)
Sends synced (thread blocking) requests.
static expected< Response< Method, Body >, RequestError > Send(Request< Method, Body > request)
Sends synced (thread blocking) requests.
static auto H_SendAndRecvInto(F &&bodyFactory)
static constexpr auto H_SendAndRecvAs()
@hof{SendAndGetAs}
static expected< Response< Method, ResponseBody >, RequestError > SendAndRecvAsInto(Request< Method, RequestBody > request, F &&bodyFactory)
Sends synced (thread blocking) requests.
The ClientJanitor stores all open Sockets in a pool to optimize consecutive calls....
Definition Client.hpp:33
std::unordered_map< Hermes::IpEndpoint, std::vector< std::shared_ptr< Socket > > > connectionPool
Group multiple sockets connected to the same endpoint. Before using it lock the poolMutex to not brea...
Definition Client.hpp:42
std::mutex poolMutex
Definition Client.hpp:38
static ClientJanitor & Instance()
Definition RequestError.hpp:71
Definition Request.hpp:41
Definition Response.hpp:26
structure that stores info about an open Socket, like the version, the type of socket and the last us...
Definition Client.hpp:18
Hermes::RawTlsClient socket
Definition Client.hpp:21
std::chrono::steady_clock::time_point lastUsed
Definition Client.hpp:24
VersionEnum version
Definition Client.hpp:22