93 void setTimeout(
int timeout_sec);
94 const std::vector<char> Get(
HttpRequest &nreq,
size_t maxTries=0);
95 const std::vector<char> Post(
HttpRequest &nreq,
const std::vector<char> &post,
size_t maxTries=0);
96 const std::vector<char> Put(
HttpRequest &nreq,
const std::vector<char> &put,
size_t maxTries=0);
97 const std::vector<char> Delete(
HttpRequest &nreq,
size_t maxTries=0);
105 size_t readBodyChunk(
char *buf,
size_t bufsize);
109 size_t readBodyChunkNonBlocking(
char *buf,
size_t bufsize);
112 bool isStreaming()
const;
117 bool waitReadable(
int timeout_ms);
121 static netplus::TlsSessionCache& tlsSessionCache();
123 void resetConnection();
124 void _ensureConnected();
125 bool tryHttp3First();
126 int readchunk(
const char *data,
int datasize,
int &pos);
129 size_t _recvBlocking(netplus::buffer &b,
int timeout_sec = 0);
131 size_t _recvNonBlocking(netplus::buffer &b);
132 void _sendAll(
const char *data,
size_t len);
133 void _sendAll(
const std::string &data);
136 std::vector<char> _h1ReadResponse(
const std::string &label);
140 bool _h2PrefaceSent =
false;
143 uint32_t _h2NextStreamId = 1;
144 std::unique_ptr<hpack::Decoder> _h2Decoder;
145 const std::vector<char> _h2Request(
const std::string &method,
147 const std::vector<char> *postBody =
nullptr);
148 const std::vector<char> _h3Request(
const std::string &method,
150 const std::vector<char> *postBody =
nullptr);
153 enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF,
154 STREAM_H2, STREAM_H3 };
155 StreamMode _streamMode = STREAM_NONE;
156 size_t _streamRemaining = 0;
157 std::vector<char> _streamBuf;
158 size_t _streamBufPos = 0;
160 bool _streamChunkDone =
false;
161 size_t _streamChunkRemaining = 0;
164 uint32_t _streamH2Sid = 0;
165 bool _streamH2EndStream =
false;
166 std::vector<uint8_t> _streamH2Raw;
169 uint64_t _streamH3Sid = 0;
170 bool _streamH3EndStream =
false;
171 std::vector<uint8_t> _streamH3Raw;
172 std::vector<char> _streamH3Body;
173 size_t _streamH3BodyPos = 0;
174 bool _streamH3InDataFrame =
false;
175 uint64_t _streamH3DataRemaining = 0;
179 std::unique_ptr<netplus::socket> _cltsock;
180 netplus::socketwait _sw;
181 netplus::x509cert _cert;
182 int _recvTimeoutSec = 60;
183 int _sendTimeoutSec = 30;
271 void setState(
const std ::string &httpstate);
272 void setContentType(
const std ::string &type);
273 void setContentLength(
size_t len);
274 void setConnection(
const std ::string &type);
275 void setTransferEncoding(
const std ::string &enc);
278 const std ::string &getState()
const;
279 int getStatusCode()
const;
280 const std ::string &getContentType()
const;
281 size_t getContentLength()
const;
282 const std ::string &getConnection()
const;
283 const std ::string &getVersion()
const;
286 size_t printHeader(std::vector<char> &buffer);
289 void send(netplus::con &curconnection,
const std::string &data,
int datalen=0);
290 void send(netplus::con &curconnection,
const unsigned char *data,
int datalen);
291 void send(netplus::con &curconnection,
const std::vector<char> &data,
int datalen=0);
294 size_t parse(
const char *in,
size_t inlen);
297 bool _storeResponseInfo(netplus::con &curconnection,
int datalen);
299 std::string _State=HTTP200;
300 std::string _Version;
306 mutable std::string _ContentTypeCache;
323 size_t parseH2(
const std::vector<hpack::HeaderField> &headers, uint32_t stream_id = 0);
324 size_t parseH3(
const std::vector<qpack::HeaderField> &headers);
326 void printHeader(std::string &buffer);
327 int getRequestType();
328 const std::string &getRequestURL();
329 const std::string &getRequest();
330 size_t getRequestLength();
331 const std::string &getRequestVersion();
332 const std::string &getHost();
333 size_t getContentLength();
334 size_t getMaxUploadSize();
340 void setRequestType(
int req);
341 void setRequestURL(
const std::string &url);
342 void setRequestVersion(
const std::string &version);
344 void setRequestData(
const std::string &data,
size_t len);
345 void setMaxUploadSize(
size_t upsize);
347 void send(
const HttpUrl &dest,std::unique_ptr<netplus::socket> &sock);
356 static std::string extractPath(
const std::string &target);
358 int _RequestType = PARSEREQUEST;
359 size_t _MaxUploadSize = DEFAULT_UPLOADSIZE;
363 mutable std::string _cachedRequestURL;
364 mutable std::string _cachedRequest;
365 mutable std::string _cachedRequestVersion;
366 mutable std::string _cachedHost;
372 int _httpProtocol = 0;
374 struct H2PendingResponse {
382 struct H2StreamingResponse {
383 uint32_t streamId = 0;
384 size_t contentLength = 0;
385 size_t totalSent = 0;
386 std::string pendingData;
387 size_t pendingOffset = 0;
388 std::unique_ptr<HttpRequest> tempreq;
391 size_t emptyCount = 0;
392 unsigned int backoffMs = 1;
393 bool finished =
false;
396 struct H2PendingIncoming {
397 std::vector<hpack::HeaderField> headers;
399 std::vector<uint8_t> rawHpack;
400 bool headersComplete =
false;
401 bool endStreamOnHeaders =
false;
402 bool streaming =
false;
406 uint32_t streamId = 0;
407 bool headersSent =
false;
408 bool serverPrefaceSent =
false;
409 size_t expectedContentLength = 0;
410 size_t bodyBytesSent = 0;
411 std::deque<H2PendingResponse> pendingResponses;
412 std::map<uint32_t, H2PendingIncoming> pendingIncoming;
415 int32_t peerConnWindow = 65535;
416 int32_t peerInitialStreamWindow = 65535;
417 size_t peerMaxFrameSize = 16384;
418 std::map<uint32_t, int32_t> peerStreamWindows;
420 std::map<uint32_t, std::shared_ptr<H2StreamingResponse>> activeStreams;
424 std::unique_ptr<H2State> _h2;
428 if (!_h2) _h2 = std::make_unique<H2State>();
451 std::vector<Header> headers;
452 std::vector<Disposition> dispositions;
453 std::vector<char> value;
468 const std::string &getContentType()
const {
return _contentType; }
469 const std::string &getBoundary()
const {
return _boundary; }
470 const std::vector<MultipartEntry> &multipartData()
const {
return _multipartEntries; }
471 const std::vector<UrlEntry> &urlData()
const {
return _urlEntries; }
474 static void urlDecode(
const std::string &in, std::string &out);
475 static void urlEncode(
const std::string &in, std::string &out);
478 void _parseMultipart(
const char *data,
size_t len);
479 void _parseMultiSection(
const char *data,
size_t len,
size_t start,
size_t end);
480 void _parseUrlDecode(
const char *data,
size_t len);
482 std::string _boundary;
483 std::string _contentType;
484 std::vector<MultipartEntry> _multipartEntries;
485 std::vector<UrlEntry> _urlEntries;