94 void setTimeout(
int timeout_sec);
95 const std::vector<char> Get(
HttpRequest &nreq,
size_t maxTries=0);
96 const std::vector<char> Post(
HttpRequest &nreq,
const std::vector<char> &post,
size_t maxTries=0);
97 const std::vector<char> Put(
HttpRequest &nreq,
const std::vector<char> &put,
size_t maxTries=0);
98 const std::vector<char> Delete(
HttpRequest &nreq,
size_t maxTries=0);
106 size_t readBodyChunk(
char *buf,
size_t bufsize);
110 size_t readBodyChunkNonBlocking(
char *buf,
size_t bufsize);
113 bool isStreaming()
const;
118 bool waitReadable(
int timeout_ms);
122 static netplus::TlsSessionCache& tlsSessionCache();
124 void resetConnection();
125 void _ensureConnected();
126 bool tryHttp3First();
127 int readchunk(
const char *data,
int datasize,
int &pos);
130 size_t _recvBlocking(netplus::buffer &b,
int timeout_sec = 0);
132 size_t _recvNonBlocking(netplus::buffer &b);
133 void _sendAll(
const char *data,
size_t len);
134 void _sendAll(
const std::string &data);
137 std::vector<char> _h1ReadResponse(
const std::string &label);
141 bool _h2PrefaceSent =
false;
144 uint32_t _h2NextStreamId = 1;
145 std::unique_ptr<hpack::Decoder> _h2Decoder;
146 const std::vector<char> _h2Request(
const std::string &method,
148 const std::vector<char> *postBody =
nullptr);
149 const std::vector<char> _h3Request(
const std::string &method,
151 const std::vector<char> *postBody =
nullptr);
154 enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF,
155 STREAM_H2, STREAM_H3 };
156 StreamMode _streamMode = STREAM_NONE;
157 size_t _streamRemaining = 0;
158 std::vector<char> _streamBuf;
159 size_t _streamBufPos = 0;
161 bool _streamChunkDone =
false;
162 size_t _streamChunkRemaining = 0;
165 uint32_t _streamH2Sid = 0;
166 bool _streamH2EndStream =
false;
167 std::vector<uint8_t> _streamH2Raw;
170 uint64_t _streamH3Sid = 0;
171 bool _streamH3EndStream =
false;
172 std::vector<uint8_t> _streamH3Raw;
173 std::vector<char> _streamH3Body;
174 size_t _streamH3BodyPos = 0;
175 bool _streamH3InDataFrame =
false;
176 uint64_t _streamH3DataRemaining = 0;
180 std::unique_ptr<netplus::socket> _cltsock;
181 netplus::socketwait _sw;
182 netplus::x509cert _cert;
183 int _recvTimeoutSec = 60;
184 int _sendTimeoutSec = 30;
272 void setState(
const std ::string &httpstate);
273 void setContentType(
const std ::string &type);
274 void setContentLength(
size_t len);
275 void setConnection(
const std ::string &type);
276 void setTransferEncoding(
const std ::string &enc);
279 const std ::string &getState()
const;
280 int getStatusCode()
const;
281 const std ::string &getContentType()
const;
282 size_t getContentLength()
const;
283 const std ::string &getConnection()
const;
284 const std ::string &getVersion()
const;
287 size_t printHeader(std::vector<char> &buffer);
290 void send(netplus::con &curconnection,
const std::string &data,
int datalen=0);
291 void send(netplus::con &curconnection,
const unsigned char *data,
int datalen);
292 void send(netplus::con &curconnection,
const std::vector<char> &data,
int datalen=0);
295 size_t parse(
const char *in,
size_t inlen);
298 bool _storeResponseInfo(netplus::con &curconnection,
int datalen);
300 std::string _State=HTTP200;
301 std::string _Version;
307 mutable std::string _ContentTypeCache;
324 size_t parseH2(
const std::vector<hpack::HeaderField> &headers, uint32_t stream_id = 0);
325 size_t parseH3(
const std::vector<qpack::HeaderField> &headers);
327 void printHeader(std::string &buffer);
328 int getRequestType();
329 const std::string &getRequestURL();
330 const std::string &getRequest();
331 size_t getRequestLength();
332 const std::string &getRequestVersion();
333 const std::string &getHost();
334 size_t getContentLength();
335 size_t getMaxUploadSize();
341 void setRequestType(
int req);
342 void setRequestURL(
const std::string &url);
343 void setRequestVersion(
const std::string &version);
345 void setRequestData(
const std::string &data,
size_t len);
346 void setMaxUploadSize(
size_t upsize);
348 void send(
const HttpUrl &dest,std::unique_ptr<netplus::socket> &sock);
357 static std::string extractPath(
const std::string &target);
359 int _RequestType = PARSEREQUEST;
360 size_t _MaxUploadSize = DEFAULT_UPLOADSIZE;
364 mutable std::string _cachedRequestURL;
365 mutable std::string _cachedRequest;
366 mutable std::string _cachedRequestVersion;
367 mutable std::string _cachedHost;
373 int _httpProtocol = 0;
375 struct H2PendingResponse {
383 struct H2StreamingResponse {
384 uint32_t streamId = 0;
385 size_t contentLength = 0;
386 size_t totalSent = 0;
387 std::string pendingData;
388 size_t pendingOffset = 0;
389 std::unique_ptr<HttpRequest> tempreq;
392 size_t emptyCount = 0;
393 unsigned int backoffMs = 1;
394 bool finished =
false;
397 struct H2PendingIncoming {
398 std::vector<hpack::HeaderField> headers;
400 std::vector<uint8_t> rawHpack;
401 bool headersComplete =
false;
402 bool endStreamOnHeaders =
false;
403 bool streaming =
false;
407 uint32_t streamId = 0;
408 bool headersSent =
false;
409 bool serverPrefaceSent =
false;
410 size_t expectedContentLength = 0;
411 size_t bodyBytesSent = 0;
412 std::deque<H2PendingResponse> pendingResponses;
413 std::map<uint32_t, H2PendingIncoming> pendingIncoming;
416 int32_t peerConnWindow = 65535;
417 int32_t peerInitialStreamWindow = 65535;
418 size_t peerMaxFrameSize = 16384;
419 std::map<uint32_t, int32_t> peerStreamWindows;
421 std::map<uint32_t, std::shared_ptr<H2StreamingResponse>> activeStreams;
425 std::unique_ptr<H2State> _h2;
429 if (!_h2) _h2 = std::make_unique<H2State>();
452 std::vector<Header> headers;
453 std::vector<Disposition> dispositions;
454 std::vector<char> value;
469 const std::string &getContentType()
const {
return _contentType; }
470 const std::string &getBoundary()
const {
return _boundary; }
471 const std::vector<MultipartEntry> &multipartData()
const {
return _multipartEntries; }
472 const std::vector<UrlEntry> &urlData()
const {
return _urlEntries; }
475 static void urlDecode(
const std::string &in, std::string &out);
476 static void urlEncode(
const std::string &in, std::string &out);
479 void _parseMultipart(
const char *data,
size_t len);
480 void _parseMultiSection(
const char *data,
size_t len,
size_t start,
size_t end);
481 void _parseUrlDecode(
const char *data,
size_t len);
483 std::string _boundary;
484 std::string _contentType;
485 std::vector<MultipartEntry> _multipartEntries;
486 std::vector<UrlEntry> _urlEntries;