Loading src/http.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -667,6 +667,30 @@ libhttppp::HttpResponse libhttppp::HttpClient::GetStream(libhttppp::HttpRequest if (nreq.getRequestURL().empty()) nreq.setRequestURL(_url.getPath()); // HTTP/3 (QUIC) or HTTP/2: use full request, buffer response for streaming if (dynamic_cast<netplus::quic*>(_cltsock.get())) { auto data = _h3Request("GET", nreq); libhttppp::HttpResponse res; res.setContentLength(data.size()); _streamBuf = std::move(data); _streamBufPos = 0; _streamMode = STREAM_CONTENT_LENGTH; _streamRemaining = _streamBuf.size(); return res; } if (_isH2) { auto data = _h2Request("GET", nreq); libhttppp::HttpResponse res; res.setContentLength(data.size()); _streamBuf = std::move(data); _streamBufPos = 0; _streamMode = STREAM_CONTENT_LENGTH; _streamRemaining = _streamBuf.size(); return res; } // HTTP/1.x streaming path if (nreq.getRequestVersion().empty()) nreq.setRequestVersion(HTTPVERSION(1.1)); Loading src/http.h +13 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,8 @@ namespace libhttppp { const std::vector<char> *postBody = nullptr); // Streaming state enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF }; enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF, STREAM_H2, STREAM_H3 }; StreamMode _streamMode = STREAM_NONE; size_t _streamRemaining = 0; // bytes left for content-length mode std::vector<char> _streamBuf; // leftover data from header read Loading @@ -147,6 +148,17 @@ namespace libhttppp { bool _streamChunkDone = false; // true after final 0-length chunk size_t _streamChunkRemaining = 0; // bytes left in current chunk // HTTP/2 streaming state uint32_t _streamH2Sid = 0; // stream ID for active H2 stream bool _streamH2EndStream = false; std::vector<uint8_t> _streamH2Raw; // raw frame buffer // HTTP/3 streaming state uint64_t _streamH3Sid = 0; // stream ID for active H3 stream bool _streamH3EndStream = false; std::vector<uint8_t> _streamH3Raw; // raw frame buffer std::vector<char> _streamH3Body; // decoded DATA frames not yet consumed private: HttpUrl _url; std::unique_ptr<netplus::socket> _cltsock; Loading Loading
src/http.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -667,6 +667,30 @@ libhttppp::HttpResponse libhttppp::HttpClient::GetStream(libhttppp::HttpRequest if (nreq.getRequestURL().empty()) nreq.setRequestURL(_url.getPath()); // HTTP/3 (QUIC) or HTTP/2: use full request, buffer response for streaming if (dynamic_cast<netplus::quic*>(_cltsock.get())) { auto data = _h3Request("GET", nreq); libhttppp::HttpResponse res; res.setContentLength(data.size()); _streamBuf = std::move(data); _streamBufPos = 0; _streamMode = STREAM_CONTENT_LENGTH; _streamRemaining = _streamBuf.size(); return res; } if (_isH2) { auto data = _h2Request("GET", nreq); libhttppp::HttpResponse res; res.setContentLength(data.size()); _streamBuf = std::move(data); _streamBufPos = 0; _streamMode = STREAM_CONTENT_LENGTH; _streamRemaining = _streamBuf.size(); return res; } // HTTP/1.x streaming path if (nreq.getRequestVersion().empty()) nreq.setRequestVersion(HTTPVERSION(1.1)); Loading
src/http.h +13 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,8 @@ namespace libhttppp { const std::vector<char> *postBody = nullptr); // Streaming state enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF }; enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF, STREAM_H2, STREAM_H3 }; StreamMode _streamMode = STREAM_NONE; size_t _streamRemaining = 0; // bytes left for content-length mode std::vector<char> _streamBuf; // leftover data from header read Loading @@ -147,6 +148,17 @@ namespace libhttppp { bool _streamChunkDone = false; // true after final 0-length chunk size_t _streamChunkRemaining = 0; // bytes left in current chunk // HTTP/2 streaming state uint32_t _streamH2Sid = 0; // stream ID for active H2 stream bool _streamH2EndStream = false; std::vector<uint8_t> _streamH2Raw; // raw frame buffer // HTTP/3 streaming state uint64_t _streamH3Sid = 0; // stream ID for active H3 stream bool _streamH3EndStream = false; std::vector<uint8_t> _streamH3Raw; // raw frame buffer std::vector<char> _streamH3Body; // decoded DATA frames not yet consumed private: HttpUrl _url; std::unique_ptr<netplus::socket> _cltsock; Loading