78 HttpEvent(std::vector<netplus::socket*> serversocket,
int timeout = 1000,
79 size_t h2OffloadThreads = 0,
int idleTimeoutSeconds = 0,
80 size_t h1OffloadThreads = 0,
size_t h2DispatchQueueMax = 0);
89 virtual bool shouldOffloadH2Dispatch(
HttpRequest &tempreq, uint32_t streamId)
const {
99 virtual bool shouldOffloadH1Dispatch(
HttpRequest &cureq)
const {
103 virtual void RequestEvent(
HttpRequest &curreq,
const int tid,ULONG_PTR args);
104 virtual void ResponseEvent(
HttpRequest &curreq,
const int tid,ULONG_PTR args);
105 virtual void ConnectEvent(
HttpRequest &curreq,
const int tid,ULONG_PTR args);
106 virtual void DisconnectEvent(
HttpRequest &curreq,
const int tid,ULONG_PTR args);
108 virtual bool Http2RequestEvent(netplus::con &curcon,
111 const std::string &alpn,
112 const netplus::ssl::FramingCallback &frame_cb);
113 virtual void Http3StreamEvent(netplus::socket *sock,
115 const std::vector<uint8_t> &data,
122 virtual bool onH2StreamHeaders(
HttpRequest &conn, uint32_t streamId,
123 const std::vector<hpack::HeaderField> &headers);
124 virtual bool onH3StreamHeaders(netplus::socket *sock, uint64_t streamId,
125 const std::vector<qpack::HeaderField> &headers);
129 virtual void onH2DataChunk(
HttpRequest &conn, uint32_t streamId,
130 const char *data,
size_t len,
bool endStream,
131 std::string &h2out,
const int tid, ULONG_PTR args);
132 virtual void onH3DataChunk(netplus::socket *sock, uint64_t streamId,
133 const char *data,
size_t len,
bool fin);
137 void sendH2StreamResponse(std::string &h2out, uint32_t streamId,
138 uint16_t status,
const std::string &contentType,
139 const std::string &body);
140 void sendH3StreamResponse(netplus::socket *sock, uint64_t streamId,
141 uint16_t status,
const std::string &contentType,
142 const std::string &body);
143 virtual void CreateConnection(std::shared_ptr<netplus::con> &res);
145 virtual void RequestEvent(netplus::con &curcon,
const int tid, ULONG_PTR args);
146 virtual void ResponseEvent(netplus::con &curcon,
const int tid,ULONG_PTR args);
147 virtual void ConnectEvent(netplus::con &curcon,
const int tid,ULONG_PTR args);
148 virtual void DisconnectEvent(netplus::con &curcon,
const int tid,ULONG_PTR args);
150 std::string _altSvcH3;
154 netplus::TlsSessionCache _tlsSessionCache;
158 struct H3StreamState {
159 std::vector<uint8_t> data;
160 bool headersParsed =
false;
161 bool streaming =
false;
162 size_t parseOffset = 0;
164 std::mutex _h3BufferMutex;
165 std::map<uint64_t, H3StreamState> _h3StreamStates;
166 std::atomic<int> _h3NextTid{0};
170 std::unique_ptr<netplus::ThreadPool> _h2DispatchPool;
174 std::unique_ptr<netplus::ThreadPool> _h1DispatchPool;
181 std::unique_ptr<netplus::ThreadPool> _h3StreamPool;
188 bool _dispatchH2Stream(
HttpRequest &cureq, std::string &out,
190 const std::vector<hpack::HeaderField> &decoded,
191 const std::string &reqBody,
192 const int tid, ULONG_PTR args);
217 void _dispatchH1Request(
HttpRequest &cureq,
size_t consumeBodyBytes,
218 const int tid, ULONG_PTR args);
225 void _finishH2Dispatch(
HttpRequest &cureq, std::string &out,
227 std::unique_ptr<HttpRequest> tempreq,
228 const int tid, ULONG_PTR args);
233 void _resumeH2Streams(
HttpRequest &cureq, std::string &out,
234 const int tid, ULONG_PTR args);
235 void _reapStalledH2Streams(
HttpRequest &cureq, std::string &out);
256 HttpD(
int argc,
char** argv);
257 HttpD(
const std::string &httpaddr,
int port,
int maxconnections,
const std::string &sslcertpath,
const std::string &sslkeypath,
const std::string &sslpassword =
"");
262 HttpD(
const std::string &httpaddr,
int port,
int maxconnections,
263 const std::map<std::string, netplus::ssl::CertificateBundle> &certsByHostname);
265 std::vector<netplus::socket*> getServerSockets();
268 bool reloadCertificates(
const std::string &certpath,
const std::string &keypath,
const std::string &password =
"");
272 bool reloadCertificate(
const std::string &hostname,
const std::string &certpath,
273 const std::string &keypath,
const std::string &password =
"");
279 std::vector<std::unique_ptr<netplus::socket>> _ServerSockets;
280 std::map<std::string, netplus::ssl::CertificateBundle> _certBundle;